From 7b48c6d46077dade888db01f8c17c8b1b861bd8a Mon Sep 17 00:00:00 2001
From: Oliver Zimmerman <oezimmerman@gmail.com>
Date: Sun, 29 Nov 2020 14:45:01 +0000
Subject: [PATCH] Added UI State to ViewModel for TestResultSection formatting.
 Finalized fragment. Updated navigation

---
 ...ubmissionTestResultConsentGivenFragment.kt | 58 +++++++++++++++++--
 ...bmissionTestResultConsentGivenViewModel.kt | 42 +++++++++++++-
 .../src/main/res/navigation/nav_graph.xml     | 12 ++++
 3 files changed, 107 insertions(+), 5 deletions(-)

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 e3611dff7..4e9b879da 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 ac8bcd931..2b6db9268 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 6504b4320..79905c44a 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>
-- 
GitLab