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 cb545f2fe2f7b6602553e5c2bbb9fb0023b4eff6..f953c70c0c86c625a6dde1d62cd312ad5b2374b2 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 2c1653eedd26f0d6df583642e4edd1fbb6eb3263..ceb33fc3aa71426f3895efb6119877192b704760 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 e79975890a20c3d5572801fd7ecf5481f246e367..394a8b3fecf385c1c1eecbe5a03690c1be372336 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 c2af32534fb433369929cc714279aed588a3a4f1..13e3ab1f7e26879a99204f6945e603b703568fee 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 43f7550b426a28cfee0e10c8360906c685c4aaf2..d5b01524c5a62b01518be7f8198f92db48428a5f 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 c894920968915d134018281aef7669b48c800aba..1477754f6ade6f3a392076a97165ad3b5d973cc7 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 8fb70df39a3e8e5d75f6f97d9afcc775e1d42a3e..e56a9d2e0cc587c44462086143c161c7a904e5f8 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 9c84cd63221805d7a38b896167507e777c6ecace..67d81ff5cc319c27fb85005d4b9720b214325994 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