Sfoglia il codice sorgente

Add functionality to add and remove folders from queue

Vishnu Mohandas 4 anni fa
parent
commit
887bcbf06a

+ 19 - 6
lib/core/configuration.dart

@@ -231,12 +231,25 @@ class Configuration {
     }
   }
 
-  Future<void> setPathsToBackUp(Set<String> folders) async {
-    bool shouldSync =
-        !listEquals(getPathsToBackUp().toList(), folders.toList());
-    await _preferences.setStringList(foldersToBackUpKey, folders.toList());
-    if (shouldSync) {
-      SyncService.instance.sync();
+  Future<void> setPathsToBackUp(Set<String> newPaths) async {
+    final currentPaths = getPathsToBackUp();
+    List<String> added = [], removed = [];
+    for (final path in newPaths) {
+      if (!currentPaths.contains(path)) {
+        added.add(path);
+      }
+    }
+    for (final path in currentPaths) {
+      if (!newPaths.contains(path)) {
+        removed.add(path);
+      }
+    }
+    await _preferences.setStringList(foldersToBackUpKey, newPaths.toList());
+    if (added.isNotEmpty) {
+      SyncService.instance.onFoldersAdded(added);
+    }
+    if (removed.isNotEmpty) {
+      SyncService.instance.onFoldersRemoved(removed);
     }
   }
 

+ 2 - 0
lib/core/errors.dart

@@ -10,6 +10,8 @@ class StorageLimitExceededError extends Error {}
 
 class SilentlyCancelUploadsError extends Error {}
 
+class UserCancelledUploadError extends Error {}
+
 class LockAlreadyAcquiredError extends Error {}
 
 class UnauthorizedError extends Error {}

+ 20 - 1
lib/services/sync_service.dart

@@ -174,6 +174,19 @@ class SyncService {
     _doSync();
   }
 
+  Future<void> onFoldersAdded(List<String> paths) async {
+    if (_existingSync != null) {
+      await _existingSync.future;
+    }
+    return sync();
+  }
+
+  void onFoldersRemoved(List<String> paths) {
+    _uploader.removeFromQueueWhere((file) {
+      return paths.contains(file.deviceFolder);
+    }, UserCancelledUploadError());
+  }
+
   Future<void> _doSync() async {
     await _syncWithDevice();
     await syncWithRemote();
@@ -310,7 +323,7 @@ class SyncService {
     _logger.info(updatedFileIDs.length.toString() + " files updated.");
 
     int uploadCounter = 0;
-    final totalUploads = filesToBeUploaded.length + updatedFileIDs.length;
+    int totalUploads = filesToBeUploaded.length + updatedFileIDs.length;
 
     if (totalUploads > 0) {
       Bus.instance.fire(SyncStatusUpdate(SyncStatus.preparing_for_upload));
@@ -362,6 +375,12 @@ class SyncService {
       // Do nothing
     } on SilentlyCancelUploadsError {
       // Do nothing
+    } on UserCancelledUploadError {
+      totalUploads--;
+      final newTotal = await FilesDB.instance.getNumberOfUploadedFiles();
+      Bus.instance.fire(SyncStatusUpdate(SyncStatus.in_progress,
+          completed: newTotal - numberOfFilesCurrentlyUploaded,
+          total: totalUploads));
     } catch (e) {
       throw e;
     }

+ 14 - 0
lib/utils/file_uploader.dart

@@ -166,6 +166,20 @@ class FileUploader {
     }
   }
 
+  void removeFromQueueWhere(final bool Function(File) fn, final Error reason) {
+    List<String> uploadsToBeRemoved = [];
+    _queue.entries
+        .where((entry) => entry.value.status == UploadStatus.not_started)
+        .forEach((pendingUpload) {
+      if (fn(pendingUpload.value.file)) {
+        uploadsToBeRemoved.add(pendingUpload.key);
+      }
+    });
+    for (final id in uploadsToBeRemoved) {
+      _queue.remove(id).completer.completeError(reason);
+    }
+  }
+
   void _pollQueue() {
     if (SyncService.instance.shouldStopSync()) {
       clearQueue(SyncStopRequestedError());