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