diff --git a/mobile/analysis_options.yaml b/mobile/analysis_options.yaml index 629c71a92d..23efa2a275 100644 --- a/mobile/analysis_options.yaml +++ b/mobile/analysis_options.yaml @@ -77,7 +77,7 @@ custom_lint: - test/**.dart # refactor the remaining providers - lib/providers/{archive,asset,authentication,db,favorite,partner,trash,user}.provider.dart - - lib/providers/{album/album,album/shared_album,asset_viewer/asset_stack,asset_viewer/render_list,backup/backup,search/all_motion_photos,search/recently_added_asset}.provider.dart + - lib/providers/{album/album,album/shared_album,asset_viewer/render_list,backup/backup,search/all_motion_photos,search/recently_added_asset}.provider.dart - import_rule_openapi: message: openapi must only be used through ApiRepositories diff --git a/mobile/lib/interfaces/asset.interface.dart b/mobile/lib/interfaces/asset.interface.dart index 5aec594eb1..65cca6e86c 100644 --- a/mobile/lib/interfaces/asset.interface.dart +++ b/mobile/lib/interfaces/asset.interface.dart @@ -57,6 +57,8 @@ abstract interface class IAssetRepository implements IDatabaseRepository { Future upsertDuplicatedAssets(Iterable duplicatedAssets); Future> getAllDuplicatedAssetIds(); + + Future> getStackAssets(String stackId); } enum AssetSort { checksum, ownerIdChecksum } diff --git a/mobile/lib/providers/asset_viewer/asset_stack.provider.dart b/mobile/lib/providers/asset_viewer/asset_stack.provider.dart index 407aef1610..d7049e4e1e 100644 --- a/mobile/lib/providers/asset_viewer/asset_stack.provider.dart +++ b/mobile/lib/providers/asset_viewer/asset_stack.provider.dart @@ -1,16 +1,15 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/entities/asset.entity.dart'; -import 'package:immich_mobile/providers/db.provider.dart'; -import 'package:isar/isar.dart'; +import 'package:immich_mobile/services/asset.service.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'asset_stack.provider.g.dart'; class AssetStackNotifier extends StateNotifier> { + final AssetService assetService; final String _stackId; - final Ref _ref; - AssetStackNotifier(this._stackId, this._ref) : super([]) { + AssetStackNotifier(this.assetService, this._stackId) : super([]) { _fetchStack(_stackId); } @@ -19,7 +18,7 @@ class AssetStackNotifier extends StateNotifier> { return; } - final stack = await _ref.read(assetStackProvider(stackId).future); + final stack = await assetService.getStackAssets(stackId); if (stack.isNotEmpty) { state = stack; } @@ -35,24 +34,10 @@ class AssetStackNotifier extends StateNotifier> { final assetStackStateProvider = StateNotifierProvider.autoDispose .family, String>( - (ref, stackId) => AssetStackNotifier(stackId, ref), + (ref, stackId) => + AssetStackNotifier(ref.watch(assetServiceProvider), stackId), ); -final assetStackProvider = - FutureProvider.autoDispose.family, String>((ref, stackId) { - return ref - .watch(dbProvider) - .assets - .filter() - .isArchivedEqualTo(false) - .isTrashedEqualTo(false) - .stackIdEqualTo(stackId) - // orders primary asset first as its ID is null - .sortByStackPrimaryAssetId() - .thenByFileCreatedAtDesc() - .findAll(); -}); - @riverpod int assetStackIndex(AssetStackIndexRef ref, Asset asset) { return -1; diff --git a/mobile/lib/repositories/asset.repository.dart b/mobile/lib/repositories/asset.repository.dart index 36e976a1ab..a207e15092 100644 --- a/mobile/lib/repositories/asset.repository.dart +++ b/mobile/lib/repositories/asset.repository.dart @@ -197,6 +197,19 @@ class AssetRepository extends DatabaseRepository implements IAssetRepository { @override Future deleteAllByRemoteId(List ids, {AssetState? state}) => txn(() => _getAllByRemoteIdImpl(ids, state).deleteAll()); + + @override + Future> getStackAssets(String stackId) { + return db.assets + .filter() + .isArchivedEqualTo(false) + .isTrashedEqualTo(false) + .stackIdEqualTo(stackId) + // orders primary asset first as its ID is null + .sortByStackPrimaryAssetId() + .thenByFileCreatedAtDesc() + .findAll(); + } } Future> _getMatchesImpl( diff --git a/mobile/lib/routing/router.gr.dart b/mobile/lib/routing/router.gr.dart index 48528fdfe2..1940ca26db 100644 --- a/mobile/lib/routing/router.gr.dart +++ b/mobile/lib/routing/router.gr.dart @@ -1060,6 +1060,7 @@ class NativeVideoViewerRoute extends PageRouteInfo { required Asset asset, required Widget image, bool showControls = true, + int playbackDelayFactor = 1, List? children, }) : super( NativeVideoViewerRoute.name, @@ -1068,6 +1069,7 @@ class NativeVideoViewerRoute extends PageRouteInfo { asset: asset, image: image, showControls: showControls, + playbackDelayFactor: playbackDelayFactor, ), initialChildren: children, ); @@ -1083,6 +1085,7 @@ class NativeVideoViewerRoute extends PageRouteInfo { asset: args.asset, image: args.image, showControls: args.showControls, + playbackDelayFactor: args.playbackDelayFactor, ); }, ); @@ -1094,6 +1097,7 @@ class NativeVideoViewerRouteArgs { required this.asset, required this.image, this.showControls = true, + this.playbackDelayFactor = 1, }); final Key? key; @@ -1104,9 +1108,11 @@ class NativeVideoViewerRouteArgs { final bool showControls; + final int playbackDelayFactor; + @override String toString() { - return 'NativeVideoViewerRouteArgs{key: $key, asset: $asset, image: $image, showControls: $showControls}'; + return 'NativeVideoViewerRouteArgs{key: $key, asset: $asset, image: $image, showControls: $showControls, playbackDelayFactor: $playbackDelayFactor}'; } } diff --git a/mobile/lib/services/asset.service.dart b/mobile/lib/services/asset.service.dart index 7d27d1b27b..6a9879f650 100644 --- a/mobile/lib/services/asset.service.dart +++ b/mobile/lib/services/asset.service.dart @@ -428,4 +428,8 @@ class AssetService { return 1.0; } + + Future> getStackAssets(String stackId) { + return _assetRepository.getStackAssets(stackId); + } }