96 lines
3.3 KiB
Kotlin
96 lines
3.3 KiB
Kotlin
package com.lagradost.cloudstream3.services
|
|
|
|
import android.content.Context
|
|
import androidx.core.app.NotificationCompat
|
|
import androidx.work.Constraints
|
|
import androidx.work.CoroutineWorker
|
|
import androidx.work.ExistingPeriodicWorkPolicy
|
|
import androidx.work.ForegroundInfo
|
|
import androidx.work.PeriodicWorkRequest
|
|
import androidx.work.WorkManager
|
|
import androidx.work.WorkerParameters
|
|
import com.lagradost.cloudstream3.R
|
|
import com.lagradost.cloudstream3.utils.AppUtils.createNotificationChannel
|
|
import com.lagradost.cloudstream3.utils.BackupUtils
|
|
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
|
|
import java.util.concurrent.TimeUnit
|
|
|
|
const val BACKUP_CHANNEL_ID = "cloudstream3.backups"
|
|
const val BACKUP_WORK_NAME = "work_backup"
|
|
const val BACKUP_CHANNEL_NAME = "Backups"
|
|
const val BACKUP_CHANNEL_DESCRIPTION = "Notifications for background backups"
|
|
const val BACKUP_NOTIFICATION_ID = 938712898 // Random unique
|
|
|
|
class BackupWorkManager(val context: Context, workerParams: WorkerParameters) :
|
|
CoroutineWorker(context, workerParams) {
|
|
companion object {
|
|
fun enqueuePeriodicWork(context: Context?, intervalHours: Long) {
|
|
if (context == null) return
|
|
|
|
if (intervalHours == 0L) {
|
|
WorkManager.getInstance(context).cancelUniqueWork(BACKUP_WORK_NAME)
|
|
return
|
|
}
|
|
|
|
val constraints = Constraints.Builder()
|
|
.setRequiresStorageNotLow(true)
|
|
.build()
|
|
|
|
val periodicSyncDataWork =
|
|
PeriodicWorkRequest.Builder(
|
|
BackupWorkManager::class.java,
|
|
intervalHours,
|
|
TimeUnit.HOURS
|
|
)
|
|
.addTag(BACKUP_WORK_NAME)
|
|
.setConstraints(constraints)
|
|
.build()
|
|
|
|
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
|
|
BACKUP_WORK_NAME,
|
|
ExistingPeriodicWorkPolicy.UPDATE,
|
|
periodicSyncDataWork
|
|
)
|
|
|
|
// Uncomment below for testing
|
|
|
|
// val oneTimeBackupWork =
|
|
// OneTimeWorkRequest.Builder(BackupWorkManager::class.java)
|
|
// .addTag(BACKUP_WORK_NAME)
|
|
// .setConstraints(constraints)
|
|
// .build()
|
|
//
|
|
// WorkManager.getInstance(context).enqueue(oneTimeBackupWork)
|
|
}
|
|
}
|
|
|
|
private val backupNotificationBuilder =
|
|
NotificationCompat.Builder(context, BACKUP_CHANNEL_ID)
|
|
.setColorized(true)
|
|
.setOnlyAlertOnce(true)
|
|
.setSilent(true)
|
|
.setAutoCancel(true)
|
|
.setContentTitle(context.getString(R.string.pref_category_backup))
|
|
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
|
|
.setColor(context.colorFromAttribute(R.attr.colorPrimary))
|
|
.setSmallIcon(R.drawable.ic_cloudstream_monochrome_big)
|
|
|
|
override suspend fun doWork(): Result {
|
|
context.createNotificationChannel(
|
|
BACKUP_CHANNEL_ID,
|
|
BACKUP_CHANNEL_NAME,
|
|
BACKUP_CHANNEL_DESCRIPTION
|
|
)
|
|
|
|
setForeground(
|
|
ForegroundInfo(
|
|
BACKUP_NOTIFICATION_ID,
|
|
backupNotificationBuilder.build()
|
|
)
|
|
)
|
|
|
|
BackupUtils.backup(context)
|
|
|
|
return Result.success()
|
|
}
|
|
} |