From 5e6860f2cd6de89bb167b1bce4c852385201a2a9 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 21 Feb 2025 20:04:12 +0530 Subject: [PATCH] [mob][photos] Avoid localIDs of non-existant assets from being passed to photo_manager's deleteWithIds() when using free up space feature to avoid complete failure of free up space operation --- mobile/lib/db/files_db.dart | 21 ++++++++++++++++----- mobile/lib/utils/delete_file_util.dart | 18 +++++++++++++----- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/mobile/lib/db/files_db.dart b/mobile/lib/db/files_db.dart index c734044c4c..8b36d6d580 100644 --- a/mobile/lib/db/files_db.dart +++ b/mobile/lib/db/files_db.dart @@ -1272,15 +1272,26 @@ class FilesDB { ); } - Future> getLocalFiles(List localIDs) async { + Future> getLocalFiles( + List localIDs, { + bool dedupeByLocalID = false, + }) async { + late final String query; final inParam = localIDs.map((id) => "'$id'").join(','); final db = await instance.sqliteAsyncDB; - final results = await db.getAll( - ''' + if (dedupeByLocalID) { + query = ''' + SELECT * FROM $filesTable + WHERE $columnLocalID IN ($inParam) + GROUP BY $columnLocalID; + '''; + } else { + query = ''' SELECT * FROM $filesTable WHERE $columnLocalID IN ($inParam); - ''', - ); + '''; + } + final results = await db.getAll(query); return convertToFiles(results); } diff --git a/mobile/lib/utils/delete_file_util.dart b/mobile/lib/utils/delete_file_util.dart index 3a1dc7c25d..03e5455a88 100644 --- a/mobile/lib/utils/delete_file_util.dart +++ b/mobile/lib/utils/delete_file_util.dart @@ -325,18 +325,26 @@ Future deleteLocalFiles( BuildContext context, List localIDs, ) async { + final files = + await FilesDB.instance.getLocalFiles(localIDs, dedupeByLocalID: true); final List deletedIDs = []; final List localAssetIDs = []; final List localSharedMediaIDs = []; + final List alreadyDeletedIDs = []; // to ignore already deleted files + try { - for (String id in localIDs) { - if (id.startsWith(oldSharedMediaIdentifier) || - id.startsWith(sharedMediaIdentifier)) { - localSharedMediaIDs.add(id); + for (final file in files) { + if (!(await _localFileExist(file))) { + _logger.warning("Already deleted " + file.toString()); + alreadyDeletedIDs.add(file.localID!); + } else if (file.localID!.startsWith(oldSharedMediaIdentifier) || + file.localID!.startsWith(sharedMediaIdentifier)) { + localSharedMediaIDs.add(file.localID!); } else { - localAssetIDs.add(id); + localAssetIDs.add(file.localID!); } } + deletedIDs.addAll(alreadyDeletedIDs); deletedIDs.addAll(await _tryDeleteSharedMediaFiles(localSharedMediaIDs)); final bool shouldDeleteInBatches =