diff --git a/mobile/lib/domain/services/asset.service.dart b/mobile/lib/domain/services/asset.service.dart index c4e7a7dc6..8e490920b 100644 --- a/mobile/lib/domain/services/asset.service.dart +++ b/mobile/lib/domain/services/asset.service.dart @@ -63,13 +63,13 @@ class AssetService { return [asset, ...stack]; } - Future getExif(BaseAsset asset) async { + Stream watchExif(BaseAsset asset) { if (!asset.hasRemote) { - return null; + return Stream.value(null); } final id = asset is LocalAsset ? asset.remoteId! : (asset as RemoteAsset).id; - return _remoteRepository.getExif(id); + return _remoteRepository.watchExif(id); } Future> getPlaces(String userId) { diff --git a/mobile/lib/infrastructure/repositories/remote_asset.repository.dart b/mobile/lib/infrastructure/repositories/remote_asset.repository.dart index b3e29d24d..b5cec0dd3 100644 --- a/mobile/lib/infrastructure/repositories/remote_asset.repository.dart +++ b/mobile/lib/infrastructure/repositories/remote_asset.repository.dart @@ -64,12 +64,10 @@ class RemoteAssetRepository extends DatabaseAccessor with $RemoteAssetRep return query.map((row) => row.toDto()).get(); } - Future getExif(String id) { - return _db.managers.remoteExifEntity - .filter((row) => row.assetId.id.equals(id)) - .map((row) => row.toDto()) - .getSingleOrNull(); - } + Stream watchExif(String id) => _db.managers.remoteExifEntity + .filter((row) => row.assetId.id.equals(id)) + .map((row) => row.toDto()) + .watchSingleOrNull(); Future> getPlaces(String userId) { final asset = Subquery( diff --git a/mobile/lib/presentation/actions/edit_asset.action.dart b/mobile/lib/presentation/actions/edit_asset.action.dart index 9da7fed1f..96fd222d2 100644 --- a/mobile/lib/presentation/actions/edit_asset.action.dart +++ b/mobile/lib/presentation/actions/edit_asset.action.dart @@ -50,7 +50,7 @@ class EditAssetAction extends AssetActionBuilder { try { // TODO(shenlong): Move all EXIF and Apply Edits logic onto the Route final repository = ref.read(driftProvider).remoteAssetRepository; - final (edits, exif) = await (repository.getAssetEdits(asset.id), repository.getExif(asset.id)).wait; + final (edits, exif) = await (repository.getAssetEdits(asset.id), repository.watchExif(asset.id).first).wait; if (exif == null || !context.mounted) { return; } diff --git a/mobile/lib/presentation/actions/edit_datetime.action.dart b/mobile/lib/presentation/actions/edit_datetime.action.dart index 4ca3ddbaf..47715a6c7 100644 --- a/mobile/lib/presentation/actions/edit_datetime.action.dart +++ b/mobile/lib/presentation/actions/edit_datetime.action.dart @@ -6,7 +6,6 @@ import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/generated/translations.g.dart'; import 'package:immich_mobile/presentation/actions/action.dart'; import 'package:immich_mobile/providers/infrastructure/asset.provider.dart'; -import 'package:immich_mobile/providers/infrastructure/asset_viewer/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/utils/error_handler.dart'; @@ -56,7 +55,7 @@ class EditDateTimeAction extends AssetActionBuilder { Duration? offset; if (origin != null) { - final exif = await remoteAssetRepository.getExif(origin.id); + final exif = await remoteAssetRepository.watchExif(origin.id).first; // Prefer the EXIF timezone, so the picker opens on what the asset actually shows. DateTime dateTime = origin.createdAt.toLocal(); @@ -96,6 +95,5 @@ Future saveDateTime(BuildContext context, WidgetRef ref, List asse final toastService = ref.read(toastServiceProvider); await ref.read(assetServiceProvider).update(assetIds, dateTime: .some(dateTime)); - ref.invalidate(assetExifProvider); toastService.success(message); } diff --git a/mobile/lib/presentation/actions/edit_location.action.dart b/mobile/lib/presentation/actions/edit_location.action.dart index 01318de99..4265811ac 100644 --- a/mobile/lib/presentation/actions/edit_location.action.dart +++ b/mobile/lib/presentation/actions/edit_location.action.dart @@ -6,7 +6,6 @@ import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/generated/translations.g.dart'; import 'package:immich_mobile/presentation/actions/action.dart'; import 'package:immich_mobile/providers/infrastructure/asset.provider.dart'; -import 'package:immich_mobile/providers/infrastructure/asset_viewer/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/utils/error_handler.dart'; @@ -53,7 +52,7 @@ class EditLocationAction extends AssetActionBuilder { try { LatLng? initialLatLng; if (origin != null) { - final exif = await remoteAssetRepository.getExif(origin.id); + final exif = await remoteAssetRepository.watchExif(origin.id).first; if (exif?.latitude != null && exif?.longitude != null) { initialLatLng = LatLng(exif!.latitude!, exif.longitude!); } @@ -81,6 +80,5 @@ Future saveLocation(BuildContext context, WidgetRef ref, List asse final toastService = ref.read(toastServiceProvider); await ref.read(assetServiceProvider).update(assetIds, location: .some(location)); - ref.invalidate(assetExifProvider); toastService.success(message); } diff --git a/mobile/lib/presentation/pages/asset_troubleshoot.page.dart b/mobile/lib/presentation/pages/asset_troubleshoot.page.dart index 81d765239..da8bcb37a 100644 --- a/mobile/lib/presentation/pages/asset_troubleshoot.page.dart +++ b/mobile/lib/presentation/pages/asset_troubleshoot.page.dart @@ -159,7 +159,7 @@ class _AssetPropertiesSectionState extends ConsumerState<_AssetPropertiesSection properties.insertAll(4, additionalProps); - final exif = await ref.read(assetServiceProvider).getExif(asset); + final exif = await ref.read(assetServiceProvider).watchExif(asset).first; if (exif != null) { _addExifProperties(exif); } else { diff --git a/mobile/lib/providers/infrastructure/asset_viewer/asset.provider.dart b/mobile/lib/providers/infrastructure/asset_viewer/asset.provider.dart index 82ab69b99..6fce0475d 100644 --- a/mobile/lib/providers/infrastructure/asset_viewer/asset.provider.dart +++ b/mobile/lib/providers/infrastructure/asset_viewer/asset.provider.dart @@ -3,6 +3,6 @@ import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/domain/models/exif.model.dart'; import 'package:immich_mobile/providers/infrastructure/asset.provider.dart'; -final assetExifProvider = FutureProvider.autoDispose.family((ref, asset) { - return ref.watch(assetServiceProvider).getExif(asset); +final assetExifProvider = StreamProvider.autoDispose.family((ref, asset) { + return ref.watch(assetServiceProvider).watchExif(asset); }); diff --git a/mobile/test/unit/mocks.dart b/mobile/test/unit/mocks.dart index 1040e7680..14f196dcf 100644 --- a/mobile/test/unit/mocks.dart +++ b/mobile/test/unit/mocks.dart @@ -70,7 +70,7 @@ class RepositoryMocks { } void _stubRemoteAssetRepository() { - when(remoteAsset.getExif).thenAnswer((_) async => null); + when(remoteAsset.watchExif).thenAnswer((_) => Stream.value(null)); when(remoteAsset.getAssetEdits).thenAnswer((_) async => const []); when(remoteAsset.update).thenAnswer((_) async {}); } @@ -269,8 +269,8 @@ extension type const LocalAssetRepositoryStub(MockLocalAssetRepository repo) imp extension type const RemoteAssetRepositoryStub(MockRemoteAssetRepository repo) implements Stub { - Future Function() get getExif => - () => repo.getExif(any()); + Stream Function() get watchExif => + () => repo.watchExif(any()); Future> Function() get getAssetEdits => () => repo.getAssetEdits(any()); diff --git a/mobile/test/unit/presentation/actions/edit_action_test.dart b/mobile/test/unit/presentation/actions/edit_action_test.dart index 9e8dcfb4b..c609119f6 100644 --- a/mobile/test/unit/presentation/actions/edit_action_test.dart +++ b/mobile/test/unit/presentation/actions/edit_action_test.dart @@ -111,7 +111,7 @@ void main() { await tester.pump(); verify(() => context.repository.remoteAsset.repo.getAssetEdits(asset.id)).called(1); - verify(() => context.repository.remoteAsset.repo.getExif(asset.id)).called(1); + verify(() => context.repository.remoteAsset.repo.watchExif(asset.id)).called(1); }); });