fix: migrate backup delay from old timeline (#22327)

This commit is contained in:
shenlong 2025-09-23 20:25:35 +05:30 committed by GitHub
parent f7acf1886c
commit d4b110fc47
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 49 additions and 34 deletions

View file

@ -47,7 +47,7 @@ class BackgroundWorkerApiImpl(context: Context) : BackgroundWorkerFgHostApi {
addContentUriTrigger(MediaStore.Video.Media.INTERNAL_CONTENT_URI, true) addContentUriTrigger(MediaStore.Video.Media.INTERNAL_CONTENT_URI, true)
addContentUriTrigger(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true) addContentUriTrigger(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true)
setTriggerContentUpdateDelay(settings.minimumDelaySeconds, TimeUnit.SECONDS) setTriggerContentUpdateDelay(settings.minimumDelaySeconds, TimeUnit.SECONDS)
setTriggerContentMaxDelay(settings.minimumDelaySeconds * 10, TimeUnit.MINUTES) setTriggerContentMaxDelay(settings.minimumDelaySeconds * 10, TimeUnit.SECONDS)
setRequiresCharging(settings.requiresCharging) setRequiresCharging(settings.requiresCharging)
}.build() }.build()

View file

@ -5,45 +5,47 @@ import android.content.SharedPreferences
import androidx.core.content.edit import androidx.core.content.edit
class BackgroundWorkerPreferences(private val ctx: Context) { class BackgroundWorkerPreferences(private val ctx: Context) {
companion object { companion object {
const val SHARED_PREF_NAME = "Immich::BackgroundWorker" const val SHARED_PREF_NAME = "Immich::BackgroundWorker"
private const val SHARED_PREF_MIN_DELAY_KEY = "BackgroundWorker::minDelaySeconds" 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_REQUIRE_CHARGING_KEY = "BackgroundWorker::requireCharging"
private const val SHARED_PREF_LOCK_KEY = "BackgroundWorker::isLocked" private const val SHARED_PREF_LOCK_KEY = "BackgroundWorker::isLocked"
private const val DEFAULT_MIN_DELAY_SECONDS = 30L private const val DEFAULT_MIN_DELAY_SECONDS = 30L
private const val DEFAULT_REQUIRE_CHARGING = false private const val DEFAULT_REQUIRE_CHARGING = false
} }
private val sp: SharedPreferences by lazy { private val sp: SharedPreferences by lazy {
ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE) ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE)
} }
fun updateSettings(settings: BackgroundWorkerSettings) { fun updateSettings(settings: BackgroundWorkerSettings) {
sp.edit { sp.edit {
putLong(SHARED_PREF_MIN_DELAY_KEY, settings.minimumDelaySeconds) putLong(SHARED_PREF_MIN_DELAY_KEY, settings.minimumDelaySeconds)
putBoolean(SHARED_PREF_REQUIRE_CHARGING_KEY, settings.requiresCharging) putBoolean(SHARED_PREF_REQUIRE_CHARGING_KEY, settings.requiresCharging)
}
} }
}
fun getSettings(): BackgroundWorkerSettings { fun getSettings(): BackgroundWorkerSettings {
return BackgroundWorkerSettings( val delaySeconds = sp.getLong(SHARED_PREF_MIN_DELAY_KEY, DEFAULT_MIN_DELAY_SECONDS)
minimumDelaySeconds = sp.getLong(SHARED_PREF_MIN_DELAY_KEY, DEFAULT_MIN_DELAY_SECONDS),
requiresCharging = sp.getBoolean(
SHARED_PREF_REQUIRE_CHARGING_KEY,
DEFAULT_REQUIRE_CHARGING
),
)
}
fun setLocked(paused: Boolean) { return BackgroundWorkerSettings(
sp.edit { minimumDelaySeconds = if (delaySeconds >= 1000) delaySeconds / 1000 else delaySeconds,
putBoolean(SHARED_PREF_LOCK_KEY, paused) requiresCharging = sp.getBoolean(
} SHARED_PREF_REQUIRE_CHARGING_KEY,
} DEFAULT_REQUIRE_CHARGING
),
)
}
fun isLocked(): Boolean { fun setLocked(paused: Boolean) {
return sp.getBoolean(SHARED_PREF_LOCK_KEY, true) sp.edit {
putBoolean(SHARED_PREF_LOCK_KEY, paused)
} }
}
fun isLocked(): Boolean {
return sp.getBoolean(SHARED_PREF_LOCK_KEY, true)
}
} }

View file

@ -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/platform.provider.dart';
import 'package:immich_mobile/providers/infrastructure/readonly_mode.provider.dart'; import 'package:immich_mobile/providers/infrastructure/readonly_mode.provider.dart';
import 'package:immich_mobile/providers/websocket.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/services/background.service.dart';
import 'package:immich_mobile/utils/migration.dart'; import 'package:immich_mobile/utils/migration.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
@ -93,6 +94,10 @@ class _ChangeExperiencePageState extends ConsumerState<ChangeExperiencePage> {
await ref.read(driftProvider).reset(); await ref.read(driftProvider).reset();
await Store.put(StoreKey.shouldResetSync, true); 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(); final permission = await ref.read(galleryPermissionNotifier.notifier).requestGalleryPermission();
if (permission.isGranted) { if (permission.isGranted) {

View file

@ -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/entities/user.entity.dart';
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/sync_stream.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/debug_print.dart';
import 'package:immich_mobile/utils/diff.dart'; import 'package:immich_mobile/utils/diff.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
// ignore: import_rule_photo_manager // ignore: import_rule_photo_manager
import 'package:photo_manager/photo_manager.dart'; import 'package:photo_manager/photo_manager.dart';
const int targetVersion = 16; const int targetVersion = 17;
Future<void> migrateDatabaseIfNeeded(Isar db, Drift drift) async { Future<void> migrateDatabaseIfNeeded(Isar db, Drift drift) async {
final hasVersion = Store.tryGet(StoreKey.version) != null; final hasVersion = Store.tryGet(StoreKey.version) != null;
@ -64,6 +65,13 @@ Future<void> migrateDatabaseIfNeeded(Isar db, Drift drift) async {
await handleBetaMigration(version, await _isNewInstallation(db, drift), SyncStreamRepository(drift)); 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) { if (targetVersion >= 12) {
await Store.put(StoreKey.version, targetVersion); await Store.put(StoreKey.version, targetVersion);
return; return;