From df6462b3dc65cf0885653cba504f2af78acd986c Mon Sep 17 00:00:00 2001
From: Alex Paulescu <alex.paulescu@gmail.com>
Date: Wed, 26 May 2021 17:09:17 +0300
Subject: [PATCH] Invalid QR dialog wrong button functions (EXPOSUREAPP-7341)
 (#3253)

* OSD back button does same thing as cancel button.

* Make solution isolated

* Fix linting

* Simplified condition.

* Cancel function now works consistently with all invalid QR codes.

* Renamed function.

Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com>
Co-authored-by: Alexander Alferov <a.alferov@sap.com>
Co-authored-by: Juraj Kusnier <jurajkusnier@users.noreply.github.com>
Co-authored-by: Mohamed Metwalli <mohamed.metwalli@sap.com>
---
 .../scan/SubmissionQRCodeScanFragment.kt      | 46 +++++++------------
 .../de/rki/coronawarnapp/util/DialogHelper.kt | 16 +++++--
 2 files changed, 28 insertions(+), 34 deletions(-)

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/qrcode/scan/SubmissionQRCodeScanFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/qrcode/scan/SubmissionQRCodeScanFragment.kt
index f77d17f36..8f0a5a788 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/qrcode/scan/SubmissionQRCodeScanFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/qrcode/scan/SubmissionQRCodeScanFragment.kt
@@ -82,9 +82,13 @@ class SubmissionQRCodeScanFragment : Fragment(R.layout.fragment_submission_qr_co
 
         viewModel.qrCodeValidationState.observe2(this) {
             if (QrCodeRegistrationStateProcessor.ValidationState.INVALID == it) {
-                showInvalidScanDialog()
+                DialogHelper.showDialog(createInvalidScanDialog())
             }
         }
+
+        viewModel.registrationError.observe2(this) {
+            DialogHelper.showDialog(buildErrorDialog(it))
+        }
         viewModel.showRedeemedTokenWarning.observe2(this) {
             val dialog = DialogHelper.DialogInstance(
                 requireActivity(),
@@ -128,10 +132,6 @@ class SubmissionQRCodeScanFragment : Fragment(R.layout.fragment_submission_qr_co
                 }
             }.run { doNavigate(this) }
         }
-
-        viewModel.registrationError.observe2(this) {
-            DialogHelper.showDialog(buildErrorDialog(it))
-        }
     }
 
     private fun startDecode() {
@@ -142,16 +142,7 @@ class SubmissionQRCodeScanFragment : Fragment(R.layout.fragment_submission_qr_co
 
     private fun buildErrorDialog(exception: CwaWebException): DialogHelper.DialogInstance {
         return when (exception) {
-            is BadRequestException -> DialogHelper.DialogInstance(
-                requireActivity(),
-                R.string.submission_qr_code_scan_invalid_dialog_headline,
-                R.string.submission_qr_code_scan_invalid_dialog_body,
-                R.string.submission_qr_code_scan_invalid_dialog_button_positive,
-                R.string.submission_qr_code_scan_invalid_dialog_button_negative,
-                true,
-                { startDecode() },
-                ::navigateToDispatchScreen
-            )
+            is BadRequestException -> createInvalidScanDialog()
             is CwaClientError, is CwaServerError -> DialogHelper.DialogInstance(
                 requireActivity(),
                 R.string.submission_error_dialog_web_generic_error_title,
@@ -177,20 +168,17 @@ class SubmissionQRCodeScanFragment : Fragment(R.layout.fragment_submission_qr_co
         SubmissionQRCodeScanFragmentDirections.actionSubmissionQRCodeScanFragmentToSubmissionDispatcherFragment()
     )
 
-    private fun showInvalidScanDialog() {
-        val invalidScanDialogInstance = DialogHelper.DialogInstance(
-            requireActivity(),
-            R.string.submission_qr_code_scan_invalid_dialog_headline,
-            R.string.submission_qr_code_scan_invalid_dialog_body,
-            R.string.submission_qr_code_scan_invalid_dialog_button_positive,
-            R.string.submission_qr_code_scan_invalid_dialog_button_negative,
-            true,
-            ::startDecode,
-            ::navigateToDispatchScreen
-        )
-
-        DialogHelper.showDialog(invalidScanDialogInstance)
-    }
+    private fun createInvalidScanDialog() = DialogHelper.DialogInstance(
+        requireActivity(),
+        R.string.submission_qr_code_scan_invalid_dialog_headline,
+        R.string.submission_qr_code_scan_invalid_dialog_body,
+        R.string.submission_qr_code_scan_invalid_dialog_button_positive,
+        R.string.submission_qr_code_scan_invalid_dialog_button_negative,
+        true,
+        { startDecode() },
+        { viewModel.onBackPressed() },
+        { viewModel.onBackPressed() }
+    )
 
     override fun onRequestPermissionsResult(
         requestCode: Int,
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DialogHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DialogHelper.kt
index e8bdab771..8fb8629f2 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DialogHelper.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DialogHelper.kt
@@ -23,7 +23,8 @@ object DialogHelper {
         val cancelable: Boolean? = true,
         val isTextSelectable: Boolean = false,
         val positiveButtonFunction: () -> Unit? = {},
-        val negativeButtonFunction: () -> Unit? = {}
+        val negativeButtonFunction: () -> Unit? = {},
+        val cancelFunction: () -> Unit? = {}
     ) {
         constructor(
             context: Context,
@@ -33,7 +34,8 @@ object DialogHelper {
             negativeButton: Int? = null,
             cancelable: Boolean? = true,
             positiveButtonFunction: () -> Unit? = {},
-            negativeButtonFunction: () -> Unit? = {}
+            negativeButtonFunction: () -> Unit? = {},
+            cancelFunction: () -> Unit? = {}
         ) : this(
             context = context,
             title = context.resources.getString(title),
@@ -42,7 +44,8 @@ object DialogHelper {
             negativeButton = negativeButton?.let { context.resources.getString(it) },
             cancelable = cancelable,
             positiveButtonFunction = positiveButtonFunction,
-            negativeButtonFunction = negativeButtonFunction
+            negativeButtonFunction = negativeButtonFunction,
+            cancelFunction = cancelFunction
         )
 
         constructor(
@@ -53,7 +56,8 @@ object DialogHelper {
             negativeButton: Int? = null,
             cancelable: Boolean? = true,
             positiveButtonFunction: () -> Unit? = {},
-            negativeButtonFunction: () -> Unit? = {}
+            negativeButtonFunction: () -> Unit? = {},
+            cancelFunction: () -> Unit? = {}
         ) : this(
             context = context,
             title = context.resources.getString(title),
@@ -62,7 +66,8 @@ object DialogHelper {
             negativeButton = negativeButton?.let { context.resources.getString(it) },
             cancelable = cancelable,
             positiveButtonFunction = positiveButtonFunction,
-            negativeButtonFunction = negativeButtonFunction
+            negativeButtonFunction = negativeButtonFunction,
+            cancelFunction = cancelFunction
         )
     }
 
@@ -93,6 +98,7 @@ object DialogHelper {
                         dialogInstance.negativeButtonFunction()
                     }
                 }
+                setOnCancelListener { dialogInstance.cancelFunction() }
             }
             builder.create()
         }
-- 
GitLab