Files
AndPictures/app/src/main/java/com/bm/andpictures/WorkScheduler.kt
2026-10-18 19:01:00 -07:00

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()
}