52 lines
1.8 KiB
Kotlin
52 lines
1.8 KiB
Kotlin
// Copyright 2026 Umbra Tools (umbratools.com)
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package com.bm.andpictures
|
|
|
|
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 java.util.concurrent.TimeUnit
|
|
|
|
/** Central place for the WorkManager schedules this app uses. */
|
|
object WorkScheduler {
|
|
|
|
/** Guarantees a periodic safety-net run even if no network event arrives. */
|
|
fun schedulePeriodic(context: Context) {
|
|
val request = PeriodicWorkRequestBuilder<SyncWorker>(15, TimeUnit.MINUTES)
|
|
.setConstraints(onlineConstraints())
|
|
.build()
|
|
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
|
|
Prefs.WORK_PERIODIC,
|
|
ExistingPeriodicWorkPolicy.KEEP,
|
|
request,
|
|
)
|
|
}
|
|
|
|
/**
|
|
* Asks for an immediate sync. [replace] = true (manual button) restarts a
|
|
* running job; false (network event) leaves an in-flight sync alone.
|
|
*/
|
|
fun requestSync(context: Context, replace: Boolean) {
|
|
val request = OneTimeWorkRequestBuilder<SyncWorker>()
|
|
.setConstraints(onlineConstraints())
|
|
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 30, TimeUnit.SECONDS)
|
|
.build()
|
|
WorkManager.getInstance(context).enqueueUniqueWork(
|
|
Prefs.WORK_ONESHOT,
|
|
if (replace) ExistingWorkPolicy.REPLACE else ExistingWorkPolicy.KEEP,
|
|
request,
|
|
)
|
|
}
|
|
|
|
private fun onlineConstraints() = Constraints.Builder()
|
|
.setRequiredNetworkType(NetworkType.CONNECTED)
|
|
.build()
|
|
}
|