From e7c26e2732e666d8739751a49eeb8381f928dcc5 Mon Sep 17 00:00:00 2001
From: Kolya Opahle <k.opahle@sap.com>
Date: Wed, 10 Jun 2020 17:15:31 +0200
Subject: [PATCH] Loading indicators for registration requests (#318)

* Added loading spinners to QR Code and TAN fragments

* Added handling for error state produced by TransactionExceptions

* Added spinner to other warning fragment

Co-authored-by: Hee Tatt Ooi <hee.tatt.ooi@sap.com>
Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com>
---
 .../ui/submission/SubmissionQRCodeScanFragment.kt  |  5 +++++
 ...SubmissionResultPositiveOtherWarningFragment.kt | 14 ++++++++++++++
 .../ui/submission/SubmissionTanFragment.kt         |  5 +++++
 .../ui/viewmodel/SubmissionViewModel.kt            |  9 +++++++++
 .../fragment_submission_positive_other_warning.xml | 13 +++++++++++++
 .../layout/fragment_submission_qr_code_scan.xml    | 11 +++++++++++
 .../main/res/layout/fragment_submission_tan.xml    | 11 +++++++++++
 7 files changed, 68 insertions(+)

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionQRCodeScanFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionQRCodeScanFragment.kt
index 9f23a0958..3b2323a43 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionQRCodeScanFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionQRCodeScanFragment.kt
@@ -136,6 +136,11 @@ class SubmissionQRCodeScanFragment : Fragment() {
         })
 
         viewModel.registrationState.observeEvent(viewLifecycleOwner, {
+            binding.submissionQrCodeScanSpinner.visibility = when (it) {
+                ApiRequestState.STARTED -> View.VISIBLE
+                else -> View.GONE
+            }
+
             if (ApiRequestState.SUCCESS == it) {
                 findNavController().doNavigate(
                     SubmissionQRCodeScanFragmentDirections
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt
index 58d651827..7b28f7cdf 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt
@@ -52,6 +52,8 @@ class SubmissionResultPositiveOtherWarningFragment : Fragment(),
     }
 
     override fun onFailure(exception: Exception?) {
+        binding.submissionPositiveOtherWarningButtonNext.isEnabled = true
+        binding.submissionPositiveOtherWarningSpinner.visibility = View.GONE
         submissionFailed = true
     }
 
@@ -137,6 +139,16 @@ class SubmissionResultPositiveOtherWarningFragment : Fragment(),
         })
 
         submissionViewModel.submissionState.observeEvent(viewLifecycleOwner, {
+            binding.submissionPositiveOtherWarningButtonNext.isEnabled = when (it) {
+                ApiRequestState.STARTED -> false
+                else -> true
+            }
+
+            binding.submissionPositiveOtherWarningSpinner.visibility = when (it) {
+                ApiRequestState.STARTED -> View.VISIBLE
+                else -> View.GONE
+            }
+
             if (it == ApiRequestState.SUCCESS) {
                 findNavController().doNavigate(
                     SubmissionResultPositiveOtherWarningFragmentDirections
@@ -148,6 +160,8 @@ class SubmissionResultPositiveOtherWarningFragment : Fragment(),
 
     private fun setButtonOnClickListener() {
         binding.submissionPositiveOtherWarningButtonNext.setOnClickListener {
+            binding.submissionPositiveOtherWarningButtonNext.isEnabled = false
+            binding.submissionPositiveOtherWarningSpinner.visibility = View.VISIBLE
             initiateWarningOthers()
         }
         binding.submissionPositiveOtherWarningHeader.headerButtonBack.buttonIcon.setOnClickListener {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragment.kt
index 99d00bfe0..a7c7a04ed 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragment.kt
@@ -101,6 +101,11 @@ class SubmissionTanFragment : Fragment() {
         binding.submissionTanHeader.headerButtonBack.buttonIcon.setOnClickListener { navigateToDispatchScreen() }
 
         submissionViewModel.registrationState.observeEvent(viewLifecycleOwner, {
+            binding.submissionTanSpinner.visibility = when (it) {
+                ApiRequestState.STARTED -> View.VISIBLE
+                else -> View.GONE
+            }
+
             if (ApiRequestState.SUCCESS == it) {
                 findNavController().doNavigate(
                     SubmissionTanFragmentDirections.actionSubmissionTanFragmentToSubmissionResultFragment()
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt
index 60376083e..7e78fd840 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt
@@ -5,6 +5,7 @@ import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import de.rki.coronawarnapp.exception.ExceptionCategory
+import de.rki.coronawarnapp.exception.TransactionException
 import de.rki.coronawarnapp.exception.http.CwaWebException
 import de.rki.coronawarnapp.exception.reporting.report
 import de.rki.coronawarnapp.service.submission.SubmissionService
@@ -121,7 +122,15 @@ class SubmissionViewModel : ViewModel() {
             } catch (err: CwaWebException) {
                 exceptionLiveData?.value = Event(err)
                 state.value = Event(ApiRequestState.FAILED)
+            } catch (err: TransactionException) {
+                if (err.cause is CwaWebException) {
+                    exceptionLiveData?.value = Event(err.cause)
+                } else {
+                    err.report(ExceptionCategory.INTERNAL)
+                }
+                state.value = Event(ApiRequestState.FAILED)
             } catch (err: Exception) {
+                state.value = Event(ApiRequestState.FAILED)
                 err.report(ExceptionCategory.INTERNAL)
             }
         }
diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml
index 9abda2c0f..9d7c44dc6 100644
--- a/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml
+++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml
@@ -41,6 +41,19 @@
             app:layout_constraintStart_toStartOf="@id/guideline_start"
             app:layout_constraintTop_toBottomOf="@id/guideline_action" />
 
+        <ProgressBar
+            android:id="@+id/submission_positive_other_warning_spinner"
+            style="?android:attr/progressBarStyleHorizontal"
+            android:layout_width="@dimen/match_constraint"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/spacing_large"
+            android:indeterminate="true"
+            android:visibility="gone"
+            app:layout_constraintBottom_toBottomOf="@+id/submission_positive_other_warning_button_next"
+            app:layout_constraintEnd_toEndOf="@+id/submission_positive_other_warning_button_next"
+            app:layout_constraintStart_toStartOf="@+id/submission_positive_other_warning_button_next"
+            app:layout_constraintTop_toTopOf="@+id/submission_positive_other_warning_button_next" />
+
         <androidx.constraintlayout.widget.Guideline
             android:id="@+id/guideline_action"
             android:layout_width="wrap_content"
diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_scan.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_scan.xml
index 2e0406745..ffca652df 100644
--- a/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_scan.xml
+++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_scan.xml
@@ -40,6 +40,17 @@
             app:layout_constraintStart_toStartOf="@+id/submission_qr_code_scan_preview"
             app:layout_constraintTop_toBottomOf="@+id/submission_qr_code_scan_guideline_center" />
 
+        <ProgressBar
+            android:id="@+id/submission_qr_code_scan_spinner"
+            style="?android:attr/progressBarStyle"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/spacing_normal"
+            android:visibility="gone"
+            app:layout_constraintEnd_toEndOf="@+id/submission_qr_code_scan_body"
+            app:layout_constraintStart_toStartOf="@+id/submission_qr_code_scan_body"
+            app:layout_constraintTop_toBottomOf="@+id/submission_qr_code_scan_body" />
+
         <include
             android:id="@+id/submission_qr_code_scan_close"
             layout="@layout/include_button_icon"
diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_tan.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_tan.xml
index a880483f4..0806273fc 100644
--- a/Corona-Warn-App/src/main/res/layout/fragment_submission_tan.xml
+++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_tan.xml
@@ -41,6 +41,17 @@
             app:layout_constraintTop_toBottomOf="@+id/submission_tan_header"
             app:viewmodel="@{viewmodel}" />
 
+        <ProgressBar
+            android:id="@+id/submission_tan_spinner"
+            style="?android:attr/progressBarStyle"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="@dimen/spacing_normal"
+            android:visibility="gone"
+            app:layout_constraintBottom_toTopOf="@+id/guideline_action"
+            app:layout_constraintEnd_toEndOf="@id/guideline_end"
+            app:layout_constraintStart_toStartOf="@id/guideline_start" />
+
         <Button
             android:id="@+id/submission_tan_button_enter"
             style="@style/buttonPrimary"
-- 
GitLab