diff --git a/mobile/lib/domain/models/config/app_config.dart b/mobile/lib/domain/models/config/app_config.dart index 3f0ca91db7..7179137af4 100644 --- a/mobile/lib/domain/models/config/app_config.dart +++ b/mobile/lib/domain/models/config/app_config.dart @@ -1,18 +1,22 @@ +import 'package:immich_mobile/domain/models/config/cleanup_config.dart'; import 'package:immich_mobile/domain/models/config/theme_config.dart'; class AppConfig { final ThemeConfig theme; + final CleanupConfig cleanup; - const AppConfig({this.theme = const ThemeConfig()}); + const AppConfig({this.theme = const .new(), this.cleanup = const .new()}); - AppConfig copyWith({ThemeConfig? theme}) => .new(theme: theme ?? this.theme); + AppConfig copyWith({ThemeConfig? theme, CleanupConfig? cleanup}) => + .new(theme: theme ?? this.theme, cleanup: cleanup ?? this.cleanup); @override - bool operator ==(Object other) => identical(this, other) || (other is AppConfig && other.theme == theme); + bool operator ==(Object other) => + identical(this, other) || (other is AppConfig && other.theme == theme && other.cleanup == cleanup); @override - int get hashCode => theme.hashCode; + int get hashCode => Object.hash(theme, cleanup); @override - String toString() => 'AppConfig(theme: $theme)'; + String toString() => 'AppConfig(theme: $theme, cleanup: $cleanup)'; } diff --git a/mobile/lib/domain/models/config/cleanup_config.dart b/mobile/lib/domain/models/config/cleanup_config.dart new file mode 100644 index 0000000000..4b34814492 --- /dev/null +++ b/mobile/lib/domain/models/config/cleanup_config.dart @@ -0,0 +1,48 @@ +import 'package:immich_mobile/constants/enums.dart'; + +class CleanupConfig { + final bool keepFavorites; + final AssetKeepType keepMediaType; + final List keepAlbumIds; + final int cutoffDaysAgo; + final bool defaultsInitialized; + + const CleanupConfig({ + this.keepFavorites = true, + this.keepMediaType = AssetKeepType.none, + this.keepAlbumIds = const [], + this.cutoffDaysAgo = -1, + this.defaultsInitialized = false, + }); + + CleanupConfig copyWith({ + bool? keepFavorites, + AssetKeepType? keepMediaType, + List? keepAlbumIds, + int? cutoffDaysAgo, + bool? defaultsInitialized, + }) => .new( + keepFavorites: keepFavorites ?? this.keepFavorites, + keepMediaType: keepMediaType ?? this.keepMediaType, + keepAlbumIds: keepAlbumIds ?? this.keepAlbumIds, + cutoffDaysAgo: cutoffDaysAgo ?? this.cutoffDaysAgo, + defaultsInitialized: defaultsInitialized ?? this.defaultsInitialized, + ); + + @override + bool operator ==(Object other) => + identical(this, other) || + (other is CleanupConfig && + other.keepFavorites == keepFavorites && + other.keepMediaType == keepMediaType && + other.keepAlbumIds == keepAlbumIds && + other.cutoffDaysAgo == cutoffDaysAgo && + other.defaultsInitialized == defaultsInitialized); + + @override + int get hashCode => Object.hash(keepFavorites, keepMediaType, keepAlbumIds, cutoffDaysAgo, defaultsInitialized); + + @override + String toString() => + 'CleanupConfig(keepFavorites: $keepFavorites, keepMediaType: $keepMediaType, keepAlbumIds: $keepAlbumIds, cutoffDaysAgo: $cutoffDaysAgo, defaultsInitialized: $defaultsInitialized)'; +} diff --git a/mobile/lib/domain/models/metadata_key.dart b/mobile/lib/domain/models/metadata_key.dart index a5d158f9c7..667822663a 100644 --- a/mobile/lib/domain/models/metadata_key.dart +++ b/mobile/lib/domain/models/metadata_key.dart @@ -1,6 +1,9 @@ +import 'dart:convert'; + import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:immich_mobile/constants/colors.dart'; +import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/config/app_config.dart'; import 'package:immich_mobile/domain/models/config/system_config.dart'; import 'package:immich_mobile/domain/models/log.model.dart'; @@ -15,13 +18,25 @@ enum MetadataDomain { enum MetadataKey { // Theme - primaryColor(.appConfig, 'theme.primaryColor', .indigo, _EnumCodec(ImmichColorPreset.values)), + themePrimaryColor(.appConfig, 'theme.primaryColor', .indigo, _EnumCodec(ImmichColorPreset.values)), themeMode(.appConfig, 'theme.mode', .system, _EnumCodec(ThemeMode.values)), - dynamicTheme(.appConfig, 'theme.dynamicTheme', false), - colorfulInterface(.appConfig, 'theme.colorfulInterface', true), + themeDynamic(.appConfig, 'theme.dynamic', false), + themeColorfulInterface(.appConfig, 'theme.colorfulInterface', true), // Log - logLevel(.systemConfig, 'log.level', .info, _EnumCodec(LogLevel.values)); + logLevel(.systemConfig, 'log.level', .info, _EnumCodec(LogLevel.values)), + + // Cleanup + cleanupKeepFavorites(.appConfig, 'cleanup.keepFavorites', true), + cleanupKeepMediaType( + .appConfig, + 'cleanup.keepMediaType', + AssetKeepType.none, + _EnumCodec(AssetKeepType.values), + ), + cleanupKeepAlbumIds>(.appConfig, 'cleanup.keepAlbumIds', [], _ListCodec(_PrimitiveCodec.string)), + cleanupCutoffDaysAgo(.appConfig, 'cleanup.cutoffDaysAgo', -1), + cleanupDefaultsInitialized(.appConfig, 'cleanup.defaultsInitialized', false); final MetadataDomain domain; final String name; @@ -88,6 +103,33 @@ final class _DateTimeCodec extends _MetadataCodec { DateTime? decode(String raw) => DateTime.tryParse(raw); } +final class _ListCodec extends _MetadataCodec> { + final _MetadataCodec _elementCodec; + + const _ListCodec(this._elementCodec); + + @override + String encode(List value) => jsonEncode(value.map(_elementCodec.encode).toList()); + + @override + List? decode(String raw) { + try { + final decoded = jsonDecode(raw); + if (decoded is! List) return null; + final result = []; + for (final item in decoded) { + if (item is! String) return null; + final element = _elementCodec.decode(item); + if (element == null) return null; + result.add(element); + } + return result; + } on FormatException { + return null; + } + } +} + final class _PrimitiveCodec extends _MetadataCodec { final T? Function(String) _parse; diff --git a/mobile/lib/domain/models/store.model.dart b/mobile/lib/domain/models/store.model.dart index fb497f1e9e..8a7cd3a71e 100644 --- a/mobile/lib/domain/models/store.model.dart +++ b/mobile/lib/domain/models/store.model.dart @@ -81,12 +81,6 @@ enum StoreKey { shouldResetSync._(1007), // Free up space - cleanupKeepFavorites._(1008), - cleanupKeepMediaType._(1009), - cleanupKeepAlbumIds._(1010), - cleanupCutoffDaysAgo._(1011), - cleanupDefaultsInitialized._(1012), - syncMigrationStatus._(1013), // Legacy keys that have been migrated to the new metadata store @@ -94,6 +88,11 @@ enum StoreKey { legacyDynamicTheme._(129), legacyColorfulInterface._(130), legacyThemeMode._(102), + legacyCleanupKeepFavorites._(1008), + legacyCleanupKeepMediaType._(1009), + legacyCleanupKeepAlbumIds._(1010), + legacyCleanupCutoffDaysAgo._(1011), + legacyCleanupDefaultsInitialized._(1012), legacyLogLevel._(115); const StoreKey._(this.id); diff --git a/mobile/lib/infrastructure/repositories/metadata.repository.dart b/mobile/lib/infrastructure/repositories/metadata.repository.dart index 15a2eb5230..082e2caac4 100644 --- a/mobile/lib/infrastructure/repositories/metadata.repository.dart +++ b/mobile/lib/infrastructure/repositories/metadata.repository.dart @@ -103,9 +103,16 @@ extension on MetadataDomain { repo._appConfig = .new( theme: .new( mode: repo._read(.themeMode), - primaryColor: repo._read(.primaryColor), - dynamicTheme: repo._read(.dynamicTheme), - colorfulInterface: repo._read(.colorfulInterface), + primaryColor: repo._read(.themePrimaryColor), + dynamicTheme: repo._read(.themeDynamic), + colorfulInterface: repo._read(.themeColorfulInterface), + ), + cleanup: .new( + keepFavorites: repo._read(.cleanupKeepFavorites), + keepMediaType: repo._read(.cleanupKeepMediaType), + keepAlbumIds: repo._read(.cleanupKeepAlbumIds), + cutoffDaysAgo: repo._read(.cleanupCutoffDaysAgo), + defaultsInitialized: repo._read(.cleanupDefaultsInitialized), ), ); case .systemConfig: diff --git a/mobile/lib/pages/common/splash_screen.page.dart b/mobile/lib/pages/common/splash_screen.page.dart index 512940aeb3..594f47999c 100644 --- a/mobile/lib/pages/common/splash_screen.page.dart +++ b/mobile/lib/pages/common/splash_screen.page.dart @@ -35,7 +35,7 @@ class BootstrapErrorWidget extends StatelessWidget { @override Widget build(BuildContext _) { - final immichTheme = MetadataKey.primaryColor.defaultValue.themeOfPreset; + final immichTheme = MetadataKey.themePrimaryColor.defaultValue.themeOfPreset; return EasyLocalization( supportedLocales: locales.values.toList(), diff --git a/mobile/lib/providers/cleanup.provider.dart b/mobile/lib/providers/cleanup.provider.dart index 4d0bdba301..c18185710e 100644 --- a/mobile/lib/providers/cleanup.provider.dart +++ b/mobile/lib/providers/cleanup.provider.dart @@ -1,9 +1,9 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; -import 'package:immich_mobile/providers/app_settings.provider.dart'; +import 'package:immich_mobile/infrastructure/repositories/metadata.repository.dart'; +import 'package:immich_mobile/providers/infrastructure/metadata.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart'; -import 'package:immich_mobile/services/app_settings.service.dart'; import 'package:immich_mobile/services/cleanup.service.dart'; class CleanupState { @@ -54,27 +54,25 @@ final cleanupProvider = StateNotifierProvider((re return CleanupNotifier( ref.watch(cleanupServiceProvider), ref.watch(currentUserProvider)?.id, - ref.watch(appSettingsServiceProvider), + ref.watch(metadataProvider), ); }); class CleanupNotifier extends StateNotifier { final CleanupService _cleanupService; final String? _userId; - final AppSettingsService _appSettingsService; + final MetadataRepository _metadataRepository; - CleanupNotifier(this._cleanupService, this._userId, this._appSettingsService) : super(const CleanupState()) { + CleanupNotifier(this._cleanupService, this._userId, this._metadataRepository) : super(const CleanupState()) { _loadPersistedSettings(); } void _loadPersistedSettings() { - final keepFavorites = _appSettingsService.getSetting(AppSettingsEnum.cleanupKeepFavorites); - final keepMediaTypeIndex = _appSettingsService.getSetting(AppSettingsEnum.cleanupKeepMediaType); - final keepAlbumIdsString = _appSettingsService.getSetting(AppSettingsEnum.cleanupKeepAlbumIds); - final cutoffDaysAgo = _appSettingsService.getSetting(AppSettingsEnum.cleanupCutoffDaysAgo); - - final keepMediaType = AssetKeepType.values[keepMediaTypeIndex.clamp(0, AssetKeepType.values.length - 1)]; - final keepAlbumIds = keepAlbumIdsString.isEmpty ? {} : keepAlbumIdsString.split(',').toSet(); + final cleanup = _metadataRepository.appConfig.cleanup; + final keepFavorites = cleanup.keepFavorites; + final keepMediaType = cleanup.keepMediaType; + final keepAlbumIds = cleanup.keepAlbumIds.toSet(); + final cutoffDaysAgo = cleanup.cutoffDaysAgo; final selectedDate = cutoffDaysAgo >= 0 ? DateTime.now().subtract(Duration(days: cutoffDaysAgo)) : null; state = state.copyWith( @@ -89,18 +87,18 @@ class CleanupNotifier extends StateNotifier { state = state.copyWith(selectedDate: date, assetsToDelete: []); if (date != null) { final daysAgo = DateTime.now().difference(date).inDays; - _appSettingsService.setSetting(AppSettingsEnum.cleanupCutoffDaysAgo, daysAgo); + _metadataRepository.write(.cleanupCutoffDaysAgo, daysAgo); } } void setKeepMediaType(AssetKeepType keepMediaType) { state = state.copyWith(keepMediaType: keepMediaType, assetsToDelete: []); - _appSettingsService.setSetting(AppSettingsEnum.cleanupKeepMediaType, keepMediaType.index); + _metadataRepository.write(.cleanupKeepMediaType, keepMediaType); } void setKeepFavorites(bool keepFavorites) { state = state.copyWith(keepFavorites: keepFavorites, assetsToDelete: []); - _appSettingsService.setSetting(AppSettingsEnum.cleanupKeepFavorites, keepFavorites); + _metadataRepository.write(.cleanupKeepFavorites, keepFavorites); } void toggleKeepAlbum(String albumId) { @@ -120,7 +118,7 @@ class CleanupNotifier extends StateNotifier { } void _persistExcludedAlbumIds(Set albumIds) { - _appSettingsService.setSetting(AppSettingsEnum.cleanupKeepAlbumIds, albumIds.join(',')); + _metadataRepository.write(.cleanupKeepAlbumIds, albumIds.toList()); } void cleanupStaleAlbumIds(Set existingAlbumIds) { @@ -133,7 +131,7 @@ class CleanupNotifier extends StateNotifier { } void applyDefaultAlbumSelections(List<(String id, String name)> albums) { - final isInitialized = _appSettingsService.getSetting(AppSettingsEnum.cleanupDefaultsInitialized); + final isInitialized = _metadataRepository.appConfig.cleanup.defaultsInitialized; if (isInitialized) return; final toKeep = _cleanupService.getDefaultKeepAlbumIds(albums); @@ -144,7 +142,7 @@ class CleanupNotifier extends StateNotifier { _persistExcludedAlbumIds(keepAlbumIds); } - _appSettingsService.setSetting(AppSettingsEnum.cleanupDefaultsInitialized, true); + _metadataRepository.write(.cleanupDefaultsInitialized, true); } Future scanAssets() async { diff --git a/mobile/lib/services/app_settings.service.dart b/mobile/lib/services/app_settings.service.dart index 5c565aff03..72fd389871 100644 --- a/mobile/lib/services/app_settings.service.dart +++ b/mobile/lib/services/app_settings.service.dart @@ -49,12 +49,7 @@ enum AppSettingsEnum { readonlyModeEnabled(StoreKey.readonlyModeEnabled, "readonlyModeEnabled", false), albumGridView(StoreKey.albumGridView, "albumGridView", false), backupRequireCharging(StoreKey.backupRequireCharging, null, false), - backupTriggerDelay(StoreKey.backupTriggerDelay, null, 30), - cleanupKeepFavorites(StoreKey.cleanupKeepFavorites, null, true), - cleanupKeepMediaType(StoreKey.cleanupKeepMediaType, null, 0), - cleanupKeepAlbumIds(StoreKey.cleanupKeepAlbumIds, null, ""), - cleanupCutoffDaysAgo(StoreKey.cleanupCutoffDaysAgo, null, -1), - cleanupDefaultsInitialized(StoreKey.cleanupDefaultsInitialized, null, false); + backupTriggerDelay(StoreKey.backupTriggerDelay, null, 30); const AppSettingsEnum(this.storeKey, this.hiveKey, this.defaultValue); diff --git a/mobile/lib/utils/migration.dart b/mobile/lib/utils/migration.dart index 7b3cfa00dc..b3da549f98 100644 --- a/mobile/lib/utils/migration.dart +++ b/mobile/lib/utils/migration.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:drift/drift.dart'; import 'package:flutter/material.dart'; import 'package:immich_mobile/constants/colors.dart'; +import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/log.model.dart'; import 'package:immich_mobile/domain/models/metadata_key.dart'; import 'package:immich_mobile/domain/models/store.model.dart'; @@ -43,9 +44,29 @@ Future _migrateTo26(Drift drift) async { final migrator = _StoreMigrator(drift); await migrator.migrateEnumName(StoreKey.legacyThemeMode, MetadataKey.themeMode, ThemeMode.values); await migrator.migrateEnumIndex(StoreKey.legacyLogLevel, MetadataKey.logLevel, LogLevel.values); - await migrator.migrateEnumName(StoreKey.legacyPrimaryColor, MetadataKey.primaryColor, ImmichColorPreset.values); - await migrator.migrateBool(StoreKey.legacyDynamicTheme, MetadataKey.dynamicTheme); - await migrator.migrateBool(StoreKey.legacyColorfulInterface, MetadataKey.colorfulInterface); + await migrator.migrateEnumName(StoreKey.legacyPrimaryColor, MetadataKey.themePrimaryColor, ImmichColorPreset.values); + await migrator.migrateBool(StoreKey.legacyDynamicTheme, MetadataKey.themeDynamic); + await migrator.migrateBool(StoreKey.legacyColorfulInterface, MetadataKey.themeColorfulInterface); + final cleanupKeepAlbumIds = await migrator.readLegacyStoreString(StoreKey.legacyCleanupKeepAlbumIds.id); + if (cleanupKeepAlbumIds != null) { + final ids = cleanupKeepAlbumIds.split(',').where((id) => id.isNotEmpty).toList(); + await drift.metadataEntity.insertOnConflictUpdate( + MetadataEntityCompanion.insert( + key: MetadataKey.cleanupKeepAlbumIds.key, + value: MetadataKey.cleanupKeepAlbumIds.encode(ids), + updatedAt: Value(DateTime.now()), + ), + ); + await migrator.deleteLegacyStoreRows([StoreKey.legacyCleanupKeepAlbumIds.id]); + } + await migrator.migrateBool(StoreKey.legacyCleanupKeepFavorites, MetadataKey.cleanupKeepFavorites); + await migrator.migrateEnumIndex( + StoreKey.legacyCleanupKeepMediaType, + MetadataKey.cleanupKeepMediaType, + AssetKeepType.values, + ); + await migrator.migrateInt(StoreKey.legacyCleanupCutoffDaysAgo, MetadataKey.cleanupCutoffDaysAgo); + await migrator.migrateBool(StoreKey.legacyCleanupDefaultsInitialized, MetadataKey.cleanupDefaultsInitialized); await migrator.complete(); } @@ -57,7 +78,7 @@ class _StoreMigrator { _StoreMigrator(this._db); Future migrateEnumIndex(StoreKey legacyKey, MetadataKey newKey, List values) async { - final index = await _readLegacyStoreInt(legacyKey.id); + final index = await readLegacyStoreInt(legacyKey.id); if (index == null) return; final enumValue = values.elementAtOrNull(index) ?? newKey.defaultValue; @@ -70,7 +91,7 @@ class _StoreMigrator { MetadataKey newKey, List values, ) async { - final name = await _readLegacyStoreString(legacyKey.id); + final name = await readLegacyStoreString(legacyKey.id); if (name == null) return; final enumValue = values.firstWhere((e) => e.name == name, orElse: () => newKey.defaultValue); @@ -79,7 +100,7 @@ class _StoreMigrator { } Future migrateBool(StoreKey legacyKey, MetadataKey newKey) async { - final intValue = await _readLegacyStoreInt(legacyKey.id); + final intValue = await readLegacyStoreInt(legacyKey.id); if (intValue == null) return; final boolValue = intValue != 0; @@ -87,6 +108,14 @@ class _StoreMigrator { _migratedStoreIds.add(legacyKey.id); } + Future migrateInt(StoreKey legacyKey, MetadataKey newKey) async { + final intValue = await readLegacyStoreInt(legacyKey.id); + if (intValue == null) return; + + _cache[newKey] = intValue; + _migratedStoreIds.add(legacyKey.id); + } + Future complete() async { await _db.batch((batch) { for (final entry in _cache.entries) { @@ -97,20 +126,20 @@ class _StoreMigrator { ); } }); - await _deleteLegacyStoreRows(_migratedStoreIds); + await deleteLegacyStoreRows(_migratedStoreIds); } - Future _readLegacyStoreString(int id) async { + Future readLegacyStoreString(int id) async { final row = await (_db.storeEntity.select()..where((t) => t.id.equals(id))).getSingleOrNull(); return row?.stringValue; } - Future _readLegacyStoreInt(int id) async { + Future readLegacyStoreInt(int id) async { final row = await (_db.storeEntity.select()..where((t) => t.id.equals(id))).getSingleOrNull(); return row?.intValue; } - Future _deleteLegacyStoreRows(List ids) async { + Future deleteLegacyStoreRows(List ids) async { if (ids.isEmpty) return; await (_db.storeEntity.delete()..where((t) => t.id.isIn(ids))).go(); } diff --git a/mobile/lib/widgets/settings/preference_settings/primary_color_setting.dart b/mobile/lib/widgets/settings/preference_settings/primary_color_setting.dart index 617a9a0758..330555ed54 100644 --- a/mobile/lib/widgets/settings/preference_settings/primary_color_setting.dart +++ b/mobile/lib/widgets/settings/preference_settings/primary_color_setting.dart @@ -2,7 +2,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/colors.dart'; -import 'package:immich_mobile/domain/models/metadata_key.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/theme_extensions.dart'; import 'package:immich_mobile/providers/infrastructure/metadata.provider.dart'; @@ -27,16 +26,16 @@ class PrimaryColorSetting extends HookConsumerWidget { } onUseSystemColorChange(bool newValue) { - ref.read(metadataProvider).write(MetadataKey.dynamicTheme, newValue); + ref.read(metadataProvider).write(.themeDynamic, newValue); popBottomSheet(); } onPrimaryColorChange(ImmichColorPreset colorPreset) { - ref.read(metadataProvider).write(MetadataKey.primaryColor, colorPreset); + ref.read(metadataProvider).write(.themePrimaryColor, colorPreset); //turn off system color setting if (themeConfig.dynamicTheme) { - ref.read(metadataProvider).write(MetadataKey.dynamicTheme, false); + ref.read(metadataProvider).write(.themeDynamic, false); } popBottomSheet(); } diff --git a/mobile/lib/widgets/settings/preference_settings/theme_setting.dart b/mobile/lib/widgets/settings/preference_settings/theme_setting.dart index a011252061..d71842d786 100644 --- a/mobile/lib/widgets/settings/preference_settings/theme_setting.dart +++ b/mobile/lib/widgets/settings/preference_settings/theme_setting.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:immich_mobile/domain/models/metadata_key.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/translate_extensions.dart'; import 'package:immich_mobile/providers/infrastructure/metadata.provider.dart'; @@ -23,7 +22,7 @@ class ThemeSetting extends HookConsumerWidget { void onThemeChange(bool isDark) { currentTheme.value = isDark ? ThemeMode.dark : ThemeMode.light; - ref.read(metadataProvider).write(MetadataKey.themeMode, currentTheme.value); + ref.read(metadataProvider).write(.themeMode, currentTheme.value); } void onSystemThemeChange(bool isSystem) { @@ -40,11 +39,11 @@ class ThemeSetting extends HookConsumerWidget { currentTheme.value = ThemeMode.dark; } } - ref.read(metadataProvider).write(MetadataKey.themeMode, currentTheme.value); + ref.read(metadataProvider).write(.themeMode, currentTheme.value); } void onSurfaceColorSettingChange(bool useColorfulInterface) { - ref.read(metadataProvider).write(MetadataKey.colorfulInterface, useColorfulInterface); + ref.read(metadataProvider).write(.themeColorfulInterface, useColorfulInterface); colorfulInterface.value = useColorfulInterface; } diff --git a/mobile/test/infrastructure/repositories/store_repository_test.dart b/mobile/test/infrastructure/repositories/store_repository_test.dart index fc789589ca..806cde9b75 100644 --- a/mobile/test/infrastructure/repositories/store_repository_test.dart +++ b/mobile/test/infrastructure/repositories/store_repository_test.dart @@ -165,14 +165,14 @@ void main() { [ const StoreDto(StoreKey.version, _kTestVersion), StoreDto(StoreKey.backupFailedSince, _kTestBackupFailed), - const StoreDto(StoreKey.accessToken, _kTestAccessToken), const StoreDto(StoreKey.backupRequireWifi, _kTestBackupRequireWifi), + const StoreDto(StoreKey.accessToken, _kTestAccessToken), ], [ const StoreDto(StoreKey.version, _kTestVersion + 10), StoreDto(StoreKey.backupFailedSince, _kTestBackupFailed), - const StoreDto(StoreKey.accessToken, _kTestAccessToken), const StoreDto(StoreKey.backupRequireWifi, _kTestBackupRequireWifi), + const StoreDto(StoreKey.accessToken, _kTestAccessToken), ], ]), ),