From 797145951c389268da7c4711ba7654954a412b5f Mon Sep 17 00:00:00 2001
From: Oliver Zimmerman <oezimmerman@gmail.com>
Date: Wed, 11 Nov 2020 16:06:28 +0000
Subject: [PATCH] Verify right risk state: Exposure Logging stopped vs. Unknown
 Risk (EXPOSUREAPP-3594) (#1567)

* add TracingStatus check that forces No_Calculation option if exposure logging stopped

* detekt adjustments

* Added test with Rituraj for tracing status when tracing status is inactive

Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com>
---
 .../ui/tracing/card/TracingCardState.kt       | 111 ++++++++++++------
 .../ui/tracing/common/BaseTracingState.kt     |  34 ++++--
 .../ui/tracing/card/TracingCardStateTest.kt   |  43 +++++++
 3 files changed, 139 insertions(+), 49 deletions(-)

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardState.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardState.kt
index 4a4fbf237..ceb286194 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardState.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardState.kt
@@ -41,13 +41,19 @@ data class TracingCardState(
      * for general information when no definite risk level
      * can be calculated
      */
-    fun getRiskBody(c: Context): String = when (riskLevelScore) {
-        RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS -> R.string.risk_card_outdated_risk_body
-        RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF -> R.string.risk_card_body_tracing_off
-        RiskLevelConstants.UNKNOWN_RISK_INITIAL -> R.string.risk_card_unknown_risk_body
-        RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS_MANUAL -> R.string.risk_card_outdated_manual_risk_body
-        else -> null
-    }?.let { c.getString(it) } ?: ""
+    fun getRiskBody(c: Context): String {
+        return if (tracingStatus != GeneralTracingStatus.Status.TRACING_INACTIVE) {
+            when (riskLevelScore) {
+                RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS -> R.string.risk_card_outdated_risk_body
+                RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF -> R.string.risk_card_body_tracing_off
+                RiskLevelConstants.UNKNOWN_RISK_INITIAL -> R.string.risk_card_unknown_risk_body
+                RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS_MANUAL -> R.string.risk_card_outdated_manual_risk_body
+                else -> null
+            }?.let { c.getString(it) } ?: ""
+        } else {
+            return c.getString(R.string.risk_card_body_tracing_off)
+        }
+    }
 
     /**
      * Formats the risk card text display of last persisted risk level
@@ -55,23 +61,29 @@ data class TracingCardState(
      * the persisted risk level is of importance
      */
     fun getSavedRiskBody(c: Context): String {
-        return if (
-            riskLevelScore == RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF ||
-            riskLevelScore == RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS ||
-            riskLevelScore == RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS_MANUAL
-        ) {
-            when (lastRiskLevelScoreCalculated) {
-                RiskLevelConstants.LOW_LEVEL_RISK,
-                RiskLevelConstants.INCREASED_RISK,
-                RiskLevelConstants.UNKNOWN_RISK_INITIAL -> {
-                    val arg = formatRiskLevelHeadline(c, lastRiskLevelScoreCalculated)
-                    c.getString(R.string.risk_card_no_calculation_possible_body_saved_risk)
-                        .format(arg)
+        return if (tracingStatus != GeneralTracingStatus.Status.TRACING_INACTIVE) {
+            return if (
+                riskLevelScore == RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF ||
+                riskLevelScore == RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS ||
+                riskLevelScore == RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS_MANUAL
+            ) {
+                when (lastRiskLevelScoreCalculated) {
+                    RiskLevelConstants.LOW_LEVEL_RISK,
+                    RiskLevelConstants.INCREASED_RISK,
+                    RiskLevelConstants.UNKNOWN_RISK_INITIAL -> {
+                        val arg = formatRiskLevelHeadline(c, lastRiskLevelScoreCalculated)
+                        c.getString(R.string.risk_card_no_calculation_possible_body_saved_risk)
+                            .format(arg)
+                    }
+                    else -> ""
                 }
-                else -> ""
+            } else {
+                ""
             }
         } else {
-            ""
+            val arg = formatRiskLevelHeadline(c, lastRiskLevelScoreCalculated)
+            c.getString(R.string.risk_card_no_calculation_possible_body_saved_risk)
+                .format(arg)
         }
     }
 
@@ -189,7 +201,17 @@ data class TracingCardState(
     */
      */
     fun getTimeFetched(c: Context): String {
-        return when (riskLevelScore) {
+        if (tracingStatus == GeneralTracingStatus.Status.TRACING_INACTIVE) {
+            return if (lastTimeDiagnosisKeysFetched != null) {
+                c.getString(
+                    R.string.risk_card_body_time_fetched,
+                    formatRelativeDateTimeString(c, lastTimeDiagnosisKeysFetched)
+                )
+            } else {
+                c.getString(R.string.risk_card_body_not_yet_fetched)
+            }
+        }
+            return when (riskLevelScore) {
             RiskLevelConstants.LOW_LEVEL_RISK,
             RiskLevelConstants.INCREASED_RISK -> {
                 if (lastTimeDiagnosisKeysFetched != null) {
@@ -247,15 +269,22 @@ data class TracingCardState(
 
     fun getRiskLevelHeadline(c: Context) = formatRiskLevelHeadline(c, riskLevelScore)
 
-    fun formatRiskLevelHeadline(c: Context, riskLevelScore: Int) = when (riskLevelScore) {
-        RiskLevelConstants.INCREASED_RISK -> R.string.risk_card_increased_risk_headline
-        RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS -> R.string.risk_card_outdated_risk_headline
-        RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF -> R.string.risk_card_no_calculation_possible_headline
-        RiskLevelConstants.LOW_LEVEL_RISK -> R.string.risk_card_low_risk_headline
-        RiskLevelConstants.UNKNOWN_RISK_INITIAL -> R.string.risk_card_unknown_risk_headline
-        RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS_MANUAL -> R.string.risk_card_unknown_risk_headline
-        else -> null
-    }?.let { c.getString(it) } ?: ""
+    fun formatRiskLevelHeadline(c: Context, riskLevelScore: Int): String {
+        return if (tracingStatus != GeneralTracingStatus.Status.TRACING_INACTIVE) {
+            when (riskLevelScore) {
+                RiskLevelConstants.INCREASED_RISK -> R.string.risk_card_increased_risk_headline
+                RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS -> R.string.risk_card_outdated_risk_headline
+                RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF ->
+                    R.string.risk_card_no_calculation_possible_headline
+                RiskLevelConstants.LOW_LEVEL_RISK -> R.string.risk_card_low_risk_headline
+                RiskLevelConstants.UNKNOWN_RISK_INITIAL -> R.string.risk_card_unknown_risk_headline
+                RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS_MANUAL -> R.string.risk_card_unknown_risk_headline
+                else -> null
+            }?.let { c.getString(it) } ?: ""
+        } else {
+            return c.getString(R.string.risk_card_no_calculation_possible_headline)
+        }
+    }
 
     fun getProgressCardHeadline(c: Context): String = when (tracingProgress) {
         TracingProgress.Downloading -> R.string.risk_card_progress_download_headline
@@ -271,11 +300,17 @@ data class TracingCardState(
 
     fun isTracingInProgress(): Boolean = tracingProgress != TracingProgress.Idle
 
-    fun getRiskInfoContainerBackgroundTint(c: Context): ColorStateList = when (riskLevelScore) {
-        RiskLevelConstants.INCREASED_RISK -> R.color.card_increased
-        RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS -> R.color.card_outdated
-        RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF -> R.color.card_no_calculation
-        RiskLevelConstants.LOW_LEVEL_RISK -> R.color.card_low
-        else -> R.color.card_unknown
-    }.let { c.getColorStateList(it) }
+    fun getRiskInfoContainerBackgroundTint(c: Context): ColorStateList {
+        return if (tracingStatus != GeneralTracingStatus.Status.TRACING_INACTIVE) {
+        when (riskLevelScore) {
+            RiskLevelConstants.INCREASED_RISK -> R.color.card_increased
+            RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS -> R.color.card_outdated
+            RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF -> R.color.card_no_calculation
+            RiskLevelConstants.LOW_LEVEL_RISK -> R.color.card_low
+            else -> R.color.card_unknown
+        }.let { c.getColorStateList(it) }
+    } else {
+            return c.getColorStateList(R.color.card_no_calculation)
+        }
+    }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/common/BaseTracingState.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/common/BaseTracingState.kt
index 0961bf1c4..a132f0cd0 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/common/BaseTracingState.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/common/BaseTracingState.kt
@@ -25,18 +25,30 @@ abstract class BaseTracingState {
     /**
      * Formats the risk card colors for default and pressed states depending on risk level
      */
-    fun getRiskColor(c: Context): Int = when (riskLevelScore) {
-        RiskLevelConstants.INCREASED_RISK -> R.color.colorSemanticHighRisk
-        RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS,
-        RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF -> R.color.colorSemanticUnknownRisk
-        RiskLevelConstants.LOW_LEVEL_RISK -> R.color.colorSemanticLowRisk
-        else -> R.color.colorSemanticNeutralRisk
-    }.let { c.getColor(it) }
+    fun getRiskColor(c: Context): Int {
+        return if (tracingStatus != GeneralTracingStatus.Status.TRACING_INACTIVE) {
+            when (riskLevelScore) {
+                RiskLevelConstants.INCREASED_RISK -> R.color.colorSemanticHighRisk
+                RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS,
+                RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF -> R.color.colorSemanticUnknownRisk
+                RiskLevelConstants.LOW_LEVEL_RISK -> R.color.colorSemanticLowRisk
+                else -> R.color.colorSemanticNeutralRisk
+            }.let { c.getColor(it) }
+        } else {
+            return c.getColor(R.color.colorSemanticUnknownRisk)
+        }
+    }
 
-    fun isTracingOffRiskLevel(): Boolean = when (riskLevelScore) {
-        RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF,
-        RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS -> true
-        else -> false
+    fun isTracingOffRiskLevel(): Boolean {
+        return if (tracingStatus != GeneralTracingStatus.Status.TRACING_INACTIVE) {
+            when (riskLevelScore) {
+                RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF,
+                RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS -> true
+                else -> false
+            }
+        } else {
+            return true
+        }
     }
 
     fun getStableTextColor(c: Context): Int = c.getColor(
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardStateTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardStateTest.kt
index be649ea37..ba00e3484 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardStateTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardStateTest.kt
@@ -146,6 +146,49 @@ class TracingCardStateTest : BaseTest() {
         }
     }
 
+    @Test
+    fun `risklevel affected by tracing status`() {
+        createInstance(
+            riskLevel = UNKNOWN_RISK_OUTDATED_RESULTS,
+            tracingStatus = GeneralTracingStatus.Status.TRACING_INACTIVE
+        ).apply {
+            getRiskBody(context)
+            verify { context.getString(R.string.risk_card_body_tracing_off) }
+        }
+
+        createInstance(
+            riskLevel = NO_CALCULATION_POSSIBLE_TRACING_OFF,
+            tracingStatus = GeneralTracingStatus.Status.TRACING_INACTIVE
+        ).apply {
+            getRiskBody(context)
+            verify { context.getString(R.string.risk_card_body_tracing_off) }
+        }
+
+        createInstance(
+            riskLevel = UNKNOWN_RISK_INITIAL,
+            tracingStatus = GeneralTracingStatus.Status.TRACING_INACTIVE
+        ).apply {
+            getRiskBody(context)
+            verify { context.getString(R.string.risk_card_body_tracing_off) }
+        }
+
+        createInstance(
+            riskLevel = LOW_LEVEL_RISK,
+            tracingStatus = GeneralTracingStatus.Status.TRACING_INACTIVE
+        ).apply {
+            getRiskBody(context)
+            verify { context.getString(R.string.risk_card_body_tracing_off) }
+        }
+
+        createInstance(
+            riskLevel = INCREASED_RISK,
+            tracingStatus = GeneralTracingStatus.Status.TRACING_INACTIVE
+        ).apply {
+            getRiskBody(context)
+            verify { context.getString(R.string.risk_card_body_tracing_off) }
+        }
+    }
+
     @Test
     fun `saved risk body is affected by risklevel`() {
         createInstance(
-- 
GitLab