Skip to content
Snippets Groups Projects
Commit 2d1c86ef authored by Kolya Opahle's avatar Kolya Opahle
Browse files

Refactoring of SubmissionResultPositiveOtherWarningViewModel, getting rid of ApiRequestState

parent f55f14bf
No related branches found
No related tags found
No related merge requests found
...@@ -13,9 +13,7 @@ import de.rki.coronawarnapp.storage.interoperability.InteroperabilityRepository ...@@ -13,9 +13,7 @@ import de.rki.coronawarnapp.storage.interoperability.InteroperabilityRepository
import de.rki.coronawarnapp.submission.SubmissionTask import de.rki.coronawarnapp.submission.SubmissionTask
import de.rki.coronawarnapp.submission.Symptoms import de.rki.coronawarnapp.submission.Symptoms
import de.rki.coronawarnapp.task.TaskController import de.rki.coronawarnapp.task.TaskController
import de.rki.coronawarnapp.task.TaskState
import de.rki.coronawarnapp.task.common.DefaultTaskRequest import de.rki.coronawarnapp.task.common.DefaultTaskRequest
import de.rki.coronawarnapp.ui.submission.ApiRequestState
import de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionNavigationEvents import de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionNavigationEvents
import de.rki.coronawarnapp.util.coroutine.DispatcherProvider import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
import de.rki.coronawarnapp.util.ui.SingleLiveEvent import de.rki.coronawarnapp.util.ui.SingleLiveEvent
...@@ -24,6 +22,7 @@ import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory ...@@ -24,6 +22,7 @@ import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory
import kotlinx.coroutines.flow.combineTransform import kotlinx.coroutines.flow.combineTransform
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach
import timber.log.Timber import timber.log.Timber
import java.util.UUID import java.util.UUID
...@@ -35,48 +34,35 @@ class SubmissionResultPositiveOtherWarningViewModel @AssistedInject constructor( ...@@ -35,48 +34,35 @@ class SubmissionResultPositiveOtherWarningViewModel @AssistedInject constructor(
interoperabilityRepository: InteroperabilityRepository, interoperabilityRepository: InteroperabilityRepository,
private val testResultNotificationService: TestResultNotificationService private val testResultNotificationService: TestResultNotificationService
) : CWAViewModel(dispatcherProvider = dispatcherProvider) { ) : CWAViewModel(dispatcherProvider = dispatcherProvider) {
private var currentSubmissionRequestId: UUID? = null private var currentSubmissionRequestId: UUID? = null
private val currentSubmission = taskController.tasks private val currentSubmission = taskController.tasks
.map { it.find { taskInfo -> taskInfo.taskState.type == SubmissionTask::class }?.taskState } .map { it.find { taskInfo -> taskInfo.taskState.request.id == currentSubmissionRequestId }?.taskState }
private val submissionState = currentSubmission .onEach {
.map { taskState -> it?.let {
when { when {
taskState == null -> ApiRequestState.IDLE it.isFailed -> submissionError.postValue(it.error)
taskState.isFailed -> ApiRequestState.FAILED.also { updateUI(taskState) } it.isSuccessful -> routeToScreen.postValue(SubmissionNavigationEvents.NavigateToSubmissionDone)
taskState.isFinished -> ApiRequestState.SUCCESS.also { updateUI(taskState) }
else -> ApiRequestState.STARTED
} }
} }
val submissionError = SingleLiveEvent<Throwable>() }
val uiState = combineTransform( val uiState = combineTransform(
submissionState, currentSubmission,
interoperabilityRepository.countryListFlow interoperabilityRepository.countryListFlow
) { state, countries -> ) { state, countries ->
WarnOthersState( WarnOthersState(
apiRequestState = state, submitTaskState = state,
countryList = countries countryList = countries
).also { emit(it) } ).also { emit(it) }
}.asLiveData(context = dispatcherProvider.Default) }.asLiveData(context = dispatcherProvider.Default)
val submissionError = SingleLiveEvent<Throwable>()
val routeToScreen: SingleLiveEvent<SubmissionNavigationEvents> = SingleLiveEvent() val routeToScreen: SingleLiveEvent<SubmissionNavigationEvents> = SingleLiveEvent()
val requestKeySharing = SingleLiveEvent<Unit>() val requestKeySharing = SingleLiveEvent<Unit>()
val showEnableTracingEvent = SingleLiveEvent<Unit>() val showEnableTracingEvent = SingleLiveEvent<Unit>()
private fun updateUI(taskState: TaskState) {
if (taskState.request.id == currentSubmissionRequestId) {
currentSubmissionRequestId = null
when {
taskState.isFailed ->
submissionError.postValue(taskState.error ?: return)
taskState.isSuccessful ->
routeToScreen.postValue(SubmissionNavigationEvents.NavigateToSubmissionDone)
}
}
}
fun onBackPressed() { fun onBackPressed() {
routeToScreen.postValue(SubmissionNavigationEvents.NavigateToTestResult) routeToScreen.postValue(SubmissionNavigationEvents.NavigateToTestResult)
} }
...@@ -104,10 +90,10 @@ class SubmissionResultPositiveOtherWarningViewModel @AssistedInject constructor( ...@@ -104,10 +90,10 @@ class SubmissionResultPositiveOtherWarningViewModel @AssistedInject constructor(
private fun submitDiagnosisKeys(keys: List<TemporaryExposureKey>) { private fun submitDiagnosisKeys(keys: List<TemporaryExposureKey>) {
Timber.d("submitDiagnosisKeys(keys=%s, symptoms=%s)", keys, symptoms) Timber.d("submitDiagnosisKeys(keys=%s, symptoms=%s)", keys, symptoms)
val registrationToken = val registrationToken =
LocalData.registrationToken() ?: throw NoRegistrationTokenSetException() LocalData.registrationToken() ?: throw NoRegistrationTokenSetException()
val taskRequest = DefaultTaskRequest( val taskRequest = DefaultTaskRequest(
SubmissionTask::class, SubmissionTask::class,
SubmissionTask.Arguments(registrationToken, keys, symptoms) SubmissionTask.Arguments(registrationToken, keys, symptoms)
) )
currentSubmissionRequestId = taskRequest.id currentSubmissionRequestId = taskRequest.id
taskController.submit(taskRequest) taskController.submit(taskRequest)
......
package de.rki.coronawarnapp.ui.submission.warnothers package de.rki.coronawarnapp.ui.submission.warnothers
import de.rki.coronawarnapp.task.TaskState
import de.rki.coronawarnapp.ui.Country import de.rki.coronawarnapp.ui.Country
import de.rki.coronawarnapp.ui.submission.ApiRequestState
data class WarnOthersState( data class WarnOthersState(
val apiRequestState: ApiRequestState, val submitTaskState: TaskState?,
val countryList: List<Country> val countryList: List<Country>
) { ) {
fun isSubmitButtonEnabled(): Boolean = fun isSubmitButtonEnabled(): Boolean =
apiRequestState == ApiRequestState.IDLE || apiRequestState == ApiRequestState.FAILED submitTaskState == null || submitTaskState.isFailed
fun isSubmitSpinnerVisible(): Boolean { fun isSubmitSpinnerVisible(): Boolean =
return apiRequestState == ApiRequestState.STARTED submitTaskState != null && submitTaskState.isActive
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment