diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/core/TestCertificateRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/core/TestCertificateRepository.kt index ad3e5707f4b2ddb6c9985776646ddc7126b946bb..ed383c7d1fa83bb75448b86cb217054caeea4445 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/core/TestCertificateRepository.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/core/TestCertificateRepository.kt @@ -167,7 +167,7 @@ class TestCertificateRepository @Inject constructor( mutate { toRefresh.forEach { workedOnIds.add(it.identifier) - this[it.identifier] = it.copy(isUpdatingData = false) + this[it.identifier] = it.copy(isUpdatingData = true) } } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesFragment.kt index 228d1e33330e32f43149bf98cb3a90e962fb6aeb..96263715b079593f273d3a19bddbcd80c0d736a2 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesFragment.kt @@ -9,6 +9,7 @@ import androidx.recyclerview.widget.DefaultItemAnimator import de.rki.coronawarnapp.R import de.rki.coronawarnapp.covidcertificate.vaccination.ui.list.VaccinationListFragment import de.rki.coronawarnapp.databinding.FragmentCertificatesBinding +import de.rki.coronawarnapp.util.DialogHelper import de.rki.coronawarnapp.util.di.AutoInject import de.rki.coronawarnapp.util.lists.decorations.TopBottomPaddingDecorator import de.rki.coronawarnapp.util.lists.diffutil.update @@ -56,6 +57,30 @@ class CertificatesFragment : Fragment(R.layout.fragment_certificates), AutoInjec .actionCertificatesFragmentToCovidCertificateDetailsFragment(event.identifier) ) } + is CertificatesFragmentEvents.ShowRefreshErrorCertificateDialog -> { + val dialog = DialogHelper.DialogInstance( + context = requireContext(), + title = R.string.test_certificate_refresh_dialog_title, + message = event.error.localizedMessage, + positiveButton = R.string.test_certificate_refresh_dialog_confirm_button, + cancelable = false + ) + DialogHelper.showDialog(dialog) + } + is CertificatesFragmentEvents.ShowDeleteErrorCertificateDialog -> { + val dialog = DialogHelper.DialogInstance( + context = requireContext(), + title = R.string.test_certificate_delete_dialog_title, + message = R.string.test_certificate_delete_dialog_body, + positiveButton = R.string.test_certificate_delete_dialog_confirm_button, + negativeButton = R.string.test_certificate_delete_dialog_cancel_button, + cancelable = false, + positiveButtonFunction = { + viewModel.deleteTestCertificate(event.identifier) + } + ) + DialogHelper.showDialog(dialog) + } } } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesFragmentEvents.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesFragmentEvents.kt index af40e9f704570011c894891a0ed85c4ce6b091fb..259f0feb5c669db1f99a271c1ffc7d11a7869061 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesFragmentEvents.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesFragmentEvents.kt @@ -1,5 +1,7 @@ package de.rki.coronawarnapp.covidcertificate.test.ui +import de.rki.coronawarnapp.covidcertificate.test.core.storage.TestCertificateIdentifier + sealed class CertificatesFragmentEvents { data class OpenVaccinationRegistrationGraph(val registrationAcknowledged: Boolean) : CertificatesFragmentEvents() @@ -7,4 +9,9 @@ sealed class CertificatesFragmentEvents { data class GoToVaccinationList(val personIdentifierCodeSha256: String) : CertificatesFragmentEvents() data class GoToCovidCertificateDetailScreen(val identifier: String) : CertificatesFragmentEvents() + + data class ShowRefreshErrorCertificateDialog(val error: Exception) : CertificatesFragmentEvents() + + data class ShowDeleteErrorCertificateDialog(val identifier: TestCertificateIdentifier) : + CertificatesFragmentEvents() } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesViewModel.kt index 33a26b263fe19f09009c279ce5b0dcdbcd0b3d86..374c269b475ecea16b6f5fe41bc4f6896b73937e 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesViewModel.kt @@ -33,7 +33,16 @@ class CertificatesViewModel @AssistedInject constructor( private fun refreshTestCertificate(identifier: TestCertificateIdentifier) { launch { - testCertificateRepository.refresh(identifier) + val error = testCertificateRepository.refresh(identifier).mapNotNull { it.error }.singleOrNull() + if (error != null) { + events.postValue(CertificatesFragmentEvents.ShowRefreshErrorCertificateDialog(error)) + } + } + } + + fun deleteTestCertificate(identifier: TestCertificateIdentifier) { + launch { + testCertificateRepository.deleteCertificate(identifier) } } @@ -90,8 +99,16 @@ class CertificatesViewModel @AssistedInject constructor( if (certificate.isCertificateRetrievalPending) { CovidTestCertificateErrorCard.Item( testDate = certificate.registeredAt, - onClickAction = { + isUpdatingData = certificate.isUpdatingData, + onRetryAction = { refreshTestCertificate(certificate.identifier) + }, + onDeleteAction = { + events.postValue( + CertificatesFragmentEvents.ShowDeleteErrorCertificateDialog( + certificate.identifier + ) + ) } ) } else { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/cards/CovidTestCertificateErrorCard.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/cards/CovidTestCertificateErrorCard.kt index 2b67415637fb9ce4103f873902807b72a9dece95..3377a129fe47ba8d15b4ac6677af453871b3e028 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/cards/CovidTestCertificateErrorCard.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/cards/CovidTestCertificateErrorCard.kt @@ -1,6 +1,8 @@ package de.rki.coronawarnapp.covidcertificate.test.ui.cards import android.view.ViewGroup +import androidx.core.view.isGone +import androidx.core.view.isInvisible import de.rki.coronawarnapp.R import de.rki.coronawarnapp.covidcertificate.test.ui.CertificatesAdapter import de.rki.coronawarnapp.databinding.CovidTestErrorCardBinding @@ -30,12 +32,31 @@ class CovidTestCertificateErrorCard(parent: ViewGroup) : item.testDate.toShortTimeFormat(), ) - retryButton.setOnClickListener { item.onClickAction(item) } + retryButton.setOnClickListener { + item.onRetryAction(item) + } + + if (item.isUpdatingData) { + refreshStatus.isGone = false + progressBar.show() + retryButton.isInvisible = true + deleteButton.isInvisible = true + body.text = context.getString(R.string.test_certificate_error_label_refreshing) + } else { + refreshStatus.isGone = true + progressBar.hide() + retryButton.isInvisible = false + deleteButton.isInvisible = false + body.text = context.getString(R.string.test_certificate_error_label) + } + deleteButton.setOnClickListener { item.onDeleteAction(item) } } data class Item( override val testDate: Instant, - val onClickAction: (Item) -> Unit, + val onRetryAction: (Item) -> Unit, + val onDeleteAction: (Item) -> Unit, + val isUpdatingData: Boolean, ) : CovidCertificateTestItem, HasPayloadDiffer { override fun diffPayload(old: Any, new: Any): Any? = if (old::class == new::class) new else null } diff --git a/Corona-Warn-App/src/main/res/layout/covid_test_error_card.xml b/Corona-Warn-App/src/main/res/layout/covid_test_error_card.xml index 4e38c7504b0bb09ea6ef1fba7e02777533a2b7c3..d71d688299aaac25ba702daa4ca0ec8ee1ccb976 100644 --- a/Corona-Warn-App/src/main/res/layout/covid_test_error_card.xml +++ b/Corona-Warn-App/src/main/res/layout/covid_test_error_card.xml @@ -63,6 +63,38 @@ app:layout_constraintTop_toBottomOf="@id/body" tools:text="Test durchgeführt am 12.04.21, 18:01 Uhr " /> + <com.google.android.material.progressindicator.CircularProgressIndicator + android:id="@+id/progress_bar" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/card_padding" + android:layout_marginTop="@dimen/spacing_small" + android:layout_marginEnd="@dimen/card_padding" + android:layout_marginBottom="@dimen/spacing_small" + android:indeterminate="true" + android:visibility="gone" + app:indicatorColor="@color/colorAccent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/test_time" + app:layout_constraintBottom_toBottomOf="parent" + app:showAnimationBehavior="inward" + app:trackColor="@android:color/transparent" /> + + <TextView + android:id="@+id/refresh_status" + style="@style/body2" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/spacing_small" + android:layout_marginEnd="@dimen/card_padding" + android:focusable="false" + android:visibility="gone" + android:text="@string/test_certificate_error_refreshing_status" + app:layout_constraintStart_toEndOf="@id/progress_bar" + app:layout_constraintTop_toTopOf="@id/progress_bar" + app:layout_constraintEnd_toEndOf="parent" + tools:text="@string/test_certificate_error_refreshing_status" /> + <com.google.android.material.button.MaterialButton android:id="@+id/retry_button" style="@style/Widget.MaterialComponents.Button.OutlinedButton" @@ -74,9 +106,24 @@ android:layout_marginBottom="@dimen/spacing_small" android:text="@string/test_certificate_error_retry_button" android:textColor="@color/colorAccent" - app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/test_time" app:strokeColor="@color/colorAccent" /> + <Button + android:id="@+id/delete_button" + style="@style/buttonLight" + android:backgroundTint="@color/button_main_tracing" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/card_padding" + android:layout_marginEnd="@dimen/card_padding" + android:layout_marginBottom="@dimen/spacing_small" + android:text="@string/test_certificate_error_delete_button" + android:textColor="@color/colorAccent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/retry_button" + app:strokeColor="@color/colorAccent" /> + </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/values-de/green_certificate_strings.xml b/Corona-Warn-App/src/main/res/values-de/green_certificate_strings.xml index 40baf5b79178b8f2ce0459db4ec35fb7c0331fb0..5303812669a2119eec01b5ee3dd9c82c91655de1 100644 --- a/Corona-Warn-App/src/main/res/values-de/green_certificate_strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/green_certificate_strings.xml @@ -82,4 +82,22 @@ <string name="error_tc_client_error_call_hotline">Ein Fehler ist aufgetreten. Bitte versuchen Sie es später noch einmal oder kontaktieren Sie die technische Hotline über App-Informationen -> Technische Hotline.</string> <!-- XTXT: Error text --> <string name="error_tc_dcc_expired">Das Zertifikat ist nicht mehr aktuell, Sie können es aus der Corona-App entfernen.</string> + <!-- XBUT: Test error delete button --> + <string name="test_certificate_error_delete_button">Testzertifikat entfernen</string> + <!-- XTXT: Test error refresh dialog title --> + <string name="test_certificate_refresh_dialog_title">"Es gibt weiterhin Probleme bei der Abfrage"</string> + <!-- XBUT: Test error refresh dialog confirm button --> + <string name="test_certificate_refresh_dialog_confirm_button">"OK"</string> + <!-- XTXT: Test error delete dialog title --> + <string name="test_certificate_delete_dialog_title">"Wollen Sie das Zertifikat wirklich entfernen?"</string> + <!-- XTXT: Test error delete dialog body --> + <string name="test_certificate_delete_dialog_body">"Wenn das Zertifikat enfernt wird, kann es nicht noch einmal angefordert werden."</string> + <!-- XBUT: Test error delete dialog confirm button --> + <string name="test_certificate_delete_dialog_confirm_button">"Entfernen"</string> + <!-- XBUT: Test error delete dialog cancel button --> + <string name="test_certificate_delete_dialog_cancel_button">"Abbrechen"</string> + <!-- XTXT: Test error card body refreshing --> + <string name="test_certificate_error_label_refreshing">"Ihr Zertifikat wird gerade erstellt…"</string> + <!-- XTXT: Test error card body refreshing --> + <string name="test_certificate_error_refreshing_status">"Ihr Zertifikat wird gerade angefragt, dies kann einige Minuten dauern…"</string> </resources> diff --git a/Corona-Warn-App/src/main/res/values/green_certificate_strings.xml b/Corona-Warn-App/src/main/res/values/green_certificate_strings.xml index f38e7b47e394504f1e51149ccd550e9be922d874..ece39a2784ecdbf679e5cbfca640fee0a8a12d3d 100644 --- a/Corona-Warn-App/src/main/res/values/green_certificate_strings.xml +++ b/Corona-Warn-App/src/main/res/values/green_certificate_strings.xml @@ -81,4 +81,22 @@ <string name="error_tc_client_error_call_hotline">Ein Fehler ist aufgetreten. Bitte versuchen Sie es später noch einmal oder kontaktieren Sie die technische Hotline über App-Informationen -> Technische Hotline.></string> <!-- XTXT: Error text --> <string name="error_tc_dcc_expired">Das Zertifikat ist nicht mehr aktuell, Sie können es aus der Corona-App entfernen.</string> + <!-- XBUT: Test error delete button --> + <string name="test_certificate_error_delete_button">Testzertifikat entfernen</string> + <!-- XTXT: Test error refresh dialog title --> + <string name="test_certificate_refresh_dialog_title">"Es gibt weiterhin Probleme bei der Abfrage"</string> + <!-- XBUT: Test error refresh dialog confirm button --> + <string name="test_certificate_refresh_dialog_confirm_button">"OK"</string> + <!-- XTXT: Test error delete dialog title --> + <string name="test_certificate_delete_dialog_title">"Wollen Sie das Zertifikat wirklich entfernen?"</string> + <!-- XTXT: Test error delete dialog body --> + <string name="test_certificate_delete_dialog_body">"Wenn das Zertifikat enfernt wird, kann es nicht noch einmal angefordert werden."</string> + <!-- XBUT: Test error delete dialog confirm button --> + <string name="test_certificate_delete_dialog_confirm_button">"Entfernen"</string> + <!-- XBUT: Test error delete dialog cancel button --> + <string name="test_certificate_delete_dialog_cancel_button">"Abbrechen"</string> + <!-- XTXT: Test error card body refreshing --> + <string name="test_certificate_error_label_refreshing">"Ihr Zertifikat wird gerade erstellt…"</string> + <!-- XTXT: Test error card body refreshing --> + <string name="test_certificate_error_refreshing_status">"Ihr Zertifikat wird gerade angefragt, dies kann einige Minuten dauern…"</string> </resources>