From 6bd8f413c3e1817f6c89e9b775887d6458ebdc26 Mon Sep 17 00:00:00 2001 From: Vishnu Date: Mon, 28 Jun 2021 18:24:57 +0530 Subject: [PATCH] Delete files in batches on Android --- lib/ui/free_space_page.dart | 15 ++++++++------- lib/utils/delete_file_util.dart | 34 +++++++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/lib/ui/free_space_page.dart b/lib/ui/free_space_page.dart index a6ddf2030..f24eb6288 100644 --- a/lib/ui/free_space_page.dart +++ b/lib/ui/free_space_page.dart @@ -163,19 +163,20 @@ class _FreeSpacePageState extends State { height: 64, padding: const EdgeInsets.fromLTRB(80, 0, 80, 0), child: button( - "free up " + convertBytesToReadableFormat(status.size), + "free up " + formatBytes(status.size), onPressed: () async { - final dialog = - createProgressDialog(context, "freeing up space..."); + final dialog = createProgressDialog( + context, + "deleting " + + status.localIDs.length.toString() + + " backed up files..."); await dialog.show(); - deleteLocalFiles(status.localIDs); + await deleteLocalFiles(status.localIDs); await dialog.hide(); - // Navigator.of(context).pop(); - // _confettiController.play(); AlertDialog alert = AlertDialog( title: Text("success"), content: Text("you have successfully freed up " + - convertBytesToReadableFormat(status.size) + + formatBytes(status.size) + "!"), actions: [ TextButton( diff --git a/lib/utils/delete_file_util.dart b/lib/utils/delete_file_util.dart index 8078c2cbe..4d055fdd5 100644 --- a/lib/utils/delete_file_util.dart +++ b/lib/utils/delete_file_util.dart @@ -1,4 +1,6 @@ import 'dart:async'; +import 'dart:io'; +import 'dart:math'; import 'package:flutter/widgets.dart'; import 'package:logging/logging.dart'; @@ -138,10 +140,34 @@ Future deleteFilesOnDeviceOnly( Future deleteLocalFiles(List localIDs) async { List deletedIDs = []; - try { - deletedIDs = await PhotoManager.editor.deleteWithIds(localIDs); - } catch (e, s) { - _logger.severe("Could not delete files", e, s); + if (Platform.isAndroid) { + const batchSize = 100; + for (int index = 0; index < localIDs.length; index += batchSize) { + final ids = localIDs + .getRange(index, min(localIDs.length, index + batchSize)) + .toList(); + _logger.info("Trying to delete " + ids.toString()); + try { + deletedIDs.addAll(await PhotoManager.editor.deleteWithIds(ids)); + _logger.info("Deleted " + ids.toString()); + } catch (e, s) { + _logger.severe("Could not delete batch " + ids.toString(), e, s); + for (final id in ids) { + try { + deletedIDs.addAll(await PhotoManager.editor.deleteWithIds([id])); + _logger.info("Deleted " + id); + } catch (e, s) { + _logger.severe("Could not delete file " + id, e, s); + } + } + } + } + } else { + try { + deletedIDs.addAll(await PhotoManager.editor.deleteWithIds(localIDs)); + } catch (e, s) { + _logger.severe("Could not delete files ", e, s); + } } if (deletedIDs.isNotEmpty) { final deletedFiles = await FilesDB.instance.getLocalFiles(deletedIDs);