Turning automatic backup off only cancelled the periodic work, so a run-now that kept failing (e.g. its folder was deleted) retried forever and spammed failure notifications. - Cancel the immediate "run now" work too when backup is disabled. - Worker no-ops (no retry) when the toggle is off, so already-queued work can't revive itself. - Reconcile scheduled work against saved settings on every app launch — re-arms after a reinstall and clears orphaned work once backup is off. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
48 lines
1.8 KiB
Kotlin
48 lines
1.8 KiB
Kotlin
package de.jeanlucmakiola.calendula
|
|
|
|
import android.app.Application
|
|
import dagger.hilt.android.EntryPointAccessors
|
|
import dagger.hilt.android.HiltAndroidApp
|
|
import de.jeanlucmakiola.calendula.data.backup.BackupScheduler
|
|
import de.jeanlucmakiola.calendula.data.backup.BackupWorker
|
|
import de.jeanlucmakiola.calendula.data.crash.CrashReporter
|
|
import kotlinx.coroutines.CoroutineScope
|
|
import kotlinx.coroutines.Dispatchers
|
|
import kotlinx.coroutines.SupervisorJob
|
|
import kotlinx.coroutines.flow.first
|
|
import kotlinx.coroutines.launch
|
|
|
|
/**
|
|
* Application entry point. Registered as android:name=".CalendulaApp"
|
|
* in AndroidManifest.xml. Hilt initializes its component graph here.
|
|
*/
|
|
@HiltAndroidApp
|
|
class CalendulaApp : Application() {
|
|
|
|
override fun onCreate() {
|
|
super.onCreate()
|
|
// Install first thing so startup crashes are captured too (privacy-
|
|
// respecting, on-device; the user submits the report by hand).
|
|
CrashReporter.install(this)
|
|
reconcileAutoBackup()
|
|
}
|
|
|
|
/**
|
|
* Bring the scheduled auto-backup work back in line with the saved settings
|
|
* on every launch — re-arms it after a reinstall and, crucially, cancels any
|
|
* orphaned work once backup has been turned off.
|
|
*/
|
|
private fun reconcileAutoBackup() {
|
|
val deps = EntryPointAccessors.fromApplication(this, BackupWorker.Deps::class.java)
|
|
CoroutineScope(SupervisorJob() + Dispatchers.Default).launch {
|
|
val prefs = deps.settingsPrefs()
|
|
BackupScheduler.apply(
|
|
context = this@CalendulaApp,
|
|
enabled = prefs.autoBackupEnabled.first(),
|
|
intervalMinutes = prefs.autoBackupIntervalMinutes.first(),
|
|
hasFolder = prefs.autoBackupFolderUri.first() != null,
|
|
)
|
|
}
|
|
}
|
|
}
|