From d4b110fc4782fefc21343a5be19c6e8691a0eee9 Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Tue, 23 Sep 2025 20:25:35 +0530 Subject: [PATCH] fix: migrate backup delay from old timeline (#22327) --- .../background/BackgroundWorkerApiImpl.kt | 2 +- .../background/BackgroundWorkerPreferences.kt | 66 ++++++++++--------- .../pages/common/change_experience.page.dart | 5 ++ mobile/lib/utils/migration.dart | 10 ++- 4 files changed, 49 insertions(+), 34 deletions(-) diff --git a/mobile/android/app/src/main/kotlin/app/alextran/immich/background/BackgroundWorkerApiImpl.kt b/mobile/android/app/src/main/kotlin/app/alextran/immich/background/BackgroundWorkerApiImpl.kt index 7e0c65eb56..78f2e9e461 100644 --- a/mobile/android/app/src/main/kotlin/app/alextran/immich/background/BackgroundWorkerApiImpl.kt +++ b/mobile/android/app/src/main/kotlin/app/alextran/immich/background/BackgroundWorkerApiImpl.kt @@ -47,7 +47,7 @@ class BackgroundWorkerApiImpl(context: Context) : BackgroundWorkerFgHostApi { addContentUriTrigger(MediaStore.Video.Media.INTERNAL_CONTENT_URI, true) addContentUriTrigger(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true) setTriggerContentUpdateDelay(settings.minimumDelaySeconds, TimeUnit.SECONDS) - setTriggerContentMaxDelay(settings.minimumDelaySeconds * 10, TimeUnit.MINUTES) + setTriggerContentMaxDelay(settings.minimumDelaySeconds * 10, TimeUnit.SECONDS) setRequiresCharging(settings.requiresCharging) }.build() diff --git a/mobile/android/app/src/main/kotlin/app/alextran/immich/background/BackgroundWorkerPreferences.kt b/mobile/android/app/src/main/kotlin/app/alextran/immich/background/BackgroundWorkerPreferences.kt index 964ad558fd..cfceb06c1d 100644 --- a/mobile/android/app/src/main/kotlin/app/alextran/immich/background/BackgroundWorkerPreferences.kt +++ b/mobile/android/app/src/main/kotlin/app/alextran/immich/background/BackgroundWorkerPreferences.kt @@ -5,45 +5,47 @@ import android.content.SharedPreferences import androidx.core.content.edit class BackgroundWorkerPreferences(private val ctx: Context) { - companion object { - const val SHARED_PREF_NAME = "Immich::BackgroundWorker" - private const val SHARED_PREF_MIN_DELAY_KEY = "BackgroundWorker::minDelaySeconds" - private const val SHARED_PREF_REQUIRE_CHARGING_KEY = "BackgroundWorker::requireCharging" - private const val SHARED_PREF_LOCK_KEY = "BackgroundWorker::isLocked" + companion object { + const val SHARED_PREF_NAME = "Immich::BackgroundWorker" + private const val SHARED_PREF_MIN_DELAY_KEY = "BackgroundWorker::minDelaySeconds" + private const val SHARED_PREF_REQUIRE_CHARGING_KEY = "BackgroundWorker::requireCharging" + private const val SHARED_PREF_LOCK_KEY = "BackgroundWorker::isLocked" - private const val DEFAULT_MIN_DELAY_SECONDS = 30L - private const val DEFAULT_REQUIRE_CHARGING = false - } + private const val DEFAULT_MIN_DELAY_SECONDS = 30L + private const val DEFAULT_REQUIRE_CHARGING = false + } - private val sp: SharedPreferences by lazy { - ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE) - } + private val sp: SharedPreferences by lazy { + ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE) + } - fun updateSettings(settings: BackgroundWorkerSettings) { - sp.edit { - putLong(SHARED_PREF_MIN_DELAY_KEY, settings.minimumDelaySeconds) - putBoolean(SHARED_PREF_REQUIRE_CHARGING_KEY, settings.requiresCharging) - } + fun updateSettings(settings: BackgroundWorkerSettings) { + sp.edit { + putLong(SHARED_PREF_MIN_DELAY_KEY, settings.minimumDelaySeconds) + putBoolean(SHARED_PREF_REQUIRE_CHARGING_KEY, settings.requiresCharging) } + } - fun getSettings(): BackgroundWorkerSettings { - return BackgroundWorkerSettings( - minimumDelaySeconds = sp.getLong(SHARED_PREF_MIN_DELAY_KEY, DEFAULT_MIN_DELAY_SECONDS), - requiresCharging = sp.getBoolean( - SHARED_PREF_REQUIRE_CHARGING_KEY, - DEFAULT_REQUIRE_CHARGING - ), - ) - } + fun getSettings(): BackgroundWorkerSettings { + val delaySeconds = sp.getLong(SHARED_PREF_MIN_DELAY_KEY, DEFAULT_MIN_DELAY_SECONDS) - fun setLocked(paused: Boolean) { - sp.edit { - putBoolean(SHARED_PREF_LOCK_KEY, paused) - } - } + return BackgroundWorkerSettings( + minimumDelaySeconds = if (delaySeconds >= 1000) delaySeconds / 1000 else delaySeconds, + requiresCharging = sp.getBoolean( + SHARED_PREF_REQUIRE_CHARGING_KEY, + DEFAULT_REQUIRE_CHARGING + ), + ) + } - fun isLocked(): Boolean { - return sp.getBoolean(SHARED_PREF_LOCK_KEY, true) + fun setLocked(paused: Boolean) { + sp.edit { + putBoolean(SHARED_PREF_LOCK_KEY, paused) } + } + + fun isLocked(): Boolean { + return sp.getBoolean(SHARED_PREF_LOCK_KEY, true) + } } diff --git a/mobile/lib/pages/common/change_experience.page.dart b/mobile/lib/pages/common/change_experience.page.dart index 2e78b79232..2cc3dede1e 100644 --- a/mobile/lib/pages/common/change_experience.page.dart +++ b/mobile/lib/pages/common/change_experience.page.dart @@ -18,6 +18,7 @@ import 'package:immich_mobile/providers/infrastructure/db.provider.dart'; import 'package:immich_mobile/providers/infrastructure/platform.provider.dart'; import 'package:immich_mobile/providers/infrastructure/readonly_mode.provider.dart'; import 'package:immich_mobile/providers/websocket.provider.dart'; +import 'package:immich_mobile/services/app_settings.service.dart'; import 'package:immich_mobile/services/background.service.dart'; import 'package:immich_mobile/utils/migration.dart'; import 'package:logging/logging.dart'; @@ -93,6 +94,10 @@ class _ChangeExperiencePageState extends ConsumerState { await ref.read(driftProvider).reset(); await Store.put(StoreKey.shouldResetSync, true); + final delay = Store.get(StoreKey.backupTriggerDelay, AppSettingsEnum.backupTriggerDelay.defaultValue); + if (delay >= 1000) { + await Store.put(StoreKey.backupTriggerDelay, (delay / 1000).toInt()); + } final permission = await ref.read(galleryPermissionNotifier.notifier).requestGalleryPermission(); if (permission.isGranted) { diff --git a/mobile/lib/utils/migration.dart b/mobile/lib/utils/migration.dart index 1be8647e3d..2ed6d9549f 100644 --- a/mobile/lib/utils/migration.dart +++ b/mobile/lib/utils/migration.dart @@ -22,13 +22,14 @@ import 'package:immich_mobile/infrastructure/entities/store.entity.drift.dart'; import 'package:immich_mobile/infrastructure/entities/user.entity.dart'; import 'package:immich_mobile/infrastructure/repositories/db.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/sync_stream.repository.dart'; +import 'package:immich_mobile/services/app_settings.service.dart'; import 'package:immich_mobile/utils/debug_print.dart'; import 'package:immich_mobile/utils/diff.dart'; import 'package:isar/isar.dart'; // ignore: import_rule_photo_manager import 'package:photo_manager/photo_manager.dart'; -const int targetVersion = 16; +const int targetVersion = 17; Future migrateDatabaseIfNeeded(Isar db, Drift drift) async { final hasVersion = Store.tryGet(StoreKey.version) != null; @@ -64,6 +65,13 @@ Future migrateDatabaseIfNeeded(Isar db, Drift drift) async { await handleBetaMigration(version, await _isNewInstallation(db, drift), SyncStreamRepository(drift)); + if (version < 17 && Store.isBetaTimelineEnabled) { + final delay = Store.get(StoreKey.backupTriggerDelay, AppSettingsEnum.backupTriggerDelay.defaultValue); + if (delay >= 1000) { + await Store.put(StoreKey.backupTriggerDelay, (delay / 1000).toInt()); + } + } + if (targetVersion >= 12) { await Store.put(StoreKey.version, targetVersion); return;