From d1cfb5260178ecb7f6036915d13003b2c1c9f167 Mon Sep 17 00:00:00 2001
From: Chilja Gossow <49635654+chiljamgossow@users.noreply.github.com>
Date: Thu, 10 Jun 2021 12:47:42 +0200
Subject: [PATCH] Hot fix faq invalid vc (EXPOSUREAPP-7709) (#3400)

* add special dialog with link to faq

* move logic

Co-authored-by: Matthias Urhahn <matthias.urhahn@sap.com>
---
 .../InvalidHealthCertificateException.kt      | 34 ++++++++++++-------
 .../ui/scan/VaccinationQrCodeScanFragment.kt  |  7 ++++
 .../res/values-de/vaccination_strings.xml     |  8 +++--
 .../main/res/values/vaccination_strings.xml   |  6 +++-
 4 files changed, 40 insertions(+), 15 deletions(-)

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/InvalidHealthCertificateException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/InvalidHealthCertificateException.kt
index 700ab2ddc..39061747c 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/InvalidHealthCertificateException.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/InvalidHealthCertificateException.kt
@@ -48,20 +48,26 @@ class InvalidHealthCertificateException(
         VC_HC_CWT_NO_ISS("Issuer missing."),
     }
 
+    val showFaqButton: Boolean
+        get() = errorCode in codesVcInvalid
+
+    private val codesVcInvalid = listOf(
+        HC_BASE45_DECODING_FAILED,
+        HC_CBOR_DECODING_FAILED,
+        HC_COSE_MESSAGE_INVALID,
+        HC_ZLIB_DECOMPRESSION_FAILED,
+        HC_COSE_TAG_INVALID,
+        VC_PREFIX_INVALID,
+        VC_HC_CWT_NO_DGC,
+        VC_HC_CWT_NO_EXP,
+        VC_HC_CWT_NO_HCERT,
+        VC_HC_CWT_NO_ISS,
+        VC_JSON_SCHEMA_INVALID
+    )
+
     val errorMessage: LazyString
         get() = when (errorCode) {
-            HC_BASE45_DECODING_FAILED,
-            HC_CBOR_DECODING_FAILED,
-            HC_COSE_MESSAGE_INVALID,
-            HC_ZLIB_DECOMPRESSION_FAILED,
-            HC_COSE_TAG_INVALID,
-            VC_PREFIX_INVALID,
-            VC_HC_CWT_NO_DGC,
-            VC_HC_CWT_NO_EXP,
-            VC_HC_CWT_NO_HCERT,
-            VC_HC_CWT_NO_ISS,
-            VC_JSON_SCHEMA_INVALID,
-            -> CachedString { context ->
+            in codesVcInvalid -> CachedString { context ->
                 context.getString(ERROR_MESSAGE_VC_INVALID)
             }
             VC_NO_VACCINATION_ENTRY -> CachedString { context ->
@@ -76,6 +82,10 @@ class InvalidHealthCertificateException(
             VC_ALREADY_REGISTERED -> CachedString { context ->
                 context.getString(ERROR_MESSAGE_ALREADY_REGISTERED)
             }
+            // should never get here
+            else -> CachedString { context ->
+                context.getString(ERROR_MESSAGE_VC_INVALID)
+            }
         }
 
     override fun toHumanReadableError(context: Context): HumanReadableError {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/scan/VaccinationQrCodeScanFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/scan/VaccinationQrCodeScanFragment.kt
index 48a09d125..849b002be 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/scan/VaccinationQrCodeScanFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/scan/VaccinationQrCodeScanFragment.kt
@@ -12,6 +12,7 @@ import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.bugreporting.ui.toErrorDialogBuilder
 import de.rki.coronawarnapp.databinding.FragmentScanQrCodeBinding
 import de.rki.coronawarnapp.util.DialogHelper
+import de.rki.coronawarnapp.util.ExternalActionHelper.openUrl
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.permission.CameraPermissionHelper
 import de.rki.coronawarnapp.util.ui.doNavigate
@@ -19,6 +20,7 @@ import de.rki.coronawarnapp.util.ui.popBackStack
 import de.rki.coronawarnapp.util.ui.viewBinding
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
 import de.rki.coronawarnapp.util.viewmodel.cwaViewModels
+import de.rki.coronawarnapp.vaccination.core.certificate.InvalidHealthCertificateException
 import javax.inject.Inject
 
 class VaccinationQrCodeScanFragment :
@@ -67,6 +69,11 @@ class VaccinationQrCodeScanFragment :
             binding.qrCodeScanSpinner.hide()
             it.toErrorDialogBuilder(requireContext()).apply {
                 setOnDismissListener { popBackStack() }
+                if (it is InvalidHealthCertificateException && it.showFaqButton) {
+                    setNeutralButton(R.string.error_button_vc_faq) { _, _ ->
+                        openUrl(getString(R.string.error_button_vc_faq_link))
+                    }
+                }
             }.show()
         }
     }
diff --git a/Corona-Warn-App/src/main/res/values-de/vaccination_strings.xml b/Corona-Warn-App/src/main/res/values-de/vaccination_strings.xml
index 49995e3b2..c5c4922eb 100644
--- a/Corona-Warn-App/src/main/res/values-de/vaccination_strings.xml
+++ b/Corona-Warn-App/src/main/res/values-de/vaccination_strings.xml
@@ -85,7 +85,7 @@
     </plurals>
 
     <!-- XTXT: Vaccination QR code scan error message-->
-    <string name="error_vc_invalid">Dieser QR-Code ist kein gültiges Impfzertifikat.</string>
+    <string name="error_vc_invalid">Dieser QR-Code ist kein gültiges Impfzertifikat.\n\nWeitere Informationen zum Erhalt Ihres Impfzertifikats finden Sie in den FAQ.</string>
     <!-- XTXT: Vaccination QR code scan error message-->
     <string name="error_vc_not_yet_supported">Dieses Impfzertifikat wird in Ihrer App-Version noch nicht unterstützt. Bitte aktualisieren Sie Ihre App oder wenden Sie sich an die technische Hotline unter „App-Informationen“.</string>
     <!-- XTXT: Vaccination QR code scan error message-->
@@ -111,5 +111,9 @@
     <string name="vaccination_consent_onboarding_legal_information">"Weitere Hinweise finden Sie in der Datenschutzerklärung."</string>
     <!-- XBUT: Text for vaccination consent accept button -->
     <string name="vaccination_consent_accept_button">"Weiter"</string>
+    <!-- XBUT: Text for invalid vaccination certificate error button, linking to FAQ-->
+    <string name="error_button_vc_faq">FAQ zu Impfzertifikaten</string>
+    <!-- XTXT: Explains user about vaccination certificate: URL, has to be "translated" into english (relevant for all languages except german) - https://www.coronawarn.app/en/faq/#vac_cert_invalid -->
+    <string name="error_button_vc_faq_link">https://www.coronawarn.app/de/faq/#vac_cert_invalid</string>
 
-</resources>
\ No newline at end of file
+</resources>
diff --git a/Corona-Warn-App/src/main/res/values/vaccination_strings.xml b/Corona-Warn-App/src/main/res/values/vaccination_strings.xml
index 36b9bdc95..d990f3044 100644
--- a/Corona-Warn-App/src/main/res/values/vaccination_strings.xml
+++ b/Corona-Warn-App/src/main/res/values/vaccination_strings.xml
@@ -111,5 +111,9 @@
     <string name="vaccination_consent_onboarding_legal_information">"For more information, please refer to the privacy notice."</string>
     <!-- XBUT: Text for vaccination consent accept button -->
     <string name="vaccination_consent_accept_button">"Continue"</string>
+    <!-- XBUT: Text for invalid vaccination certificate error button, linking to FAQ-->
+    <string name="error_button_vc_faq">FAQ zu Impfzertifikaten</string>
+    <!-- XTXT: Explains user about vaccination certificate: URL, has to be "translated" into english (relevant for all languages except german) - https://www.coronawarn.app/en/faq/#vac_cert_invalid -->
+    <string name="error_button_vc_faq_link">https://www.coronawarn.app/en/faq/#vac_cert_invalid</string>
 
-</resources>
\ No newline at end of file
+</resources>
-- 
GitLab