From c7c657b3a21d602b72a5df350a1f0f68d7ea5491 Mon Sep 17 00:00:00 2001
From: Alex Paulescu <alex.paulescu@gmail.com>
Date: Thu, 27 Aug 2020 14:21:46 +0300
Subject: [PATCH] Active tracing days no longer negative (EXPOSUREAPP-2366)
 (#1082)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* Active tracing days no longer negative

* Shortened line length

Co-authored-by: Jakob Möller <jakob.moeller@sap.com>
---
 .../rki/coronawarnapp/risk/TimeVariables.kt   | 29 +++++++++++--------
 .../tracing/TracingIntervalRepository.kt      |  2 +-
 2 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/TimeVariables.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/TimeVariables.kt
index c518230d7..1857d1273 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/TimeVariables.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/TimeVariables.kt
@@ -181,13 +181,17 @@ object TimeVariables {
     suspend fun getActiveTracingDaysInRetentionPeriod(): Long {
         // the active tracing time during the retention period - all non active tracing times
         val tracingActiveMS = getTimeRangeFromRetentionPeriod()
+        val retentionPeriodInMS = getDefaultRetentionPeriodInMS()
+        val lastNonActiveTracingTimestamp = LocalData.lastNonActiveTracingTimestamp()
+        val current = System.currentTimeMillis()
+        val retentionTimestamp = current - retentionPeriodInMS
         val inactiveTracingIntervals = TracingIntervalRepository
             .getDateRepository(CoronaWarnApplication.getAppContext())
             .getIntervals()
             .toMutableList()
 
         // by default the tracing is assumed to be activated
-        // if the API is reachable we set the value accordingly 
+        // if the API is reachable we set the value accordingly
         val enIsDisabled = try {
             !InternalExposureNotificationClient.asyncIsEnabled()
         } catch (e: ApiException) {
@@ -195,21 +199,22 @@ object TimeVariables {
             false
         }
 
-        if (enIsDisabled) {
-            val current = System.currentTimeMillis()
-            val lastTimeTracingWasNotActivated = minOf(
-                LocalData.lastNonActiveTracingTimestamp() ?: current,
-                current - tracingActiveMS
-            )
-
+        // lastNonActiveTracingTimestamp could be null when en is disabled
+        // it only gets updated when you turn the en back on
+        // if en is disabled and lastNonActiveTracingTimestamp != null, only then we add a pair to
+        // the inactive intervals list to account for the time of inactivity between the last time
+        // en was not active and now.
+        if (enIsDisabled && lastNonActiveTracingTimestamp != null) {
+            val lastTimeTracingWasNotActivated = LocalData.lastNonActiveTracingTimestamp() ?: current
             inactiveTracingIntervals.add(Pair(lastTimeTracingWasNotActivated, current))
         }
-
-        val finalTracingMS = tracingActiveMS - inactiveTracingIntervals
-            .map { it.second - it.first }
+        val inactiveTracingMS = inactiveTracingIntervals
+            .map { it.second - maxOf(it.first, retentionTimestamp) }
             .sum()
 
-        return finalTracingMS.roundUpMsToDays()
+        // because we delete periods that are past 14 days but tracingActiveMS counts from first
+        // ever activation, there are edge cases where tracingActiveMS gets to be > 14 days
+        return (minOf(tracingActiveMS, retentionPeriodInMS) - inactiveTracingMS).roundUpMsToDays()
     }
 
     /****************************************************
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/tracing/TracingIntervalRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/tracing/TracingIntervalRepository.kt
index 0f34787c3..2daf3d847 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/tracing/TracingIntervalRepository.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/tracing/TracingIntervalRepository.kt
@@ -66,7 +66,7 @@ class TracingIntervalRepository(private val tracingIntervalDao: TracingIntervalD
 
         return tracingIntervalDao
             .getAllIntervals()
-            .map { Pair(maxOf(it.from, retentionTimestamp), it.to) }
+            .map { Pair(it.from, it.to) }
             .also { Timber.d("Intervals: $it") }
     }
 }
-- 
GitLab