Skip to content

Commit

Permalink
Improve dataset update scheduling
Browse files Browse the repository at this point in the history
  • Loading branch information
CrisBarreiro committed Feb 24, 2025
1 parent c98926a commit db8b30d
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@
package com.duckduckgo.malicioussiteprotection.impl

import android.content.Context
import androidx.lifecycle.LifecycleOwner
import androidx.work.BackoffPolicy
import androidx.work.CoroutineWorker
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.WorkerParameters
import com.duckduckgo.anvil.annotations.ContributesWorker
import com.duckduckgo.app.lifecycle.MainProcessLifecycleObserver
import com.duckduckgo.common.utils.DispatcherProvider
import com.duckduckgo.di.scopes.AppScope
import com.duckduckgo.malicioussiteprotection.impl.data.MaliciousSiteRepository
Expand Down Expand Up @@ -66,14 +68,30 @@ class MaliciousSiteProtectionFiltersUpdateWorker(
scope = AppScope::class,
boundType = PrivacyConfigCallbackPlugin::class,
)
@ContributesMultibinding(
scope = AppScope::class,
boundType = MainProcessLifecycleObserver::class,
)
@SingleInstanceIn(AppScope::class)
class MaliciousSiteProtectionFiltersUpdateWorkerScheduler @Inject constructor(
private val workManager: WorkManager,
private val maliciousSiteProtectionFeature: MaliciousSiteProtectionRCFeature,

) : PrivacyConfigCallbackPlugin {
) : PrivacyConfigCallbackPlugin, MainProcessLifecycleObserver {

override fun onCreate(owner: LifecycleOwner) {
enqueuePeriodicWork()
}

override fun onPrivacyConfigDownloaded() {
enqueuePeriodicWork()
}

private fun enqueuePeriodicWork() {
if (maliciousSiteProtectionFeature.isFeatureEnabled().not() || maliciousSiteProtectionFeature.canUpdateDatasets().not()) {
workManager.cancelUniqueWork(MALICIOUS_SITE_PROTECTION_FILTERS_UPDATE_WORKER_TAG)
return
}
val workerRequest = PeriodicWorkRequestBuilder<MaliciousSiteProtectionFiltersUpdateWorker>(
maliciousSiteProtectionFeature.getFilterSetUpdateFrequency(),
TimeUnit.MINUTES,
Expand All @@ -83,7 +101,7 @@ class MaliciousSiteProtectionFiltersUpdateWorkerScheduler @Inject constructor(
.build()
workManager.enqueueUniquePeriodicWork(
MALICIOUS_SITE_PROTECTION_FILTERS_UPDATE_WORKER_TAG,
ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE,
ExistingPeriodicWorkPolicy.UPDATE,
workerRequest,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@
package com.duckduckgo.malicioussiteprotection.impl

import android.content.Context
import androidx.lifecycle.LifecycleOwner
import androidx.work.BackoffPolicy
import androidx.work.CoroutineWorker
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.WorkerParameters
import com.duckduckgo.anvil.annotations.ContributesWorker
import com.duckduckgo.app.lifecycle.MainProcessLifecycleObserver
import com.duckduckgo.common.utils.DispatcherProvider
import com.duckduckgo.di.scopes.AppScope
import com.duckduckgo.malicioussiteprotection.impl.data.MaliciousSiteRepository
Expand Down Expand Up @@ -66,14 +68,30 @@ class MaliciousSiteProtectionHashPrefixesUpdateWorker(
scope = AppScope::class,
boundType = PrivacyConfigCallbackPlugin::class,
)
@ContributesMultibinding(
scope = AppScope::class,
boundType = MainProcessLifecycleObserver::class,
)
@SingleInstanceIn(AppScope::class)
class MaliciousSiteProtectionHashPrefixesUpdateWorkerScheduler @Inject constructor(
private val workManager: WorkManager,
private val maliciousSiteProtectionFeature: MaliciousSiteProtectionRCFeature,

) : PrivacyConfigCallbackPlugin {
) : PrivacyConfigCallbackPlugin, MainProcessLifecycleObserver {

override fun onCreate(owner: LifecycleOwner) {
enqueuePeriodicWork()
}

override fun onPrivacyConfigDownloaded() {
enqueuePeriodicWork()
}

private fun enqueuePeriodicWork() {
if (maliciousSiteProtectionFeature.isFeatureEnabled().not() || maliciousSiteProtectionFeature.canUpdateDatasets().not()) {
workManager.cancelUniqueWork(MALICIOUS_SITE_PROTECTION_HASH_PREFIXES_UPDATE_WORKER_TAG)
return
}
val workerRequest = PeriodicWorkRequestBuilder<MaliciousSiteProtectionHashPrefixesUpdateWorker>(
maliciousSiteProtectionFeature.getHashPrefixUpdateFrequency(),
TimeUnit.MINUTES,
Expand All @@ -83,7 +101,7 @@ class MaliciousSiteProtectionHashPrefixesUpdateWorkerScheduler @Inject construct
.build()
workManager.enqueueUniquePeriodicWork(
MALICIOUS_SITE_PROTECTION_HASH_PREFIXES_UPDATE_WORKER_TAG,
ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE,
ExistingPeriodicWorkPolicy.UPDATE,
workerRequest,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ class MaliciousSiteProtectionFiltersUpdateWorkerSchedulerTest {
private val scheduler = MaliciousSiteProtectionFiltersUpdateWorkerScheduler(workManager, maliciousSiteProtectionFeature)

@Test
fun onPrivacyConfigDownloaded_schedulesWorkerWithUpdateFrequencyFromRCFlagAndReenqueuePolicy() {
fun onPrivacyConfigDownloaded_schedulesWorkerWithUpdateFrequencyFromRCFlagAndUpdatePolicy() {
val updateFrequencyMinutes = 15L

whenever(maliciousSiteProtectionFeature.getFilterSetUpdateFrequency()).thenReturn(updateFrequencyMinutes)
Expand All @@ -103,7 +103,7 @@ class MaliciousSiteProtectionFiltersUpdateWorkerSchedulerTest {
val workRequestCaptor = ArgumentCaptor.forClass(PeriodicWorkRequest::class.java)
verify(workManager).enqueueUniquePeriodicWork(
eq("MALICIOUS_SITE_PROTECTION_FILTERS_UPDATE_WORKER_TAG"),
eq(ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE),
eq(ExistingPeriodicWorkPolicy.UPDATE),
capture(workRequestCaptor),
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ class MaliciousSiteProtectionHashPrefixesUpdateWorkerSchedulerTest {
val workRequestCaptor = ArgumentCaptor.forClass(PeriodicWorkRequest::class.java)
verify(workManager).enqueueUniquePeriodicWork(
eq("MALICIOUS_SITE_PROTECTION_HASH_PREFIXES_UPDATE_WORKER_TAG"),
eq(ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE),
eq(ExistingPeriodicWorkPolicy.UPDATE),
capture(workRequestCaptor),
)

Expand Down

0 comments on commit db8b30d

Please sign in to comment.