Coverage Summary for Class: AndroidBackgroundSyncScheduler (com.georgeci.moneysurfer.sync.scheduler)
| Class |
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| AndroidBackgroundSyncScheduler |
0%
(0/5)
|
0%
(0/2)
|
0%
(0/31)
|
0%
(0/84)
|
| AndroidBackgroundSyncScheduler$Companion |
|
| Total |
0%
(0/5)
|
0%
(0/2)
|
0%
(0/31)
|
0%
(0/84)
|
package com.georgeci.moneysurfer.sync.scheduler
import android.content.Context
import androidx.work.BackoffPolicy
import androidx.work.Constraints
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.ExistingWorkPolicy
import androidx.work.NetworkType
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import org.koin.core.annotation.Single
import java.util.concurrent.TimeUnit
import kotlin.time.Duration
@Single(binds = [BackgroundSyncScheduler::class])
class AndroidBackgroundSyncScheduler(
context: Context,
) : BackgroundSyncScheduler {
private val workManager: WorkManager = WorkManager.getInstance(context)
override suspend fun schedulePeriodic(interval: Duration, constraints: SyncConstraints) {
val request = PeriodicWorkRequestBuilder<SyncWorker>(
repeatInterval = interval.inWholeMilliseconds,
repeatIntervalTimeUnit = TimeUnit.MILLISECONDS,
)
.setConstraints(constraints.toWorkConstraints())
.setBackoffCriteria(
BackoffPolicy.EXPONENTIAL,
BACKOFF_MIN_DELAY_SECONDS,
TimeUnit.SECONDS,
)
.build()
workManager.enqueueUniquePeriodicWork(
UNIQUE_PERIODIC_NAME,
ExistingPeriodicWorkPolicy.KEEP,
request,
)
}
override suspend fun scheduleOneShot(delay: Duration, constraints: SyncConstraints) {
val request = OneTimeWorkRequestBuilder<SyncWorker>()
.setInitialDelay(delay.inWholeMilliseconds, TimeUnit.MILLISECONDS)
.setConstraints(constraints.toWorkConstraints())
.build()
workManager.enqueueUniqueWork(
UNIQUE_ONESHOT_NAME,
ExistingWorkPolicy.REPLACE,
request,
)
}
override suspend fun cancelAll() {
workManager.cancelUniqueWork(UNIQUE_PERIODIC_NAME)
workManager.cancelUniqueWork(UNIQUE_ONESHOT_NAME)
}
private fun SyncConstraints.toWorkConstraints(): Constraints =
Constraints.Builder()
.setRequiredNetworkType(
if (requireUnmeteredNetwork) NetworkType.UNMETERED else NetworkType.CONNECTED,
)
.setRequiresCharging(requireCharging)
.setRequiresBatteryNotLow(requireBatteryNotLow)
.build()
private companion object {
const val UNIQUE_PERIODIC_NAME = "sync.periodic"
const val UNIQUE_ONESHOT_NAME = "sync.oneshot"
const val BACKOFF_MIN_DELAY_SECONDS = 30L
}
}