diff --git a/i18n/en.json b/i18n/en.json index 94f6920745..c4cf101b73 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -653,6 +653,7 @@ "clear": "Clear", "clear_all": "Clear all", "clear_all_recent_searches": "Clear all recent searches", + "clear_file_cache": "Clear File Cache", "clear_message": "Clear message", "clear_value": "Clear value", "client_cert_dialog_msg_confirm": "OK", diff --git a/mobile/lib/domain/services/hash.service.dart b/mobile/lib/domain/services/hash.service.dart index 2eb9aec4db..2a07320906 100644 --- a/mobile/lib/domain/services/hash.service.dart +++ b/mobile/lib/domain/services/hash.service.dart @@ -104,6 +104,7 @@ class HashService { DLog.log("Hashed ${hashed.length}/${toHash.length} assets"); await _localAssetRepository.updateHashes(hashed); + await _storageRepository.clearCache(); } } diff --git a/mobile/lib/infrastructure/repositories/storage.repository.dart b/mobile/lib/infrastructure/repositories/storage.repository.dart index 0cf4f20ba8..18302aeb7d 100644 --- a/mobile/lib/infrastructure/repositories/storage.repository.dart +++ b/mobile/lib/infrastructure/repositories/storage.repository.dart @@ -66,4 +66,14 @@ class StorageRepository { } return entity; } + + Future clearCache() async { + final log = Logger('StorageRepository'); + + try { + await PhotoManager.clearFileCache(); + } catch (error, stackTrace) { + log.warning("Error clearing cache", error, stackTrace); + } + } } diff --git a/mobile/lib/services/upload.service.dart b/mobile/lib/services/upload.service.dart index dba3817b2c..9e5193c8cb 100644 --- a/mobile/lib/services/upload.service.dart +++ b/mobile/lib/services/upload.service.dart @@ -99,6 +99,7 @@ class UploadService { } Future manualBackup(List localAssets) async { + await _storageRepository.clearCache(); List tasks = []; for (final asset in localAssets) { final task = await _getUploadTask( @@ -120,6 +121,8 @@ class UploadService { /// Build the upload tasks /// Enqueue the tasks Future startBackup(String userId, void Function(EnqueueStatus status) onEnqueueTasks) async { + await _storageRepository.clearCache(); + shouldAbortQueuingTasks = false; final candidates = await _backupRepository.getCandidates(userId); @@ -159,6 +162,7 @@ class UploadService { Future cancelBackup() async { shouldAbortQueuingTasks = true; + await _storageRepository.clearCache(); await _uploadRepository.reset(kBackupGroup); await _uploadRepository.deleteDatabaseRecords(kBackupGroup); diff --git a/mobile/lib/widgets/settings/beta_sync_settings/beta_sync_settings.dart b/mobile/lib/widgets/settings/beta_sync_settings/beta_sync_settings.dart index 12a3c51e8e..8916fdd92b 100644 --- a/mobile/lib/widgets/settings/beta_sync_settings/beta_sync_settings.dart +++ b/mobile/lib/widgets/settings/beta_sync_settings/beta_sync_settings.dart @@ -10,6 +10,7 @@ import 'package:immich_mobile/providers/infrastructure/asset.provider.dart'; import 'package:immich_mobile/providers/infrastructure/album.provider.dart'; import 'package:immich_mobile/providers/infrastructure/db.provider.dart'; import 'package:immich_mobile/providers/infrastructure/memory.provider.dart'; +import 'package:immich_mobile/providers/infrastructure/storage.provider.dart'; import 'package:immich_mobile/providers/sync_status.provider.dart'; import 'package:immich_mobile/widgets/settings/beta_sync_settings/entity_count_tile.dart'; import 'package:path/path.dart' as path; @@ -104,6 +105,10 @@ class BetaSyncSettings extends HookConsumerWidget { } } + Future clearFileCache() async { + await ref.read(storageRepositoryProvider).clearCache(); + } + return FutureBuilder>( future: loadCounts(), builder: (context, snapshot) { @@ -241,6 +246,14 @@ class BetaSyncSettings extends HookConsumerWidget { const Divider(height: 1, indent: 16, endIndent: 16), const SizedBox(height: 24), _SectionHeaderText(text: "actions".t(context: context)), + ListTile( + title: Text( + "clear_file_cache".t(context: context), + style: const TextStyle(fontWeight: FontWeight.w500), + ), + leading: const Icon(Icons.playlist_remove_rounded), + onTap: clearFileCache, + ), ListTile( title: Text( "export_database".t(context: context), diff --git a/mobile/test/domain/services/hash_service_test.dart b/mobile/test/domain/services/hash_service_test.dart index 1534b2e914..7969131e7f 100644 --- a/mobile/test/domain/services/hash_service_test.dart +++ b/mobile/test/domain/services/hash_service_test.dart @@ -40,6 +40,7 @@ void main() { registerFallbackValue(LocalAssetStub.image1); when(() => mockAssetRepo.updateHashes(any())).thenAnswer((_) async => {}); + when(() => mockStorageRepo.clearCache()).thenAnswer((_) async => {}); }); group('HashService hashAssets', () {