Forráskód Böngészése

Delete files in batches on Android

Vishnu 4 éve
szülő
commit
6bd8f413c3
2 módosított fájl, 38 hozzáadás és 11 törlés
  1. 8 7
      lib/ui/free_space_page.dart
  2. 30 4
      lib/utils/delete_file_util.dart

+ 8 - 7
lib/ui/free_space_page.dart

@@ -163,19 +163,20 @@ class _FreeSpacePageState extends State<FreeSpacePage> {
             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(

+ 30 - 4
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<void> deleteFilesOnDeviceOnly(
 
 Future<void> deleteLocalFiles(List<String> localIDs) async {
   List<String> 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);