diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt
index 75c1cf467..1f21a3261 100644
--- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt
+++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt
@@ -33,6 +33,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import eu.kanade.presentation.more.settings.Preference
import eu.kanade.presentation.permissions.PermissionRequestHelper
+import eu.kanade.presentation.util.relativeTimeSpanString
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.backup.BackupConst
import eu.kanade.tachiyomi.data.backup.BackupCreateJob
@@ -82,6 +83,7 @@ object SettingsDataScreen : SearchableSettings {
val context = LocalContext.current
val backupIntervalPref = backupPreferences.backupInterval()
val backupInterval by backupIntervalPref.collectAsState()
+ val lastAutoBackup by backupPreferences.lastAutoBackupTimestamp().collectAsState()
return Preference.PreferenceGroup(
title = stringResource(R.string.label_backup),
@@ -113,7 +115,10 @@ object SettingsDataScreen : SearchableSettings {
title = stringResource(R.string.pref_backup_slots),
entries = listOf(2, 3, 4, 5).associateWith { it.toString() },
),
- Preference.PreferenceItem.InfoPreference(stringResource(R.string.backup_info)),
+ Preference.PreferenceItem.InfoPreference(
+ stringResource(R.string.backup_info) + "\n\n" +
+ stringResource(R.string.last_auto_backup_info, relativeTimeSpanString(lastAutoBackup)),
+ ),
),
)
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateJob.kt
index 875039e86..d46a58e00 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateJob.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateJob.kt
@@ -23,6 +23,7 @@ import tachiyomi.core.util.system.logcat
import tachiyomi.domain.backup.service.BackupPreferences
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
+import java.util.Date
import java.util.concurrent.TimeUnit
import kotlin.time.Duration.Companion.minutes
import kotlin.time.toJavaDuration
@@ -50,7 +51,11 @@ class BackupCreateJob(private val context: Context, workerParams: WorkerParamete
return try {
val location = BackupCreator(context).createBackup(uri, flags, isAutoBackup)
- if (!isAutoBackup) notifier.showBackupComplete(UniFile.fromUri(context, location.toUri()))
+ if (isAutoBackup) {
+ backupPreferences.lastAutoBackupTimestamp().set(Date().time)
+ } else {
+ notifier.showBackupComplete(UniFile.fromUri(context, location.toUri()))
+ }
Result.success()
} catch (e: Exception) {
logcat(LogPriority.ERROR, e)
diff --git a/domain/src/main/java/tachiyomi/domain/backup/service/BackupPreferences.kt b/domain/src/main/java/tachiyomi/domain/backup/service/BackupPreferences.kt
index 0f6616338..e0f96dffa 100644
--- a/domain/src/main/java/tachiyomi/domain/backup/service/BackupPreferences.kt
+++ b/domain/src/main/java/tachiyomi/domain/backup/service/BackupPreferences.kt
@@ -13,4 +13,7 @@ class BackupPreferences(
fun numberOfBackups() = preferenceStore.getInt("backup_slots", 2)
fun backupInterval() = preferenceStore.getInt("backup_interval", 12)
+
+ // TODO: move this and other "app state" preferences elsewhere and exclude from backups
+ fun lastAutoBackupTimestamp() = preferenceStore.getLong("__APP_STATE_last_auto_backup_timestamp", 0L)
}
diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml
index 7085c9d4c..6e33f1f7f 100644
--- a/i18n/src/main/res/values/strings.xml
+++ b/i18n/src/main/res/values/strings.xml
@@ -505,6 +505,7 @@
Restoring backup failed
Canceled restore
You should keep copies of backups in other places as well. Backups may contain sensitive data including any stored passwords; be careful if sharing.
+ Last automatically backed up: %s
Syncing library