From d3b04378cc5cdb7839c792c7cf3eed0d84963677 Mon Sep 17 00:00:00 2001 From: Peter Ombodi Date: Tue, 11 Aug 2026 13:35:44 +0300 Subject: [PATCH] fix(mobile): migrate legacy manage-media flag through the boolean migration path --- mobile/lib/utils/migration.dart | 14 +-------- mobile/test/unit/utils/migration_test.dart | 36 ++++++++++++++++++++++ 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/mobile/lib/utils/migration.dart b/mobile/lib/utils/migration.dart index 53d25a3112..2bd4daea52 100644 --- a/mobile/lib/utils/migration.dart +++ b/mobile/lib/utils/migration.dart @@ -155,7 +155,7 @@ Future _migrateTo26(Drift drift) async { Future _migrateTo27(Drift drift) async { final migrator = _StoreMigrator(drift); - await migrator.migrateTrashSyncMode(.legacyManageLocalMediaAndroid); + await migrator.migrateBool(.legacyManageLocalMediaAndroid, .trashSyncEnabled); await migrator.complete(); } @@ -275,18 +275,6 @@ class _StoreMigrator { _migratedStoreIds.add(legacyKey.id); } - Future migrateTrashSyncMode(StoreKey legacyKey) async { - final intValue = await readLegacyStoreInt(legacyKey.id); - if (intValue == null) { - return; - } - - if (intValue != 0) { - _cache[SettingsKey.trashSyncMode] = TrashSyncMode.autoSync; - } - _migratedStoreIds.add(legacyKey.id); - } - Future migrateLegacyTrashSyncSetting() async { final row = await (_db.settingsEntity.select()..where((row) => row.key.equals(SettingsKey.trashSyncEnabled.name))) .getSingleOrNull(); diff --git a/mobile/test/unit/utils/migration_test.dart b/mobile/test/unit/utils/migration_test.dart index 871bd153ff..b0865377b0 100644 --- a/mobile/test/unit/utils/migration_test.dart +++ b/mobile/test/unit/utils/migration_test.dart @@ -7,6 +7,7 @@ import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/services/store.service.dart'; import 'package:immich_mobile/entities/store.entity.dart'; import 'package:immich_mobile/infrastructure/entities/settings.entity.drift.dart'; +import 'package:immich_mobile/infrastructure/entities/store.entity.drift.dart'; import 'package:immich_mobile/infrastructure/repositories/db.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/store.repository.dart'; import 'package:immich_mobile/utils/migration.dart'; @@ -54,6 +55,37 @@ void main() { expect(await _readSetting(db, SettingsKey.trashSyncMode), isNull); expect(await _readSetting(db, SettingsKey.trashSyncEnabled), isNull); }); + + group('fresh install migrating from before version 27', () { + setUp(() => Store.put(StoreKey.version, 26)); + + test('carries an enabled legacy manage-media setting through steps 27 and 28 into a mode', () async { + await Store.put(StoreKey.legacyManageLocalMediaAndroid, true); + + await migrateDatabaseIfNeeded(db); + + expect(await _readSetting(db, SettingsKey.trashSyncMode), TrashSyncMode.autoSync); + expect(await _readSetting(db, SettingsKey.trashSyncEnabled), isNull); + expect(await _readLegacyStoreRow(db, StoreKey.legacyManageLocalMediaAndroid), isNull); + }); + + test('drops a disabled legacy manage-media setting without creating a mode', () async { + await Store.put(StoreKey.legacyManageLocalMediaAndroid, false); + + await migrateDatabaseIfNeeded(db); + + expect(await _readSetting(db, SettingsKey.trashSyncMode), isNull); + expect(await _readSetting(db, SettingsKey.trashSyncEnabled), isNull); + expect(await _readLegacyStoreRow(db, StoreKey.legacyManageLocalMediaAndroid), isNull); + }); + + test('leaves an absent legacy manage-media setting at the default mode', () async { + await migrateDatabaseIfNeeded(db); + + expect(await _readSetting(db, SettingsKey.trashSyncMode), isNull); + expect(await _readSetting(db, SettingsKey.trashSyncEnabled), isNull); + }); + }); } Future _writeSetting(Drift db, SettingsKey key, T value) { @@ -66,3 +98,7 @@ Future _readSetting(Drift db, SettingsKey key) async { final row = await (db.settingsEntity.select()..where((row) => row.key.equals(key.name))).getSingleOrNull(); return row?.value == null ? null : key.decode(row!.value!); } + +Future _readLegacyStoreRow(Drift db, StoreKey key) { + return (db.storeEntity.select()..where((row) => row.id.equals(key.id))).getSingleOrNull(); +}