From b929716f7bbecae6db0f6768ae49bfd07ee4801b Mon Sep 17 00:00:00 2001
From: Matthias Urhahn <matthias.urhahn@sap.com>
Date: Thu, 26 Nov 2020 19:38:31 +0100
Subject: [PATCH] Update symptom cancellation card (EXPOSUREAPP-3747) (#1729)

* Update cancellation dialog.

* Remember selected date when returning.

* Adjust cancellation dialog strings.

* LINTs

Co-authored-by: Chilja Gossow <49635654+chiljamgossow@users.noreply.github.com>
---
 .../coronawarnapp/ui/calendar/CalendarView.kt | 15 +++----
 .../SubmissionSymptomCalendarFragment.kt      |  8 ++--
 .../SubmissionSymptomCalendarViewModel.kt     |  3 +-
 .../SubmissionSymptomIntroductionFragment.kt  | 43 +++++++++----------
 .../SubmissionSymptomIntroductionViewModel.kt | 10 ++++-
 .../src/main/res/values-de/strings.xml        |  4 +-
 .../submission/SubmissionServiceTest.kt       |  1 -
 .../storage/SubmissionRepositoryTest.kt       |  5 ++-
 8 files changed, 47 insertions(+), 42 deletions(-)

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/calendar/CalendarView.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/calendar/CalendarView.kt
index cb545f2fe..f953c70c0 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/calendar/CalendarView.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/calendar/CalendarView.kt
@@ -88,14 +88,13 @@ class CalendarView @JvmOverloads constructor(
         listener?.invoke(updateData.find { it.isSelected }?.date)
     }
 
-    /**
-     * Unset selection of each date shown
-     *
-     * @see CalendarAdapter.update
-     */
-    fun unsetSelection() {
-        val updateData = days.map { oldDay -> oldDay.copy(isSelected = false) }
-        updateSelection(false)
+    fun setSelectedDate(date: LocalDate?) {
+        val updateData = if (date != null) {
+            days.map { oldDay -> oldDay.copy(isSelected = oldDay.date == date) }
+        } else {
+            days.map { oldDay -> oldDay.copy(isSelected = false) }
+        }
+        updateSelection(date != null)
         adapter.update(updateData)
     }
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/symptoms/calendar/SubmissionSymptomCalendarFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/symptoms/calendar/SubmissionSymptomCalendarFragment.kt
index 2c1653eed..ceb33fc3a 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/symptoms/calendar/SubmissionSymptomCalendarFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/symptoms/calendar/SubmissionSymptomCalendarFragment.kt
@@ -58,10 +58,12 @@ class SubmissionSymptomCalendarFragment : Fragment(R.layout.fragment_submission_
         }
 
         viewModel.symptomStart.observe2(this) {
-            updateButtons(it)
-            if (it !is Symptoms.StartOf.Date) {
-                binding.symptomCalendarContainer.unsetSelection()
+            when (it) {
+                is Symptoms.StartOf.Date -> binding.symptomCalendarContainer.setSelectedDate(it.date)
+                else -> binding.symptomCalendarContainer.setSelectedDate(null)
             }
+
+            updateButtons(it)
         }
 
         binding.apply {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/symptoms/calendar/SubmissionSymptomCalendarViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/symptoms/calendar/SubmissionSymptomCalendarViewModel.kt
index e79975890..394a8b3fe 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/symptoms/calendar/SubmissionSymptomCalendarViewModel.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/symptoms/calendar/SubmissionSymptomCalendarViewModel.kt
@@ -19,8 +19,7 @@ class SubmissionSymptomCalendarViewModel @AssistedInject constructor(
 ) : CWAViewModel(dispatcherProvider = dispatcherProvider) {
 
     private val symptomStartInternal = MutableStateFlow<Symptoms.StartOf?>(null)
-    val symptomStart = symptomStartInternal
-        .asLiveData(context = dispatcherProvider.Default)
+    val symptomStart = symptomStartInternal.asLiveData()
 
     val routeToScreen: SingleLiveEvent<SubmissionNavigationEvents> = SingleLiveEvent()
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/symptoms/introduction/SubmissionSymptomIntroductionFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/symptoms/introduction/SubmissionSymptomIntroductionFragment.kt
index c2af32534..13e3ab1f7 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/symptoms/introduction/SubmissionSymptomIntroductionFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/symptoms/introduction/SubmissionSymptomIntroductionFragment.kt
@@ -1,5 +1,6 @@
 package de.rki.coronawarnapp.ui.submission.symptoms.introduction
 
+import android.app.AlertDialog
 import android.content.res.ColorStateList
 import android.os.Bundle
 import android.view.View
@@ -10,7 +11,6 @@ import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.databinding.FragmentSubmissionSymptomIntroBinding
 import de.rki.coronawarnapp.submission.Symptoms
 import de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionNavigationEvents
-import de.rki.coronawarnapp.util.DialogHelper
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.formatter.formatBackgroundButtonStyleByState
 import de.rki.coronawarnapp.util.formatter.formatButtonStyleByState
@@ -47,10 +47,17 @@ class SubmissionSymptomIntroductionFragment : Fragment(R.layout.fragment_submiss
                             it.symptoms
                         )
                 )
-                is SubmissionNavigationEvents.NavigateToTestResult -> handleSubmissionCancellation()
+                is SubmissionNavigationEvents.NavigateToTestResult -> doNavigate(
+                    SubmissionSymptomIntroductionFragmentDirections
+                        .actionSubmissionSymptomIntroductionFragmentToSubmissionResultFragment()
+                )
             }
         }
 
+        viewModel.showCancelDialog.observe2(this) {
+            showCancelDialog()
+        }
+
         viewModel.symptomIndication.observe2(this) {
             updateButtons(it)
         }
@@ -122,26 +129,16 @@ class SubmissionSymptomIntroductionFragment : Fragment(R.layout.fragment_submiss
             )
     }
 
-    /**
-     * Opens a Dialog that warns user
-     * when they're about to cancel the submission flow
-     */
-    private fun handleSubmissionCancellation() {
-        DialogHelper.showDialog(
-            DialogHelper.DialogInstance(
-                requireActivity(),
-                R.string.submission_error_dialog_confirm_cancellation_title,
-                R.string.submission_error_dialog_confirm_cancellation_body,
-                R.string.submission_error_dialog_confirm_cancellation_button_positive,
-                R.string.submission_error_dialog_confirm_cancellation_button_negative,
-                true,
-                {
-                    doNavigate(
-                        SubmissionSymptomIntroductionFragmentDirections
-                            .actionSubmissionSymptomIntroductionFragmentToSubmissionResultFragment()
-                    )
-                }
-            )
-        )
+    private fun showCancelDialog() {
+        AlertDialog.Builder(requireContext()).apply {
+            setTitle(R.string.submission_error_dialog_confirm_cancellation_title)
+            setMessage(R.string.submission_error_dialog_confirm_cancellation_body)
+            setPositiveButton(R.string.submission_error_dialog_confirm_cancellation_button_positive) { _, _ ->
+                viewModel.cancelSymptomSubmission()
+            }
+            setNegativeButton(R.string.submission_error_dialog_confirm_cancellation_button_negative) { _, _ ->
+                // NOOP
+            }
+        }.show()
     }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/symptoms/introduction/SubmissionSymptomIntroductionViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/symptoms/introduction/SubmissionSymptomIntroductionViewModel.kt
index 43f7550b4..d5b01524c 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/symptoms/introduction/SubmissionSymptomIntroductionViewModel.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/symptoms/introduction/SubmissionSymptomIntroductionViewModel.kt
@@ -10,6 +10,7 @@ import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
 import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.first
+import timber.log.Timber
 
 class SubmissionSymptomIntroductionViewModel @AssistedInject constructor(
     dispatcherProvider: DispatcherProvider
@@ -21,6 +22,8 @@ class SubmissionSymptomIntroductionViewModel @AssistedInject constructor(
 
     val routeToScreen: SingleLiveEvent<SubmissionNavigationEvents> = SingleLiveEvent()
 
+    val showCancelDialog = SingleLiveEvent<Unit>()
+
     fun onNextClicked() {
         launch {
             when (symptomIndicationInternal.first()) {
@@ -41,7 +44,7 @@ class SubmissionSymptomIntroductionViewModel @AssistedInject constructor(
     }
 
     fun onPreviousClicked() {
-        routeToScreen.postValue(SubmissionNavigationEvents.NavigateToTestResult)
+        showCancelDialog.postValue(Unit)
     }
 
     fun onPositiveSymptomIndication() {
@@ -56,6 +59,11 @@ class SubmissionSymptomIntroductionViewModel @AssistedInject constructor(
         symptomIndicationInternal.value = Symptoms.Indication.NO_INFORMATION
     }
 
+    fun cancelSymptomSubmission() {
+        Timber.d("Symptom submission was cancelled.")
+        routeToScreen.postValue(SubmissionNavigationEvents.NavigateToTestResult)
+    }
+
     @AssistedInject.Factory
     interface Factory : SimpleCWAViewModelFactory<SubmissionSymptomIntroductionViewModel>
 }
diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml
index c89492096..1477754f6 100644
--- a/Corona-Warn-App/src/main/res/values-de/strings.xml
+++ b/Corona-Warn-App/src/main/res/values-de/strings.xml
@@ -800,9 +800,9 @@
     <string name="submission_error_dialog_web_tan_redeemed_button_positive">"OK"</string>
 
     <!-- XHED: Dialog title for keys submission process cancellation -->
-    <string name="submission_error_dialog_confirm_cancellation_title">"Wollen Sie wirklich abbrechen?"</string>
+    <string name="submission_error_dialog_confirm_cancellation_title">"Wollen Sie die Symptom-Erfassung abbrechen?"</string>
     <!-- XMSG: Dialog body for keys submission process cancellation -->
-    <string name="submission_error_dialog_confirm_cancellation_body">"Ihre bisherigen Angaben werden nicht gespeichert."</string>
+    <string name="submission_error_dialog_confirm_cancellation_body">"Wenn Sie Angaben zu Ihren Symptomen machen, können Sie andere noch genauer warnen."</string>
     <!-- XBUT: Positive button for keys submission process cancellation -->
     <string name="submission_error_dialog_confirm_cancellation_button_positive">"Ja"</string>
     <!-- XBUT: Negative button for keys submission process cancellation -->
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/submission/SubmissionServiceTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/submission/SubmissionServiceTest.kt
index 8fb70df39..e56a9d2e0 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/submission/SubmissionServiceTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/submission/SubmissionServiceTest.kt
@@ -85,5 +85,4 @@ class SubmissionServiceTest {
             mockPlaybook.testResult(registrationToken)
         }
     }
-
 }
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/SubmissionRepositoryTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/SubmissionRepositoryTest.kt
index 9c84cd632..67d81ff5c 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/SubmissionRepositoryTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/SubmissionRepositoryTest.kt
@@ -62,9 +62,9 @@ class SubmissionRepositoryTest {
         every { LocalData.registrationToken(any()) } just Runs
         every { LocalData.devicePairingSuccessfulTimestamp(any()) } just Runs
 
-        every {submissionSettings.hasGivenConsent } returns mockFlowPreference(false)
+        every { submissionSettings.hasGivenConsent } returns mockFlowPreference(false)
 
-        val appScope =  AppCoroutineScope()
+        val appScope = AppCoroutineScope()
         submissionRepository = SubmissionRepository(submissionSettings, submissionService, appScope, TimeStamper())
     }
 
@@ -95,6 +95,7 @@ class SubmissionRepositoryTest {
             submissionRepository.updateTestResult(testResult)
         }
     }
+
     @Test
     fun registrationWithTeleTANSucceeds() {
         every { LocalData.teletan(any()) } just Runs
-- 
GitLab