From 21b7d770c389de52cc7935ffcef250f2c214d5ce Mon Sep 17 00:00:00 2001
From: Kolya Opahle <k.opahle@sap.com>
Date: Mon, 26 Oct 2020 17:48:26 +0100
Subject: [PATCH] =?UTF-8?q?Cannot=20delete=20tests=20older=20than=2021=20d?=
 =?UTF-8?q?ays=20-=20DE:=20Tests=20die=20=C3=A4lter=20als=2021=20Tage=20si?=
 =?UTF-8?q?nd,=20k=C3=B6nnen=20nicht=20gel=C3=B6scht=20werden=20(EXPOSUREA?=
 =?UTF-8?q?PP-2398)=20(#1481)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* Added new card to show redeemed tests on the home screen

Signed-off-by: Kolya Opahle <k.opahle@sap.com>

* Fixed linting and unit tests

Signed-off-by: Kolya Opahle <k.opahle@sap.com>

Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com>
---
 .../ui/main/home/HomeFragment.kt              |  28 ++++
 .../ui/main/home/HomeFragmentEvents.kt        |   2 +
 .../ui/main/home/HomeFragmentViewModel.kt     |  13 ++
 .../ui/main/home/SubmissionCardState.kt       |  23 +--
 .../ui/view/TestResultCardFetchFailed.kt      |  18 +++
 .../src/main/res/layout/fragment_home.xml     |  13 +-
 ...ew_submission_status_card_fetch_failed.xml |  65 +++++++++
 .../src/main/res/values-de/strings.xml        |   6 +
 .../src/main/res/values/strings.xml           |   6 +
 .../main/home/SubmissionCardStateTest.kt      | 137 ++++++++++++++----
 10 files changed, 273 insertions(+), 38 deletions(-)
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TestResultCardFetchFailed.kt
 create mode 100644 Corona-Warn-App/src/main/res/layout/view_submission_status_card_fetch_failed.xml

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt
index 5498587c0..1c5a321dd 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt
@@ -1,11 +1,13 @@
 package de.rki.coronawarnapp.ui.main.home
 
+import android.app.AlertDialog
 import android.os.Bundle
 import android.view.View
 import android.view.accessibility.AccessibilityEvent
 import androidx.fragment.app.Fragment
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.databinding.FragmentHomeBinding
+import de.rki.coronawarnapp.util.DialogHelper
 import de.rki.coronawarnapp.util.ExternalActionHelper
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.errors.RecoveryByResetDialogFactory
@@ -82,6 +84,9 @@ class HomeFragment : Fragment(R.layout.fragment_home), AutoInject {
                         onDismiss = { vm.errorResetDialogDismissed() }
                     )
                 }
+                HomeFragmentEvents.ShowDeleteTestDialog -> {
+                    showRemoveTestDialog()
+                }
             }
         }
     }
@@ -93,6 +98,23 @@ class HomeFragment : Fragment(R.layout.fragment_home), AutoInject {
         binding.mainScrollview.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT)
     }
 
+    private fun showRemoveTestDialog() {
+        val removeTestDialog = DialogHelper.DialogInstance(
+            requireActivity(),
+            R.string.submission_test_result_dialog_remove_test_title,
+            R.string.submission_test_result_dialog_remove_test_message,
+            R.string.submission_test_result_dialog_remove_test_button_positive,
+            R.string.submission_test_result_dialog_remove_test_button_negative,
+            positiveButtonFunction = {
+                vm.deregisterWarningAccepted()
+            }
+        )
+        DialogHelper.showDialog(removeTestDialog).apply {
+            getButton(AlertDialog.BUTTON_POSITIVE)
+                .setTextColor(context.getColor(R.color.colorTextSemanticRed))
+        }
+    }
+
     private fun setupRiskCard() {
         binding.mainRisk.apply {
             riskCard.setOnClickListener {
@@ -133,6 +155,12 @@ class HomeFragment : Fragment(R.layout.fragment_home), AutoInject {
                 submissionStatusCardPositive.setOnClickListener { toSubmissionResult() }
                 submissionStatusCardPositiveButton.setOnClickListener { toSubmissionResult() }
             }
+
+            mainTestFailed.apply {
+                setOnClickListener {
+                    vm.removeTestPushed()
+                }
+            }
         }
     }
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentEvents.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentEvents.kt
index cb0ea79e3..26bee23f2 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentEvents.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentEvents.kt
@@ -8,4 +8,6 @@ sealed class HomeFragmentEvents {
     ) : HomeFragmentEvents()
 
     object ShowErrorResetDialog : HomeFragmentEvents()
+
+    object ShowDeleteTestDialog : HomeFragmentEvents()
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt
index ff9ea4079..5e76fb27c 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt
@@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData
 import androidx.lifecycle.asLiveData
 import com.squareup.inject.assisted.AssistedInject
 import de.rki.coronawarnapp.risk.TimeVariables
+import de.rki.coronawarnapp.service.submission.SubmissionService
 import de.rki.coronawarnapp.storage.LocalData
 import de.rki.coronawarnapp.storage.SubmissionRepository
 import de.rki.coronawarnapp.storage.TracingRepository
@@ -94,6 +95,18 @@ class HomeFragmentViewModel @AssistedInject constructor(
         tracingRepository.refreshDiagnosisKeys()
     }
 
+    fun removeTestPushed() {
+        popupEvents.postValue(HomeFragmentEvents.ShowDeleteTestDialog)
+    }
+
+    fun deregisterWarningAccepted() {
+        SubmissionService.deleteTestGUID()
+        SubmissionService.deleteRegistrationToken()
+        LocalData.isAllowedToSubmitDiagnosisKeys(false)
+        LocalData.initialTestResultReceivedTimestamp(0L)
+        SubmissionRepository.refreshDeviceUIState()
+    }
+
     @AssistedInject.Factory
     interface Factory : SimpleCWAViewModelFactory<HomeFragmentViewModel>
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/SubmissionCardState.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/SubmissionCardState.kt
index 8ec5f5556..6592ad0ba 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/SubmissionCardState.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/SubmissionCardState.kt
@@ -25,18 +25,23 @@ data class SubmissionCardState(
 
     fun isUnregisteredCardVisible(): Boolean = !isDeviceRegistered
 
-    fun isFetchingCardVisible(): Boolean = isDeviceRegistered &&
-        (uiStateState == ApiRequestState.STARTED || uiStateState == ApiRequestState.FAILED)
+    fun isFetchingCardVisible(): Boolean =
+        isDeviceRegistered && (uiStateState == ApiRequestState.STARTED || uiStateState == ApiRequestState.FAILED)
 
-    fun isPositiveSubmissionCardVisible(): Boolean = deviceUiState == PAIRED_POSITIVE ||
-        deviceUiState == PAIRED_POSITIVE_TELETAN
+    fun isFailedCardVisible(): Boolean =
+        isDeviceRegistered && uiStateState == ApiRequestState.SUCCESS && deviceUiState == PAIRED_REDEEMED
 
-    fun isSubmissionDoneCardVisible(): Boolean = deviceUiState == SUBMITTED_FINAL
+    fun isPositiveSubmissionCardVisible(): Boolean = uiStateState == ApiRequestState.SUCCESS &&
+        (deviceUiState == PAIRED_POSITIVE ||
+            deviceUiState == PAIRED_POSITIVE_TELETAN)
 
-    fun isContentCardVisible(): Boolean = deviceUiState == PAIRED_ERROR ||
-        deviceUiState == PAIRED_NEGATIVE ||
-        deviceUiState == PAIRED_NO_RESULT ||
-        deviceUiState == PAIRED_REDEEMED
+    fun isSubmissionDoneCardVisible(): Boolean =
+        uiStateState == ApiRequestState.SUCCESS && deviceUiState == SUBMITTED_FINAL
+
+    fun isContentCardVisible(): Boolean =
+        uiStateState == ApiRequestState.SUCCESS && (deviceUiState == PAIRED_ERROR ||
+            deviceUiState == PAIRED_NEGATIVE ||
+            deviceUiState == PAIRED_NO_RESULT)
 
     fun getContentCardTitleText(c: Context): String = when (deviceUiState) {
         PAIRED_ERROR, PAIRED_REDEEMED, PAIRED_NEGATIVE -> R.string.submission_status_card_title_available
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TestResultCardFetchFailed.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TestResultCardFetchFailed.kt
new file mode 100644
index 000000000..c0ca58e56
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TestResultCardFetchFailed.kt
@@ -0,0 +1,18 @@
+package de.rki.coronawarnapp.ui.view
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import androidx.constraintlayout.widget.ConstraintLayout
+import de.rki.coronawarnapp.databinding.ViewSubmissionStatusCardFetchFailedBinding
+
+class TestResultCardFetchFailed(context: Context, attrs: AttributeSet) :
+    ConstraintLayout(context, attrs) {
+    private val inflater = LayoutInflater.from(context)
+    private val binding = ViewSubmissionStatusCardFetchFailedBinding.inflate(inflater, this)
+
+    override fun setOnClickListener(l: OnClickListener?) {
+        super.setOnClickListener(l)
+        binding.submissionStatusCardFetchFailedButton.setOnClickListener(l)
+    }
+}
diff --git a/Corona-Warn-App/src/main/res/layout/fragment_home.xml b/Corona-Warn-App/src/main/res/layout/fragment_home.xml
index e8e4db7c7..2ea113515 100644
--- a/Corona-Warn-App/src/main/res/layout/fragment_home.xml
+++ b/Corona-Warn-App/src/main/res/layout/fragment_home.xml
@@ -173,6 +173,17 @@
                 app:layout_constraintStart_toStartOf="@+id/guideline_card_start"
                 app:layout_constraintTop_toBottomOf="@id/main_test_result" />
 
+            <de.rki.coronawarnapp.ui.view.TestResultCardFetchFailed
+                android:id="@+id/main_test_failed"
+                style="@style/cardNoPadding"
+                gone="@{submissionCard == null || !submissionCard.isFailedCardVisible()}"
+                android:layout_width="@dimen/match_constraint"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/spacing_small"
+                app:layout_constraintEnd_toStartOf="@+id/guideline_card_end"
+                app:layout_constraintStart_toStartOf="@+id/guideline_card_start"
+                app:layout_constraintTop_toBottomOf="@id/main_test_fetching" />
+
             <include
                 android:id="@+id/main_test_positive"
                 layout="@layout/include_submission_status_card_positive"
@@ -182,7 +193,7 @@
                 gone="@{submissionCard == null || !submissionCard.isPositiveSubmissionCardVisible()}"
                 app:layout_constraintEnd_toStartOf="@+id/guideline_card_end"
                 app:layout_constraintStart_toStartOf="@+id/guideline_card_start"
-                app:layout_constraintTop_toBottomOf="@+id/main_test_fetching" />
+                app:layout_constraintTop_toBottomOf="@+id/main_test_failed" />
 
             <include
                 android:id="@+id/main_test_done"
diff --git a/Corona-Warn-App/src/main/res/layout/view_submission_status_card_fetch_failed.xml b/Corona-Warn-App/src/main/res/layout/view_submission_status_card_fetch_failed.xml
new file mode 100644
index 000000000..1b4ca59e1
--- /dev/null
+++ b/Corona-Warn-App/src/main/res/layout/view_submission_status_card_fetch_failed.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merge xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <TextView
+        android:id="@+id/submission_status_card_fetch_failed_title"
+        style="@style/headline5"
+        android:layout_width="@dimen/match_constraint"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/card_padding"
+        android:layout_marginTop="@dimen/card_padding"
+        android:layout_marginEnd="@dimen/spacing_small"
+        android:accessibilityHeading="true"
+        android:focusable="false"
+        android:text="@string/submission_status_card_title_failed"
+        app:layout_constraintEnd_toStartOf="@+id/submission_status_card_fetch_failed_icon"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+
+    <TextView
+        android:id="@+id/submission_status_card_fetch_failed_body"
+        style="@style/subtitleMedium"
+        android:layout_width="@dimen/match_constraint"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/card_padding"
+        android:layout_marginTop="@dimen/spacing_normal"
+        android:layout_marginEnd="@dimen/spacing_small"
+        android:focusable="false"
+        android:text="@string/submission_status_card_body_failed"
+        app:layout_constraintEnd_toStartOf="@+id/submission_status_card_fetch_failed_icon"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/submission_status_card_fetch_failed_title" />
+
+    <Button
+        android:id="@+id/submission_status_card_fetch_failed_button"
+        style="@style/buttonPrimary"
+        android:layout_width="@dimen/match_constraint"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/card_padding"
+        android:layout_marginTop="@dimen/spacing_normal"
+        android:layout_marginEnd="@dimen/card_padding"
+        android:layout_marginBottom="@dimen/card_padding"
+        android:text="@string/submission_status_card_button_failed"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/submission_status_card_unregistered_barrier" />
+
+    <ImageView
+        android:id="@+id/submission_status_card_fetch_failed_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:importantForAccessibility="no"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/submission_status_card_fetch_failed_title"
+        app:srcCompat="@drawable/ic_main_illustration_invalid" />
+
+    <androidx.constraintlayout.widget.Barrier
+        android:id="@+id/submission_status_card_unregistered_barrier"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:barrierDirection="bottom"
+        app:constraint_referenced_ids="submission_status_card_fetch_failed_icon,submission_status_card_fetch_failed_body" />
+</merge>
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 d94c6c476..31f2f4bba 100644
--- a/Corona-Warn-App/src/main/res/values-de/strings.xml
+++ b/Corona-Warn-App/src/main/res/values-de/strings.xml
@@ -1089,6 +1089,8 @@
     <string name="submission_status_card_title_available">"Ihr Ergebnis liegt vor"</string>
     <!-- XHED: Page title for the various submission status: positive -->
     <string name="submission_status_card_title_positive">"Befund positiv"</string>
+    <!-- XHED: Page title for the various submission status fetch failed -->
+    <string name="submission_status_card_title_failed">"Test nicht mehr gültig"</string>
     <!-- XHED: Subtitle for the submission status card: invalid -->
     <string name="submission_status_card_subtitle_invalid">"Fehlerhafter Test"</string>
     <!-- XHED: Subtitle for the submission status card: negative -->
@@ -1105,10 +1107,14 @@
     <string name="submission_status_card_body_positive">"Sie wurden positiv auf SARS-CoV-2 getestet."</string>
     <!-- YTXT: Body text for submission status: negative -->
     <string name="submission_status_card_body_negative">"Sie wurden negativ auf SARS-CoV-2 getestet."</string>
+    <!-- YTXT: Body text for submission status fetch failed -->
+    <string name="submission_status_card_body_failed">"Ihr Test liegt länger als 21 Tage zurück und ist daher nicht länger relevant. Bitte löschen Sie den Test. Danach können Sie einen neuen Test hinzufügen."</string>
     <!-- XBUT: submission status card unregistered button -->
     <string name="submission_status_card_button_unregistered">"Informieren &amp; helfen"</string>
     <!-- XBUT: submission status card show results button -->
     <string name="submission_status_card_button_show_results">"Test anzeigen"</string>
+    <!-- XBUT: submission status card fetch failed button -->
+    <string name="submission_status_card_button_failed">"Test löschen"</string>
     <!-- XHED: submission status card positive result subtitle -->
     <string name="submission_status_card_positive_result_subtitle">"Bitte beachten Sie:"</string>
     <!-- YTXT: text for contagious card -->
diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml
index 1d99b90a8..89a3039fb 100644
--- a/Corona-Warn-App/src/main/res/values/strings.xml
+++ b/Corona-Warn-App/src/main/res/values/strings.xml
@@ -1095,6 +1095,8 @@
     <string name="submission_status_card_title_available">"Your result is available"</string>
     <!-- XHED: Page title for the various submission status: positive -->
     <string name="submission_status_card_title_positive">"Positive Diagnosis"</string>
+    <!-- XHED: Page title for the various submission status fetch failed -->
+    <string name="submission_status_card_title_failed"></string>
     <!-- XHED: Subtitle for the submission status card: invalid -->
     <string name="submission_status_card_subtitle_invalid">"Invalid test"</string>
     <!-- XHED: Subtitle for the submission status card: negative -->
@@ -1111,10 +1113,14 @@
     <string name="submission_status_card_body_positive">"You have been diagnosed positive for SARS-CoV-2."</string>
     <!-- YTXT: Body text for submission status: negative -->
     <string name="submission_status_card_body_negative">"You have been diagnosed negative for SARS-CoV-2."</string>
+    <!-- YTXT: Body text for submission status fetch failed -->
+    <string name="submission_status_card_body_failed"></string>
     <!-- XBUT: submission status card unregistered button -->
     <string name="submission_status_card_button_unregistered">"Learn More and Help"</string>
     <!-- XBUT: submission status card show results button -->
     <string name="submission_status_card_button_show_results">"Display Test"</string>
+    <!-- XBUT: submission status card fetch failed button -->
+    <string name="submission_status_card_button_failed"></string>
     <!-- XHED: submission status card positive result subtitle -->
     <string name="submission_status_card_positive_result_subtitle">"Please note:"</string>
     <!-- YTXT: text for contagious card -->
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/main/home/SubmissionCardStateTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/main/home/SubmissionCardStateTest.kt
index b35d5d573..37d908b10 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/main/home/SubmissionCardStateTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/main/home/SubmissionCardStateTest.kt
@@ -83,32 +83,59 @@ class SubmissionCardStateTest : BaseTest() {
 
     @Test
     fun `content card visibility`() {
-        instance(deviceUiState = DeviceUIState.PAIRED_NEGATIVE).apply {
+        instance(
+            deviceUiState = DeviceUIState.PAIRED_NEGATIVE,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isContentCardVisible() shouldBe true
         }
-        instance(deviceUiState = DeviceUIState.PAIRED_ERROR).apply {
+        instance(
+            deviceUiState = DeviceUIState.PAIRED_NEGATIVE,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isContentCardVisible() shouldBe true
         }
-        instance(deviceUiState = DeviceUIState.PAIRED_NO_RESULT).apply {
+        instance(
+            deviceUiState = DeviceUIState.PAIRED_NO_RESULT,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isContentCardVisible() shouldBe true
         }
-        instance(deviceUiState = DeviceUIState.PAIRED_POSITIVE).apply {
+        instance(
+            deviceUiState = DeviceUIState.PAIRED_POSITIVE,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isContentCardVisible() shouldBe false
         }
-        instance(deviceUiState = DeviceUIState.PAIRED_POSITIVE_TELETAN).apply {
+        instance(
+            deviceUiState = DeviceUIState.PAIRED_POSITIVE_TELETAN,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isContentCardVisible() shouldBe false
         }
-        instance(deviceUiState = DeviceUIState.SUBMITTED_FINAL).apply {
+        instance(
+            deviceUiState = DeviceUIState.SUBMITTED_FINAL,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isContentCardVisible() shouldBe false
         }
-        instance(deviceUiState = DeviceUIState.SUBMITTED_INITIAL).apply {
+        instance(
+            deviceUiState = DeviceUIState.SUBMITTED_INITIAL,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isContentCardVisible() shouldBe false
         }
-        instance(deviceUiState = DeviceUIState.UNPAIRED).apply {
+        instance(
+            deviceUiState = DeviceUIState.UNPAIRED,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isContentCardVisible() shouldBe false
         }
-        instance(deviceUiState = DeviceUIState.PAIRED_REDEEMED).apply {
-            isContentCardVisible() shouldBe true
+        instance(
+            deviceUiState = DeviceUIState.PAIRED_REDEEMED,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
+            isContentCardVisible() shouldBe false
         }
     }
 
@@ -142,62 +169,116 @@ class SubmissionCardStateTest : BaseTest() {
 
     @Test
     fun `submission positive result card visibility`() {
-        instance(deviceUiState = DeviceUIState.PAIRED_NEGATIVE).apply {
+        instance(
+            deviceUiState = DeviceUIState.PAIRED_NEGATIVE,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isPositiveSubmissionCardVisible() shouldBe false
         }
-        instance(deviceUiState = DeviceUIState.PAIRED_REDEEMED).apply {
+        instance(
+            deviceUiState = DeviceUIState.PAIRED_REDEEMED,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isPositiveSubmissionCardVisible() shouldBe false
         }
-        instance(deviceUiState = DeviceUIState.PAIRED_ERROR).apply {
+        instance(
+            deviceUiState = DeviceUIState.PAIRED_ERROR,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isPositiveSubmissionCardVisible() shouldBe false
         }
-        instance(deviceUiState = DeviceUIState.PAIRED_NO_RESULT).apply {
+        instance(
+            deviceUiState = DeviceUIState.PAIRED_NO_RESULT,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isPositiveSubmissionCardVisible() shouldBe false
         }
-        instance(deviceUiState = DeviceUIState.PAIRED_POSITIVE).apply {
+        instance(
+            deviceUiState = DeviceUIState.PAIRED_POSITIVE,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isPositiveSubmissionCardVisible() shouldBe true
         }
-        instance(deviceUiState = DeviceUIState.PAIRED_POSITIVE_TELETAN).apply {
+        instance(
+            deviceUiState = DeviceUIState.PAIRED_POSITIVE_TELETAN,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isPositiveSubmissionCardVisible() shouldBe true
         }
-        instance(deviceUiState = DeviceUIState.SUBMITTED_FINAL).apply {
+        instance(
+            deviceUiState = DeviceUIState.SUBMITTED_FINAL,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isPositiveSubmissionCardVisible() shouldBe false
         }
-        instance(deviceUiState = DeviceUIState.SUBMITTED_INITIAL).apply {
+        instance(
+            deviceUiState = DeviceUIState.SUBMITTED_INITIAL,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isPositiveSubmissionCardVisible() shouldBe false
         }
-        instance(deviceUiState = DeviceUIState.UNPAIRED).apply {
+        instance(
+            deviceUiState = DeviceUIState.UNPAIRED,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isPositiveSubmissionCardVisible() shouldBe false
         }
     }
 
     @Test
     fun `submission done  card visibility`() {
-        instance(deviceUiState = DeviceUIState.UNPAIRED).apply {
+        instance(
+            deviceUiState = DeviceUIState.UNPAIRED,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isSubmissionDoneCardVisible() shouldBe false
         }
-        instance(deviceUiState = DeviceUIState.PAIRED_NEGATIVE).apply {
+        instance(
+            deviceUiState = DeviceUIState.PAIRED_NEGATIVE,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isSubmissionDoneCardVisible() shouldBe false
         }
-        instance(deviceUiState = DeviceUIState.PAIRED_ERROR).apply {
+        instance(
+            deviceUiState = DeviceUIState.PAIRED_ERROR,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isSubmissionDoneCardVisible() shouldBe false
         }
-        instance(deviceUiState = DeviceUIState.PAIRED_NO_RESULT).apply {
+        instance(
+            deviceUiState = DeviceUIState.PAIRED_NO_RESULT,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isSubmissionDoneCardVisible() shouldBe false
         }
-        instance(deviceUiState = DeviceUIState.PAIRED_POSITIVE).apply {
+        instance(
+            deviceUiState = DeviceUIState.PAIRED_POSITIVE,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isSubmissionDoneCardVisible() shouldBe false
         }
-        instance(deviceUiState = DeviceUIState.PAIRED_POSITIVE_TELETAN).apply {
+        instance(
+            deviceUiState = DeviceUIState.PAIRED_POSITIVE_TELETAN,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isSubmissionDoneCardVisible() shouldBe false
         }
-        instance(deviceUiState = DeviceUIState.SUBMITTED_FINAL).apply {
+        instance(
+            deviceUiState = DeviceUIState.SUBMITTED_FINAL,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isSubmissionDoneCardVisible() shouldBe true
         }
-        instance(deviceUiState = DeviceUIState.SUBMITTED_INITIAL).apply {
+        instance(
+            deviceUiState = DeviceUIState.SUBMITTED_INITIAL,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isSubmissionDoneCardVisible() shouldBe false
         }
-        instance(deviceUiState = DeviceUIState.PAIRED_REDEEMED).apply {
+        instance(
+            deviceUiState = DeviceUIState.PAIRED_REDEEMED,
+            uiStateState = ApiRequestState.SUCCESS
+        ).apply {
             isSubmissionDoneCardVisible() shouldBe false
         }
     }
-- 
GitLab