From 5d9e95031b485451bbbecd66b0848b1da3195641 Mon Sep 17 00:00:00 2001
From: Kolya Opahle <k.opahle@sap.com>
Date: Mon, 22 Feb 2021 18:00:23 +0100
Subject: [PATCH] FIX: No PPA submission in background over 36+ hours
 (EXPOSUREAPP-5286) #2430

* Moved analytics worker scheduling to MainActivity from CoronaWarnApplication to make sure scheduling also happens on first app launch
Removed the inital 24 Hours start delay offset from the DataDonationAnalyticsScheduler, a random delay between 0 and 24 Hours is still generated

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

* Fixed MainActivityTest for instrumentation runs

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

* Removed invalid logging from DataDonationAnalyticsScheduler

* Removed Timber import from DataDonationAnalyticsScheduler

Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com>
Co-authored-by: Ralf Gehrer <ralfgehrer@users.noreply.github.com>
---
 .../java/de/rki/coronawarnapp/ui/main/MainActivityTest.kt  | 7 +++++++
 .../java/de/rki/coronawarnapp/CoronaWarnApplication.kt     | 1 -
 .../analytics/worker/DataDonationAnalyticsScheduler.kt     | 5 +++--
 .../analytics/worker/DataDonationAnalyticsWorkBuilder.kt   | 4 ++--
 .../main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt | 3 +++
 5 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/main/MainActivityTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/main/MainActivityTest.kt
index 647ff840a..d457ee7eb 100644
--- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/main/MainActivityTest.kt
+++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/main/MainActivityTest.kt
@@ -17,6 +17,7 @@ import de.rki.coronawarnapp.contactdiary.ui.ContactDiarySettings
 import de.rki.coronawarnapp.contactdiary.ui.overview.ContactDiaryOverviewFragment
 import de.rki.coronawarnapp.contactdiary.ui.overview.ContactDiaryOverviewViewModel
 import de.rki.coronawarnapp.contactdiary.ui.overview.adapter.ListItem
+import de.rki.coronawarnapp.datadonation.analytics.worker.DataDonationAnalyticsScheduler
 import de.rki.coronawarnapp.deadman.DeadmanNotificationScheduler
 import de.rki.coronawarnapp.environment.EnvironmentSetup
 import de.rki.coronawarnapp.main.CWASettings
@@ -440,4 +441,10 @@ class MainProviderModule {
         mockk<ContactDiaryWorkScheduler>(relaxed = true).apply {
             every { schedulePeriodic() } just Runs
         }
+
+    @Provides
+    fun dataDonationAnalyticsScheduler(): DataDonationAnalyticsScheduler =
+        mockk<DataDonationAnalyticsScheduler>(relaxed = true).apply {
+            every { schedulePeriodic() } just Runs
+        }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt
index 92b105637..f797cf5b8 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt
@@ -92,7 +92,6 @@ class CoronaWarnApplication : Application(), HasAndroidInjector {
                 deadmanNotificationScheduler.schedulePeriodic()
             }
             contactDiaryWorkScheduler.schedulePeriodic()
-            dataDonationAnalyticsScheduler.schedulePeriodic()
         }
 
         deviceTimeHandler.launch()
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/analytics/worker/DataDonationAnalyticsScheduler.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/analytics/worker/DataDonationAnalyticsScheduler.kt
index 7483d2c46..3b556a002 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/analytics/worker/DataDonationAnalyticsScheduler.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/analytics/worker/DataDonationAnalyticsScheduler.kt
@@ -22,12 +22,13 @@ class DataDonationAnalyticsScheduler @Inject constructor(
      * Enqueue background analytics submission periodic work
      */
     fun schedulePeriodic() {
-        val additionalDelay = timeCalculation.getDelay()
+        val initialDelay = timeCalculation.getDelay()
+
         // Create unique work and enqueue
         workManager.enqueueUniquePeriodicWork(
             PERIODIC_WORK_NAME,
             ExistingPeriodicWorkPolicy.KEEP,
-            workBuilder.buildPeriodicWork(additionalDelay)
+            workBuilder.buildPeriodicWork(initialDelay)
         )
     }
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/analytics/worker/DataDonationAnalyticsWorkBuilder.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/analytics/worker/DataDonationAnalyticsWorkBuilder.kt
index 748466cc4..60a06d08e 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/analytics/worker/DataDonationAnalyticsWorkBuilder.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/analytics/worker/DataDonationAnalyticsWorkBuilder.kt
@@ -14,12 +14,12 @@ import javax.inject.Inject
 
 @Reusable
 class DataDonationAnalyticsWorkBuilder @Inject constructor() {
-    fun buildPeriodicWork(additionalDelay: Duration): PeriodicWorkRequest =
+    fun buildPeriodicWork(initialDelay: Duration): PeriodicWorkRequest =
         PeriodicWorkRequestBuilder<DataDonationAnalyticsPeriodicWorker>(
             DateTimeConstants.HOURS_PER_DAY.toLong(), TimeUnit.HOURS
         )
             .setInitialDelay(
-                DateTimeConstants.HOURS_PER_DAY.toLong() + additionalDelay.standardHours,
+                initialDelay.standardHours,
                 TimeUnit.HOURS
             )
             .setBackoffCriteria(
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt
index 7983f54e6..9fed2fe25 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt
@@ -17,6 +17,7 @@ import dagger.android.HasAndroidInjector
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.contactdiary.retention.ContactDiaryWorkScheduler
 import de.rki.coronawarnapp.databinding.ActivityMainBinding
+import de.rki.coronawarnapp.datadonation.analytics.worker.DataDonationAnalyticsScheduler
 import de.rki.coronawarnapp.deadman.DeadmanNotificationScheduler
 import de.rki.coronawarnapp.storage.LocalData
 import de.rki.coronawarnapp.ui.base.startActivitySafely
@@ -61,6 +62,7 @@ class MainActivity : AppCompatActivity(), HasAndroidInjector {
     @Inject lateinit var powerManagement: PowerManagement
     @Inject lateinit var deadmanScheduler: DeadmanNotificationScheduler
     @Inject lateinit var contactDiaryWorkScheduler: ContactDiaryWorkScheduler
+    @Inject lateinit var dataDonationAnalyticsScheduler: DataDonationAnalyticsScheduler
 
     override fun onCreate(savedInstanceState: Bundle?) {
         AppInjector.setup(this)
@@ -108,6 +110,7 @@ class MainActivity : AppCompatActivity(), HasAndroidInjector {
         scheduleWork()
         vm.doBackgroundNoiseCheck()
         contactDiaryWorkScheduler.schedulePeriodic()
+        dataDonationAnalyticsScheduler.schedulePeriodic()
         if (!LocalData.isAllowedToSubmitDiagnosisKeys()) {
             deadmanScheduler.schedulePeriodic()
         }
-- 
GitLab