diff --git a/mobile/lib/domain/services/background_worker.service.dart b/mobile/lib/domain/services/background_worker.service.dart index 69c743f855..5a8357ac44 100644 --- a/mobile/lib/domain/services/background_worker.service.dart +++ b/mobile/lib/domain/services/background_worker.service.dart @@ -82,7 +82,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi { trashedLocalAssetRepository: db.trashedLocalAssetRepository, assetMediaRepository: ref.read(assetMediaRepositoryProvider), permissionRepository: ref.read(permissionRepositoryProvider), - appMetadataRepository: ref.read(appMetadataRepositoryProvider), + appMetadataRepository: db.appMetadataRepository, cancellation: _cancellationToken, ); _remoteSyncService = SyncStreamService( @@ -94,7 +94,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi { permissionRepository: ref.read(permissionRepositoryProvider), syncMigrationRepository: db.syncMigrationRepository, api: ref.read(apiServiceProvider), - appMetadataRepository: ref.read(appMetadataRepositoryProvider), + appMetadataRepository: db.appMetadataRepository, cancellation: _cancellationToken, ); _hashService = HashService( diff --git a/mobile/lib/infrastructure/repositories/app_metadata.repository.dart b/mobile/lib/infrastructure/repositories/app_metadata.repository.dart index 7f8faa6bb5..7b213223c2 100644 --- a/mobile/lib/infrastructure/repositories/app_metadata.repository.dart +++ b/mobile/lib/infrastructure/repositories/app_metadata.repository.dart @@ -1,12 +1,14 @@ import 'package:drift/drift.dart'; import 'package:immich_mobile/domain/models/app_metadata_key.dart'; import 'package:immich_mobile/infrastructure/entities/app_metadata.entity.drift.dart'; +import 'package:immich_mobile/infrastructure/repositories/app_metadata.repository.drift.dart'; import 'package:immich_mobile/infrastructure/repositories/db.repository.dart'; -class AppMetadataRepository { - final Drift _db; +@DriftAccessor() +class AppMetadataRepository extends DatabaseAccessor with $AppMetadataRepositoryMixin { + AppMetadataRepository(super.attachedDatabase); - const AppMetadataRepository(this._db); + Drift get _db => attachedDatabase; Future get(AppMetadataKey key) async { final row = await (_db.select(_db.appMetadataEntity)..where((row) => row.key.equals(key.name))).getSingleOrNull(); diff --git a/mobile/lib/infrastructure/repositories/db.repository.dart b/mobile/lib/infrastructure/repositories/db.repository.dart index 3901c12083..cdc45de973 100644 --- a/mobile/lib/infrastructure/repositories/db.repository.dart +++ b/mobile/lib/infrastructure/repositories/db.repository.dart @@ -34,6 +34,7 @@ import 'package:immich_mobile/infrastructure/entities/trashed_local_asset.entity import 'package:immich_mobile/infrastructure/entities/trashed_local_asset.entity.drift.dart'; import 'package:immich_mobile/infrastructure/entities/user.entity.dart'; import 'package:immich_mobile/infrastructure/entities/user_metadata.entity.dart'; +import 'package:immich_mobile/infrastructure/repositories/app_metadata.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/backup.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/db.repository.drift.dart'; import 'package:immich_mobile/infrastructure/repositories/db.repository.steps.dart'; @@ -93,6 +94,7 @@ import 'package:sqlite_async/sqlite_async.dart'; ], include: {'package:immich_mobile/infrastructure/entities/merged_asset.drift'}, daos: [ + AppMetadataRepository, AuthUserRepository, BackupRepository, LocalAlbumRepository, diff --git a/mobile/lib/presentation/actions/delete.action.dart b/mobile/lib/presentation/actions/delete.action.dart index 55048fe3cf..1a7323edcd 100644 --- a/mobile/lib/presentation/actions/delete.action.dart +++ b/mobile/lib/presentation/actions/delete.action.dart @@ -5,8 +5,8 @@ import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/extensions/platform_extensions.dart'; import 'package:immich_mobile/generated/translations.g.dart'; import 'package:immich_mobile/presentation/actions/action.dart'; -import 'package:immich_mobile/providers/infrastructure/app_metadata.provider.dart'; import 'package:immich_mobile/providers/infrastructure/asset.provider.dart'; +import 'package:immich_mobile/providers/infrastructure/db.provider.dart'; import 'package:immich_mobile/providers/infrastructure/toast.provider.dart'; import 'package:immich_mobile/providers/server_info.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart'; @@ -218,7 +218,7 @@ Future _cleanupLocalAssets( final requiresPrompt = requestCustomPrompt && CurrentPlatform.isAndroid && - await ref.read(appMetadataRepositoryProvider).get(.manageLocalMediaAndroid); + await ref.read(driftProvider).appMetadataRepository.get(.manageLocalMediaAndroid); if (requiresPrompt && context.mounted) { final confirmed = await showDialog( diff --git a/mobile/lib/providers/infrastructure/app_metadata.provider.dart b/mobile/lib/providers/infrastructure/app_metadata.provider.dart deleted file mode 100644 index 9830ee9c53..0000000000 --- a/mobile/lib/providers/infrastructure/app_metadata.provider.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:immich_mobile/infrastructure/repositories/app_metadata.repository.dart'; -import 'package:immich_mobile/providers/infrastructure/db.provider.dart'; - -final appMetadataRepositoryProvider = Provider( - (ref) => AppMetadataRepository(ref.watch(driftProvider)), -); diff --git a/mobile/lib/providers/infrastructure/asset.provider.dart b/mobile/lib/providers/infrastructure/asset.provider.dart index d72fda1dbe..466a48f276 100644 --- a/mobile/lib/providers/infrastructure/asset.provider.dart +++ b/mobile/lib/providers/infrastructure/asset.provider.dart @@ -1,10 +1,5 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/domain/services/asset.service.dart'; -import 'package:immich_mobile/infrastructure/repositories/local_asset.repository.dart'; -import 'package:immich_mobile/infrastructure/repositories/remote_asset.repository.dart'; -import 'package:immich_mobile/infrastructure/repositories/remote_exif.repository.dart'; -import 'package:immich_mobile/infrastructure/repositories/trashed_local_asset.repository.dart'; -import 'package:immich_mobile/providers/infrastructure/app_metadata.provider.dart'; import 'package:immich_mobile/providers/infrastructure/db.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/repositories/asset_api.repository.dart'; @@ -19,6 +14,7 @@ final assetServiceProvider = Provider((ref) { apiRepository: ref.watch(assetApiRepositoryProvider), mediaRepository: ref.watch(assetMediaRepositoryProvider), trashedLocalRepository: db.trashedLocalAssetRepository, + appMetadataRepository: db.appMetadataRepository, ); }); diff --git a/mobile/lib/providers/infrastructure/sync.provider.dart b/mobile/lib/providers/infrastructure/sync.provider.dart index 4fcc78ccfe..32c6189bb8 100644 --- a/mobile/lib/providers/infrastructure/sync.provider.dart +++ b/mobile/lib/providers/infrastructure/sync.provider.dart @@ -4,9 +4,6 @@ import 'package:immich_mobile/domain/services/local_sync.service.dart'; import 'package:immich_mobile/domain/services/sync_stream.service.dart'; import 'package:immich_mobile/infrastructure/repositories/sync_api.repository.dart'; import 'package:immich_mobile/providers/api.provider.dart'; -import 'package:immich_mobile/providers/infrastructure/album.provider.dart'; -import 'package:immich_mobile/providers/infrastructure/app_metadata.provider.dart'; -import 'package:immich_mobile/providers/infrastructure/asset.provider.dart'; import 'package:immich_mobile/providers/infrastructure/cancel.provider.dart'; import 'package:immich_mobile/providers/infrastructure/db.provider.dart'; import 'package:immich_mobile/providers/infrastructure/platform.provider.dart'; @@ -24,7 +21,7 @@ final syncStreamServiceProvider = Provider((ref) { permissionRepository: ref.watch(permissionRepositoryProvider), syncMigrationRepository: db.syncMigrationRepository, api: ref.watch(apiServiceProvider), - appMetadataRepository: ref.watch(appMetadataRepositoryProvider), + appMetadataRepository: db.appMetadataRepository, cancellation: ref.watch(cancellationProvider), ); }); @@ -40,7 +37,7 @@ final localSyncServiceProvider = Provider((ref) { assetMediaRepository: ref.watch(assetMediaRepositoryProvider), permissionRepository: ref.watch(permissionRepositoryProvider), nativeSyncApi: ref.watch(nativeSyncApiProvider), - appMetadataRepository: ref.watch(appMetadataRepositoryProvider), + appMetadataRepository: db.appMetadataRepository, cancellation: ref.watch(cancellationProvider), ); }); diff --git a/mobile/lib/utils/migration.dart b/mobile/lib/utils/migration.dart index a2ba7812f0..c14e8d9afc 100644 --- a/mobile/lib/utils/migration.dart +++ b/mobile/lib/utils/migration.dart @@ -31,7 +31,7 @@ Future migrateDatabaseIfNeeded(Drift drift) async { .count(where: (row) => row.key.equals(AppMetadataKey.version.name)) .map((count) => count == 0) .getSingle(); - final metadata = AppMetadataRepository(drift); + final metadata = drift.appMetadataRepository; final version = await metadata.get(.version); if (version < 25) { diff --git a/mobile/lib/widgets/settings/advanced_settings.dart b/mobile/lib/widgets/settings/advanced_settings.dart index 29299b4d4c..85ffead995 100644 --- a/mobile/lib/widgets/settings/advanced_settings.dart +++ b/mobile/lib/widgets/settings/advanced_settings.dart @@ -9,6 +9,7 @@ import 'package:immich_mobile/domain/models/app_metadata_key.dart'; import 'package:immich_mobile/domain/services/log.service.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/generated/translations.g.dart'; +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/infrastructure/settings.provider.dart'; @@ -69,7 +70,8 @@ class AdvancedSettings extends HookConsumerWidget { if (isManageMediaSupported.value) { manageLocalMediaAndroid.value = await ref - .read(appMetadataRepositoryProvider) + .read(driftProvider) + .appMetadataRepository .get(AppMetadataKey.manageLocalMediaAndroid); if (!context.mounted) { return; @@ -103,9 +105,9 @@ class AdvancedSettings extends HookConsumerWidget { if (!context.mounted) { return; } - await ref.read(appMetadataRepositoryProvider).set(.manageLocalMediaAndroid, result); + await ref.read(driftProvider).appMetadataRepository.set(.manageLocalMediaAndroid, result); } else { - await ref.read(appMetadataRepositoryProvider).set(.manageLocalMediaAndroid, false); + await ref.read(driftProvider).appMetadataRepository.set(.manageLocalMediaAndroid, false); } }, ), diff --git a/mobile/lib/widgets/settings/beta_sync_settings/sync_status_and_actions.dart b/mobile/lib/widgets/settings/beta_sync_settings/sync_status_and_actions.dart index 234aad1a88..61536eb260 100644 --- a/mobile/lib/widgets/settings/beta_sync_settings/sync_status_and_actions.dart +++ b/mobile/lib/widgets/settings/beta_sync_settings/sync_status_and_actions.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/domain/models/app_metadata_key.dart'; import 'package:immich_mobile/domain/models/server_capability.model.dart'; import 'package:immich_mobile/domain/services/local_album.service.dart'; import 'package:immich_mobile/domain/services/memory.service.dart'; @@ -11,7 +12,6 @@ import 'package:immich_mobile/extensions/platform_extensions.dart'; import 'package:immich_mobile/generated/translations.g.dart'; import 'package:immich_mobile/providers/background_sync.provider.dart'; import 'package:immich_mobile/providers/infrastructure/album.provider.dart'; -import 'package:immich_mobile/providers/infrastructure/app_metadata.provider.dart'; import 'package:immich_mobile/providers/infrastructure/asset.provider.dart'; import 'package:immich_mobile/providers/infrastructure/db.provider.dart'; import 'package:immich_mobile/providers/infrastructure/storage.provider.dart'; @@ -223,7 +223,6 @@ class _SyncStatsCounts extends ConsumerWidget { final localAlbumService = LocalAlbumService(db.localAlbumRepository); final remoteAlbumService = ref.watch(remoteAlbumServiceProvider); final memoryService = DriftMemoryService(db.memoryRepository); - final appSettingsService = ref.watch(appSettingsServiceProvider); Future> loadCounts() async { final assetCounts = assetService.getAssetCounts(); @@ -231,7 +230,7 @@ class _SyncStatsCounts extends ConsumerWidget { final remoteAlbumCounts = remoteAlbumService.getCount(); final memoryCount = memoryService.getCount(); final getLocalHashedCount = assetService.getLocalHashedCount(); - final manageLocalMediaAndroid = appMetadataRepository.get(AppMetadataKey.manageLocalMediaAndroid); + final manageLocalMediaAndroid = db.appMetadataRepository.get(AppMetadataKey.manageLocalMediaAndroid); return await Future.wait([ assetCounts, @@ -343,8 +342,7 @@ class _SyncStatsCounts extends ConsumerWidget { ), ), // To be removed once the experimental feature is stable - if (CurrentPlatform.isAndroid && - appSettingsService.getSetting(AppSettingsEnum.manageLocalMediaAndroid)) ...[ + if (CurrentPlatform.isAndroid && manageLocalMediaAndroid) ...[ SettingGroupTitle(title: context.t.trash), Consumer( builder: (context, ref, _) { diff --git a/mobile/test/unit/presentation/presentation_context.dart b/mobile/test/unit/presentation/presentation_context.dart index a64312fedf..7217f313f5 100644 --- a/mobile/test/unit/presentation/presentation_context.dart +++ b/mobile/test/unit/presentation/presentation_context.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/locales.dart'; +import 'package:immich_mobile/domain/models/app_metadata_key.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/domain/models/user.model.dart'; import 'package:immich_mobile/domain/services/store.service.dart'; @@ -16,7 +17,6 @@ import 'package:immich_mobile/infrastructure/repositories/store.repository.dart' import 'package:immich_mobile/presentation/actions/action.dart'; import 'package:immich_mobile/presentation/actions/action.widget.dart'; import 'package:immich_mobile/providers/infrastructure/album.provider.dart'; -import 'package:immich_mobile/providers/infrastructure/app_metadata.provider.dart'; import 'package:immich_mobile/providers/infrastructure/asset.provider.dart'; import 'package:immich_mobile/providers/infrastructure/db.provider.dart'; import 'package:immich_mobile/providers/infrastructure/user.provider.dart'; @@ -64,12 +64,12 @@ class PresentationContext { serverInfoServiceProvider.overrideWithValue(service.serverInfo), inLockedViewProvider.overrideWithValue(false), assetMediaRepositoryProvider.overrideWithValue(repository.assetMedia.api), - appMetadataRepositoryProvider.overrideWithValue(repository.metadata), ]; Drift _mockDrift() { final drift = MockDrift(); when(() => drift.remoteAssetRepository).thenReturn(repository.remoteAsset.repo); + when(() => drift.appMetadataRepository).thenReturn(repository.metadata); return drift; } @@ -97,6 +97,7 @@ class PresentationContext { void setup() { when(service.user.tryGetMyUser).thenAnswer((_) async => currentUser); when(service.user.service.watchMyUser).thenAnswer((_) => Stream.value(currentUser)); + when(() => repository.metadata.get(AppMetadataKey.manageLocalMediaAndroid)).thenAnswer((_) async => false); } Future dispose() async {