diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/warnothers/SubmissionResultPositiveOtherWarningViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/warnothers/SubmissionResultPositiveOtherWarningViewModel.kt index 4a11a2ed4da149940286c01abacf67c6b3d8462b..6d8defa366dc9eb4731a8d77464b1be3778084cd 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/warnothers/SubmissionResultPositiveOtherWarningViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/warnothers/SubmissionResultPositiveOtherWarningViewModel.kt @@ -13,9 +13,7 @@ import de.rki.coronawarnapp.storage.interoperability.InteroperabilityRepository import de.rki.coronawarnapp.submission.SubmissionTask import de.rki.coronawarnapp.submission.Symptoms import de.rki.coronawarnapp.task.TaskController -import de.rki.coronawarnapp.task.TaskState 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.util.coroutine.DispatcherProvider import de.rki.coronawarnapp.util.ui.SingleLiveEvent @@ -24,6 +22,7 @@ import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory import kotlinx.coroutines.flow.combineTransform import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach import timber.log.Timber import java.util.UUID @@ -35,48 +34,35 @@ class SubmissionResultPositiveOtherWarningViewModel @AssistedInject constructor( interoperabilityRepository: InteroperabilityRepository, private val testResultNotificationService: TestResultNotificationService ) : CWAViewModel(dispatcherProvider = dispatcherProvider) { - private var currentSubmissionRequestId: UUID? = null + private val currentSubmission = taskController.tasks - .map { it.find { taskInfo -> taskInfo.taskState.type == SubmissionTask::class }?.taskState } - private val submissionState = currentSubmission - .map { taskState -> + .map { it.find { taskInfo -> taskInfo.taskState.request.id == currentSubmissionRequestId }?.taskState } + .onEach { + it?.let { when { - taskState == null -> ApiRequestState.IDLE - taskState.isFailed -> ApiRequestState.FAILED.also { updateUI(taskState) } - taskState.isFinished -> ApiRequestState.SUCCESS.also { updateUI(taskState) } - else -> ApiRequestState.STARTED + it.isFailed -> submissionError.postValue(it.error) + it.isSuccessful -> routeToScreen.postValue(SubmissionNavigationEvents.NavigateToSubmissionDone) } } - val submissionError = SingleLiveEvent<Throwable>() + } val uiState = combineTransform( - submissionState, - interoperabilityRepository.countryListFlow + currentSubmission, + interoperabilityRepository.countryListFlow ) { state, countries -> WarnOthersState( - apiRequestState = state, - countryList = countries + submitTaskState = state, + countryList = countries ).also { emit(it) } }.asLiveData(context = dispatcherProvider.Default) + val submissionError = SingleLiveEvent<Throwable>() val routeToScreen: SingleLiveEvent<SubmissionNavigationEvents> = SingleLiveEvent() val requestKeySharing = 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() { routeToScreen.postValue(SubmissionNavigationEvents.NavigateToTestResult) } @@ -104,10 +90,10 @@ class SubmissionResultPositiveOtherWarningViewModel @AssistedInject constructor( private fun submitDiagnosisKeys(keys: List<TemporaryExposureKey>) { Timber.d("submitDiagnosisKeys(keys=%s, symptoms=%s)", keys, symptoms) val registrationToken = - LocalData.registrationToken() ?: throw NoRegistrationTokenSetException() + LocalData.registrationToken() ?: throw NoRegistrationTokenSetException() val taskRequest = DefaultTaskRequest( - SubmissionTask::class, - SubmissionTask.Arguments(registrationToken, keys, symptoms) + SubmissionTask::class, + SubmissionTask.Arguments(registrationToken, keys, symptoms) ) currentSubmissionRequestId = taskRequest.id taskController.submit(taskRequest) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/warnothers/WarnOthersState.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/warnothers/WarnOthersState.kt index 33809f6b7780c42c014d3c0bfb0698deee4aab2b..e224181fb79770ca69535a7630325574f703a6d8 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/warnothers/WarnOthersState.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/warnothers/WarnOthersState.kt @@ -1,17 +1,16 @@ package de.rki.coronawarnapp.ui.submission.warnothers +import de.rki.coronawarnapp.task.TaskState import de.rki.coronawarnapp.ui.Country -import de.rki.coronawarnapp.ui.submission.ApiRequestState data class WarnOthersState( - val apiRequestState: ApiRequestState, + val submitTaskState: TaskState?, val countryList: List<Country> ) { fun isSubmitButtonEnabled(): Boolean = - apiRequestState == ApiRequestState.IDLE || apiRequestState == ApiRequestState.FAILED + submitTaskState == null || submitTaskState.isFailed - fun isSubmitSpinnerVisible(): Boolean { - return apiRequestState == ApiRequestState.STARTED - } + fun isSubmitSpinnerVisible(): Boolean = + submitTaskState != null && submitTaskState.isActive }