Skip to content
Snippets Groups Projects
Unverified Commit 01a40c85 authored by Lukas Lechner's avatar Lukas Lechner Committed by GitHub
Browse files

Refactor Contact Diary Work Scheduler (DEV) (#3026)

* Refactor ContactDiaryWorkScheduler.kt to our new way of scheduling work

* Remove ContactDiaryWorkScheduler dependency from MainActivity.kt
parent 1043035b
No related branches found
No related tags found
No related merge requests found
...@@ -31,7 +31,6 @@ import de.rki.coronawarnapp.presencetracing.risk.execution.PresenceTracingRiskWo ...@@ -31,7 +31,6 @@ import de.rki.coronawarnapp.presencetracing.risk.execution.PresenceTracingRiskWo
import de.rki.coronawarnapp.presencetracing.storage.retention.TraceLocationDbCleanUpScheduler import de.rki.coronawarnapp.presencetracing.storage.retention.TraceLocationDbCleanUpScheduler
import de.rki.coronawarnapp.risk.RiskLevelChangeDetector import de.rki.coronawarnapp.risk.RiskLevelChangeDetector
import de.rki.coronawarnapp.risk.execution.ExposureWindowRiskWorkScheduler import de.rki.coronawarnapp.risk.execution.ExposureWindowRiskWorkScheduler
import de.rki.coronawarnapp.storage.OnboardingSettings
import de.rki.coronawarnapp.submission.auto.AutoSubmission import de.rki.coronawarnapp.submission.auto.AutoSubmission
import de.rki.coronawarnapp.task.TaskController import de.rki.coronawarnapp.task.TaskController
import de.rki.coronawarnapp.util.CWADebug import de.rki.coronawarnapp.util.CWADebug
...@@ -68,7 +67,6 @@ class CoronaWarnApplication : Application(), HasAndroidInjector { ...@@ -68,7 +67,6 @@ class CoronaWarnApplication : Application(), HasAndroidInjector {
@Inject lateinit var deviceTimeHandler: DeviceTimeHandler @Inject lateinit var deviceTimeHandler: DeviceTimeHandler
@Inject lateinit var autoSubmission: AutoSubmission @Inject lateinit var autoSubmission: AutoSubmission
@Inject lateinit var coronaTestRepository: CoronaTestRepository @Inject lateinit var coronaTestRepository: CoronaTestRepository
@Inject lateinit var onboardingSettings: OnboardingSettings
@Inject lateinit var autoCheckOut: AutoCheckOut @Inject lateinit var autoCheckOut: AutoCheckOut
@Inject lateinit var traceLocationDbCleanupScheduler: TraceLocationDbCleanUpScheduler @Inject lateinit var traceLocationDbCleanupScheduler: TraceLocationDbCleanUpScheduler
@Inject lateinit var shareTestResultNotificationService: ShareTestResultNotificationService @Inject lateinit var shareTestResultNotificationService: ShareTestResultNotificationService
...@@ -111,9 +109,8 @@ class CoronaWarnApplication : Application(), HasAndroidInjector { ...@@ -111,9 +109,8 @@ class CoronaWarnApplication : Application(), HasAndroidInjector {
.onEach { isAppInForeground = it } .onEach { isAppInForeground = it }
.launchIn(GlobalScope) .launchIn(GlobalScope)
if (onboardingSettings.isOnboarded) { Timber.v("Setting up contact diary work scheduler")
contactDiaryWorkScheduler.schedulePeriodic() contactDiaryWorkScheduler.setup()
}
Timber.v("Setting up deadman notification scheduler") Timber.v("Setting up deadman notification scheduler")
deadmanNotificationScheduler.setup() deadmanNotificationScheduler.setup()
......
package de.rki.coronawarnapp.contactdiary.retention package de.rki.coronawarnapp.contactdiary.retention
import androidx.annotation.VisibleForTesting
import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.WorkManager import androidx.work.WorkManager
import dagger.Reusable import dagger.Reusable
import de.rki.coronawarnapp.storage.OnboardingSettings
import de.rki.coronawarnapp.util.coroutine.AppScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
@Reusable @Reusable
class ContactDiaryWorkScheduler @Inject constructor( class ContactDiaryWorkScheduler @Inject constructor(
val workManager: WorkManager, @AppScope val appScope: CoroutineScope,
private val workBuilder: ContactDiaryWorkBuilder private val workManager: WorkManager,
private val workBuilder: ContactDiaryWorkBuilder,
private val onboardingSettings: OnboardingSettings
) { ) {
fun setup() {
onboardingSettings.isOnboardedFlow.onEach { isOnboarded ->
if (isOnboarded) {
schedulePeriodic()
}
}.launchIn(appScope)
}
/** /**
* Enqueue background contact diary clean periodic worker * Enqueue background contact diary clean periodic worker
* Replace with new if older work exists. * Replace with new if older work exists.
*/ */
fun schedulePeriodic() { @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
internal fun schedulePeriodic() {
Timber.d("ContactDiaryWorkScheduler schedulePeriodic()") Timber.d("ContactDiaryWorkScheduler schedulePeriodic()")
// Create unique work and enqueue // Create unique work and enqueue
workManager.enqueueUniquePeriodicWork( workManager.enqueueUniquePeriodicWork(
......
...@@ -18,7 +18,6 @@ import dagger.android.DispatchingAndroidInjector ...@@ -18,7 +18,6 @@ import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector import dagger.android.HasAndroidInjector
import de.rki.coronawarnapp.NavGraphDirections import de.rki.coronawarnapp.NavGraphDirections
import de.rki.coronawarnapp.R import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.contactdiary.retention.ContactDiaryWorkScheduler
import de.rki.coronawarnapp.contactdiary.ui.overview.ContactDiaryOverviewFragmentDirections import de.rki.coronawarnapp.contactdiary.ui.overview.ContactDiaryOverviewFragmentDirections
import de.rki.coronawarnapp.databinding.ActivityMainBinding import de.rki.coronawarnapp.databinding.ActivityMainBinding
import de.rki.coronawarnapp.datadonation.analytics.worker.DataDonationAnalyticsScheduler import de.rki.coronawarnapp.datadonation.analytics.worker.DataDonationAnalyticsScheduler
...@@ -75,7 +74,6 @@ class MainActivity : AppCompatActivity(), HasAndroidInjector { ...@@ -75,7 +74,6 @@ class MainActivity : AppCompatActivity(), HasAndroidInjector {
private val navController by lazy { supportFragmentManager.findNavController(R.id.nav_host_fragment) } private val navController by lazy { supportFragmentManager.findNavController(R.id.nav_host_fragment) }
@Inject lateinit var powerManagement: PowerManagement @Inject lateinit var powerManagement: PowerManagement
@Inject lateinit var contactDiaryWorkScheduler: ContactDiaryWorkScheduler
@Inject lateinit var dataDonationAnalyticsScheduler: DataDonationAnalyticsScheduler @Inject lateinit var dataDonationAnalyticsScheduler: DataDonationAnalyticsScheduler
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
...@@ -193,7 +191,6 @@ class MainActivity : AppCompatActivity(), HasAndroidInjector { ...@@ -193,7 +191,6 @@ class MainActivity : AppCompatActivity(), HasAndroidInjector {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
vm.doBackgroundNoiseCheck() vm.doBackgroundNoiseCheck()
contactDiaryWorkScheduler.schedulePeriodic()
dataDonationAnalyticsScheduler.schedulePeriodic() dataDonationAnalyticsScheduler.schedulePeriodic()
} }
......
...@@ -4,13 +4,18 @@ import androidx.work.ExistingPeriodicWorkPolicy ...@@ -4,13 +4,18 @@ import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.Operation import androidx.work.Operation
import androidx.work.PeriodicWorkRequest import androidx.work.PeriodicWorkRequest
import androidx.work.WorkManager import androidx.work.WorkManager
import de.rki.coronawarnapp.storage.OnboardingSettings
import io.mockk.MockKAnnotations import io.mockk.MockKAnnotations
import io.mockk.every import io.mockk.every
import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.MockK
import io.mockk.verifySequence import io.mockk.verify
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.runBlockingTest
import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import testhelpers.BaseTest import testhelpers.BaseTest
import testhelpers.coroutines.runBlockingTest2
class ContactDiaryWorkSchedulerTest : BaseTest() { class ContactDiaryWorkSchedulerTest : BaseTest() {
...@@ -18,6 +23,7 @@ class ContactDiaryWorkSchedulerTest : BaseTest() { ...@@ -18,6 +23,7 @@ class ContactDiaryWorkSchedulerTest : BaseTest() {
@MockK lateinit var operation: Operation @MockK lateinit var operation: Operation
@MockK lateinit var workBuilder: ContactDiaryWorkBuilder @MockK lateinit var workBuilder: ContactDiaryWorkBuilder
@MockK lateinit var periodicWorkRequest: PeriodicWorkRequest @MockK lateinit var periodicWorkRequest: PeriodicWorkRequest
@MockK lateinit var onBoardingSettings: OnboardingSettings
@BeforeEach @BeforeEach
fun setup() { fun setup() {
...@@ -32,16 +38,32 @@ class ContactDiaryWorkSchedulerTest : BaseTest() { ...@@ -32,16 +38,32 @@ class ContactDiaryWorkSchedulerTest : BaseTest() {
} returns operation } returns operation
} }
private fun createScheduler() = ContactDiaryWorkScheduler( private fun createScheduler(scope: CoroutineScope) = ContactDiaryWorkScheduler(
appScope = scope,
workManager = workManager, workManager = workManager,
workBuilder = workBuilder workBuilder = workBuilder,
onboardingSettings = onBoardingSettings
) )
@Test @Test
fun `test periodic work was scheduled`() { fun `test periodic work was scheduled`() = runBlockingTest {
createScheduler().schedulePeriodic() createScheduler(this).schedulePeriodic()
verifyIfWorkWasScheduled()
}
@Test
fun `periodic work should be scheduled after onboaring`() = runBlockingTest2(ignoreActive = true) {
val onboardingFlow = MutableStateFlow(false)
every { onBoardingSettings.isOnboardedFlow } returns onboardingFlow
createScheduler(this).setup()
verifyIfWorkWasScheduled(exactly = 0)
onboardingFlow.value = true
verifyIfWorkWasScheduled(exactly = 1)
}
verifySequence { private fun verifyIfWorkWasScheduled(exactly: Int = 1) {
verify(exactly = exactly) {
workManager.enqueueUniquePeriodicWork( workManager.enqueueUniquePeriodicWork(
ContactDiaryWorkScheduler.PERIODIC_WORK_NAME, ContactDiaryWorkScheduler.PERIODIC_WORK_NAME,
ExistingPeriodicWorkPolicy.REPLACE, ExistingPeriodicWorkPolicy.REPLACE,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment