import 'dart:io'; import 'package:immich_mobile/domain/interfaces/device_album.interface.dart'; import 'package:immich_mobile/domain/interfaces/device_asset.interface.dart'; import 'package:immich_mobile/domain/models/album.model.dart'; import 'package:immich_mobile/domain/models/asset.model.dart'; import 'package:immich_mobile/service_locator.dart'; import 'package:immich_mobile/utils/mixins/log.mixin.dart'; import 'package:photo_manager/photo_manager.dart'; class DeviceAlbumRepository with LogMixin implements IDeviceAlbumRepository { const DeviceAlbumRepository(); @override Future> getAll() async { final List assetPathEntities = await PhotoManager.getAssetPathList( hasAll: Platform.isIOS, filterOption: FilterOptionGroup(containsPathModified: true), ); return assetPathEntities.map(_toModel).toList(); } @override Future> getAssetsForAlbum( String albumId, { int start = 0, int end = 0x7fffffffffffffff, DateTime? modifiedFrom, DateTime? modifiedUntil, bool orderByModificationDate = false, }) async { final album = await _getDeviceAlbum( albumId, modifiedFrom: modifiedFrom, modifiedUntil: modifiedUntil, orderByModificationDate: orderByModificationDate, ); final List assets = await album.getAssetListRange(start: start, end: end); return await Future.wait( assets.map((a) async => await di().toAsset(a)), ); } Future _getDeviceAlbum( String albumId, { DateTime? modifiedFrom, DateTime? modifiedUntil, bool orderByModificationDate = false, }) async { return await AssetPathEntity.fromId( albumId, filterOption: FilterOptionGroup( containsPathModified: true, orders: orderByModificationDate ? [const OrderOption(type: OrderOptionType.updateDate)] : [], imageOption: const FilterOption(needTitle: true), videoOption: const FilterOption(needTitle: true), updateTimeCond: DateTimeCond( min: modifiedFrom ?? DateTime.utc(-271820), max: modifiedUntil ?? DateTime.utc(275760), ignore: modifiedFrom != null || modifiedUntil != null, ), ), ); } @override Future getAssetCount(String albumId) async { final album = await _getDeviceAlbum(albumId); return await album.assetCountAsync; } } Album _toModel(AssetPathEntity album) { return Album( localId: album.id, name: album.name, modifiedTime: album.lastModified ?? DateTime.now(), ); }