diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenFragment.kt index e3611dff72dc346c554d939b1e395f8b8809bff1..4e9b879da02ad3a62b4cee7aafea01bfbd327ee0 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenFragment.kt @@ -7,7 +7,12 @@ import android.view.accessibility.AccessibilityEvent import androidx.fragment.app.Fragment import de.rki.coronawarnapp.R import de.rki.coronawarnapp.databinding.FragmentSubmissionTestResultConsentGivenBinding +import de.rki.coronawarnapp.exception.http.CwaClientError +import de.rki.coronawarnapp.exception.http.CwaServerError +import de.rki.coronawarnapp.exception.http.CwaWebException import de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionNavigationEvents +import de.rki.coronawarnapp.util.DialogHelper +import de.rki.coronawarnapp.util.NetworkRequestWrapper.Companion.withFailure import de.rki.coronawarnapp.util.di.AutoInject import de.rki.coronawarnapp.util.ui.doNavigate import de.rki.coronawarnapp.util.ui.observe2 @@ -23,9 +28,54 @@ class SubmissionTestResultConsentGivenFragment : Fragment(R.layout.fragment_subm private val binding: FragmentSubmissionTestResultConsentGivenBinding by viewBindingLazy() + private fun navigateToMainScreen() = + doNavigate( + SubmissionTestResultConsentGivenFragmentDirections.actionSubmissionTestResultConsentGivenFragmentToHomeFragment() + ) + + + private fun buildErrorDialog(exception: CwaWebException): DialogHelper.DialogInstance { + return when (exception) { + is CwaClientError, is CwaServerError -> DialogHelper.DialogInstance( + requireActivity(), + R.string.submission_error_dialog_web_generic_error_title, + getString( + R.string.submission_error_dialog_web_generic_network_error_body, + exception.statusCode + ), + R.string.submission_error_dialog_web_generic_error_button_positive, + null, + true, + ::navigateToMainScreen + ) + else -> DialogHelper.DialogInstance( + requireActivity(), + R.string.submission_error_dialog_web_generic_error_title, + R.string.submission_error_dialog_web_generic_error_body, + R.string.submission_error_dialog_web_generic_error_button_positive, + null, + true, + ::navigateToMainScreen + ) + } + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + viewModel.uiState.observe2(this) { + binding.uiState = it + with(binding) { + submissionTestResultSection + .setTestResultSection(uiState?.deviceUiState, uiState?.testResultReceivedDate) + } + it.deviceUiState.withFailure { + if (it is CwaWebException) { + DialogHelper.showDialog(buildErrorDialog(it)) + } + } + } + setButtonOnClickListener() viewModel.showCancelDialog.observe2(this) { @@ -36,13 +86,13 @@ class SubmissionTestResultConsentGivenFragment : Fragment(R.layout.fragment_subm when (it) { is SubmissionNavigationEvents.NavigateToSymptomIntroduction -> doNavigate( - SubmissionTestResultFragmentConsentGivenDirections - .actionSubmissionResultFragmentToSubmissionSymptomIntroductionFragment() + SubmissionTestResultConsentGivenFragmentDirections + .actionSubmissionTestResultConsentGivenFragmentToSubmissionSymptomIntroductionFragment() ) is SubmissionNavigationEvents.NavigateToMainActivity -> doNavigate( - SubmissionTestResultFragmentConsentGivenDirections - .actionSubmissionResultFragmentToSubmissionResultPositiveOtherWarningFragment() + SubmissionTestResultConsentGivenFragmentDirections + .actionSubmissionTestResultConsentGivenFragmentToHomeFragment() ) } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenViewModel.kt index ac8bcd93186fed812095f228a54cfd630688dcea..2b6db9268267805c59f28300df20d06117affd92 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenViewModel.kt @@ -1,13 +1,53 @@ package de.rki.coronawarnapp.ui.submission.testresult +import androidx.lifecycle.LiveData +import androidx.lifecycle.asLiveData import com.squareup.inject.assisted.AssistedInject +import de.rki.coronawarnapp.nearby.ENFClient +import de.rki.coronawarnapp.notification.TestResultNotificationService +import de.rki.coronawarnapp.storage.SubmissionRepository import de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionNavigationEvents +import de.rki.coronawarnapp.util.DeviceUIState +import de.rki.coronawarnapp.util.NetworkRequestWrapper.Companion.withSuccess +import de.rki.coronawarnapp.util.coroutine.DispatcherProvider import de.rki.coronawarnapp.util.ui.SingleLiveEvent import de.rki.coronawarnapp.util.viewmodel.CWAViewModel import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory +import kotlinx.coroutines.flow.combineTransform +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import timber.log.Timber -class SubmissionTestResultConsentGivenViewModel @AssistedInject constructor() : CWAViewModel() { +class SubmissionTestResultConsentGivenViewModel @AssistedInject constructor( + dispatcherProvider: DispatcherProvider, + private val submissionRepository: SubmissionRepository +) : CWAViewModel(dispatcherProvider = dispatcherProvider) { + + private val showRedeemedTokenWarning = SingleLiveEvent<Unit>() + private var wasRedeemedTokenErrorShown = false + private val tokenErrorMutex = Mutex() + + val uiState: LiveData<TestResultUIState> = combineTransform( + submissionRepository.deviceUIStateFlow, + submissionRepository.testResultReceivedDateFlow + ) { deviceUiState, resultDate -> + + tokenErrorMutex.withLock { + if (!wasRedeemedTokenErrorShown) { + deviceUiState.withSuccess { + if (it == DeviceUIState.PAIRED_REDEEMED) { + wasRedeemedTokenErrorShown = true + showRedeemedTokenWarning.postValue(Unit) + } + } + } + } + + TestResultUIState( + deviceUiState = deviceUiState, + testResultReceivedDate = resultDate + ).let { emit(it) } + }.asLiveData(context = dispatcherProvider.Default) val routeToScreen: SingleLiveEvent<SubmissionNavigationEvents> = SingleLiveEvent() diff --git a/Corona-Warn-App/src/main/res/navigation/nav_graph.xml b/Corona-Warn-App/src/main/res/navigation/nav_graph.xml index 6504b4320f74afcef0cf088db168861b14f5d35d..79905c44a608b0849ac5530887c3426bec918c0b 100644 --- a/Corona-Warn-App/src/main/res/navigation/nav_graph.xml +++ b/Corona-Warn-App/src/main/res/navigation/nav_graph.xml @@ -395,4 +395,16 @@ app:destination="@id/informationPrivacyFragment" /> </fragment> + <fragment + android:id="@+id/submissionTestResultConsentGivenFragment" + android:name="de.rki.coronawarnapp.ui.submission.testresult.SubmissionTestResultConsentGivenFragment" + android:label="SubmissionTestResultConsentFragment" > + <action + android:id="@+id/action_submissionTestResultConsentGivenFragment_to_homeFragment" + app:popUpTo="@id/mainFragment" + app:popUpToInclusive="false"/> + <action + android:id="@+id/action_submissionTestResultConsentGivenFragment_to_submissionSymptomIntroductionFragment" + app:destination="@id/submissionSymptomIntroductionFragment" /> + </fragment> </navigation>