feature(mobile, beta, Android): handle remote asset trash/restore events and rescan media

- Handle move to trash and restore from trash for remote assets on Android
- Trigger MediaScannerConnection to rescan affected media files
This commit is contained in:
Peter Ombodi 2025-07-31 18:34:36 +03:00
parent f972b8d514
commit cf920ea438
9 changed files with 140 additions and 6 deletions

View file

@ -1,6 +1,7 @@
import 'dart:async';
import 'package:immich_mobile/domain/models/sync_event.model.dart';
import 'package:immich_mobile/domain/services/asset.service.dart';
import 'package:immich_mobile/infrastructure/repositories/sync_api.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/sync_stream.repository.dart';
import 'package:immich_mobile/presentation/pages/dev/dev_logger.dart';
@ -12,14 +13,17 @@ class SyncStreamService {
final SyncApiRepository _syncApiRepository;
final SyncStreamRepository _syncStreamRepository;
final AssetService _assetService;
final bool Function()? _cancelChecker;
SyncStreamService({
required SyncApiRepository syncApiRepository,
required SyncStreamRepository syncStreamRepository,
required AssetService assetService,
bool Function()? cancelChecker,
}) : _syncApiRepository = syncApiRepository,
_syncStreamRepository = syncStreamRepository,
_assetService = assetService,
_cancelChecker = cancelChecker;
bool get isCancelled => _cancelChecker?.call() ?? false;
@ -114,7 +118,11 @@ class SyncStreamService {
case SyncEntityType.partnerDeleteV1:
return _syncStreamRepository.deletePartnerV1(data.cast());
case SyncEntityType.assetV1:
return _syncStreamRepository.updateAssetsV1(data.cast());
final remoteSyncAssets = data.cast<SyncAssetV1>();
await _assetService.handleRemoteTrashChanges(
remoteSyncAssets.map((e) => (checksum: e.checksum, deletedAt: e.deletedAt)),
);
return _syncStreamRepository.updateAssetsV1(remoteSyncAssets);
case SyncEntityType.assetDeleteV1:
return _syncStreamRepository.deleteAssetsV1(data.cast());
case SyncEntityType.assetExifV1: