Sfoglia il codice sorgente

Back up all folders if "select all" is opted for within backup folder selection widget

vishnukvmd 4 anni fa
parent
commit
bdb344f040

+ 14 - 19
lib/core/configuration.dart

@@ -29,7 +29,8 @@ class Configuration {
   Configuration._privateConstructor();
 
   static final Configuration instance = Configuration._privateConstructor();
-  static const endpoint = String.fromEnvironment("endpoint", defaultValue: "https://api.ente.io");
+  static const endpoint =
+      String.fromEnvironment("endpoint", defaultValue: "https://api.ente.io");
   static const emailKey = "email";
   static const foldersToBackUpKey = "folders_to_back_up";
   static const keyAttributesKey = "key_attributes";
@@ -48,6 +49,8 @@ class Configuration {
   static const userIDKey = "user_id";
   static const hasMigratedSecureStorageToFirstUnlockKey =
       "has_migrated_secure_storage_to_first_unlock";
+  static const hasSelectedAllFoldersForBackupKey =
+      "has_selected_all_folders_for_backup";
 
   final kTempFolderDeletionTimeBuffer = Duration(days: 1).inMicroseconds;
 
@@ -322,25 +325,9 @@ class Configuration {
   }
 
   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);
-    }
+    SyncService.instance.onFoldersSet(newPaths);
+    SyncService.instance.sync();
   }
 
   Future<void> addPathToFoldersToBeBackedUp(String path) async {
@@ -499,6 +486,14 @@ class Configuration {
     return _preferences.getBool(keyHasSkippedBackupFolderSelection) ?? false;
   }
 
+  bool hasSelectedAllFoldersForBackup() {
+    return _preferences.getBool(hasSelectedAllFoldersForBackupKey) ?? false;
+  }
+
+  Future<void> setSelectAllFoldersForBackup(bool value) async {
+    await _preferences.setBool(hasSelectedAllFoldersForBackupKey, value);
+  }
+
   Future<void> _migrateSecurityStorageToFirstUnlock() async {
     final hasMigratedSecureStorageToFirstUnlock =
         _preferences.getBool(hasMigratedSecureStorageToFirstUnlockKey) ?? false;

+ 11 - 6
lib/models/filters/important_items_filter.dart

@@ -1,16 +1,21 @@
 import 'dart:io';
 
+import 'package:path/path.dart';
 import 'package:photos/core/configuration.dart';
-import 'package:photos/models/filters/gallery_items_filter.dart';
 import 'package:photos/models/file.dart';
-import 'package:path/path.dart';
+import 'package:photos/models/filters/gallery_items_filter.dart';
 
 class ImportantItemsFilter implements GalleryItemsFilter {
-  final importantPaths = Configuration.instance.getPathsToBackUp();
+  final _importantPaths = Configuration.instance.getPathsToBackUp();
+  final _hasSelectedAllFoldersForBackup =
+      Configuration.instance.hasSelectedAllFoldersForBackup();
 
   @override
   bool shouldInclude(File file) {
-    if (importantPaths.isEmpty) {
+    if (_hasSelectedAllFoldersForBackup) {
+      return true;
+    }
+    if (_importantPaths.isEmpty) {
       if (Platform.isAndroid) {
         if (file.uploadedFileID != null) {
           return true;
@@ -28,7 +33,7 @@ class ImportantItemsFilter implements GalleryItemsFilter {
     if (file.uploadedFileID != null) {
       return true;
     }
-    final String folder = basename(file.deviceFolder);
-    return importantPaths.contains(folder);
+    final folder = basename(file.deviceFolder);
+    return _importantPaths.contains(folder);
   }
 }

+ 5 - 2
lib/services/remote_sync_service.dart

@@ -79,9 +79,12 @@ class RemoteSyncService {
 
   Future<bool> _uploadDiff() async {
     final foldersToBackUp = Configuration.instance.getPathsToBackUp();
+    final hasSelectedAllFoldersForBackup =
+        Configuration.instance.hasSelectedAllFoldersForBackup();
     List<File> filesToBeUploaded;
-    if (LocalSyncService.instance.hasGrantedLimitedPermissions() &&
-        foldersToBackUp.isEmpty) {
+    if (hasSelectedAllFoldersForBackup ||
+        (LocalSyncService.instance.hasGrantedLimitedPermissions() &&
+            foldersToBackUp.isEmpty)) {
       filesToBeUploaded = await _db.getAllLocalFiles();
     } else {
       filesToBeUploaded =

+ 2 - 9
lib/services/sync_service.dart

@@ -157,16 +157,9 @@ class SyncService {
     LocalSyncService.instance.addChangeCallback(() => sync());
   }
 
-  Future<void> onFoldersAdded(List<String> paths) async {
-    if (_existingSync != null) {
-      await _existingSync.future;
-    }
-    return sync();
-  }
-
-  void onFoldersRemoved(List<String> paths) {
+  void onFoldersSet(Set<String> paths) {
     _uploader.removeFromQueueWhere((file) {
-      return paths.contains(file.deviceFolder);
+      return !paths.contains(file.deviceFolder);
     }, UserCancelledUploadError());
   }
 

+ 4 - 1
lib/ui/backup_folder_selection_page.dart

@@ -50,7 +50,8 @@ class _BackupFolderSelectionPageState extends State<BackupFolderSelectionPage> {
         for (final file in _latestFiles) {
           _allFolders.add(file.deviceFolder);
         }
-        if (widget.shouldSelectAll) {
+        if (widget.shouldSelectAll ||
+            Configuration.instance.hasSelectedAllFoldersForBackup()) {
           _selectedFolders.addAll(_allFolders);
         }
       });
@@ -135,6 +136,8 @@ class _BackupFolderSelectionPageState extends State<BackupFolderSelectionPage> {
                     : () async {
                         await Configuration.instance
                             .setPathsToBackUp(_selectedFolders);
+                        Configuration.instance.setSelectAllFoldersForBackup(
+                            _selectedFolders.length == _allFolders.length);
                         Bus.instance.fire(BackupFoldersUpdatedEvent());
                         Navigator.of(context).pop();
                       },

+ 3 - 2
lib/ui/collections_gallery_widget.dart

@@ -13,8 +13,8 @@ import 'package:photos/events/local_photos_updated_event.dart';
 import 'package:photos/events/tab_changed_event.dart';
 import 'package:photos/events/user_logged_out_event.dart';
 import 'package:photos/models/collection_items.dart';
-import 'package:photos/services/collections_service.dart';
 import 'package:photos/models/device_folder.dart';
+import 'package:photos/services/collections_service.dart';
 import 'package:photos/ui/collection_page.dart';
 import 'package:photos/ui/common_elements.dart';
 import 'package:photos/ui/device_folder_page.dart';
@@ -250,7 +250,8 @@ class DeviceFolderIcon extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     final isBackedUp =
-        Configuration.instance.getPathsToBackUp().contains(folder.path);
+        Configuration.instance.getPathsToBackUp().contains(folder.path) ||
+            Configuration.instance.hasSelectedAllFoldersForBackup();
     return GestureDetector(
       child: Container(
         height: 140,

+ 2 - 1
lib/ui/device_folder_page.dart

@@ -74,7 +74,8 @@ class _BackupConfigurationHeaderWidgetState
   @override
   Widget build(BuildContext context) {
     final isBackedUp =
-        Configuration.instance.getPathsToBackUp().contains(widget.path);
+        Configuration.instance.getPathsToBackUp().contains(widget.path) ||
+            Configuration.instance.hasSelectedAllFoldersForBackup();
     return Container(
       padding: EdgeInsets.only(left: 12, right: 12),
       margin: EdgeInsets.only(bottom: 12),

+ 7 - 0
lib/ui/home_widget.dart

@@ -286,6 +286,13 @@ class _HomeWidgetState extends State<HomeWidget> {
     }
     final gallery = Gallery(
       asyncLoader: (creationStartTime, creationEndTime, {limit, asc}) {
+        final hasSelectedAllFoldersForBackup =
+            Configuration.instance.hasSelectedAllFoldersForBackup();
+        if (hasSelectedAllFoldersForBackup) {
+          return FilesDB.instance.getAllLocalAndUploadedFiles(
+              creationStartTime, creationEndTime,
+              limit: limit, asc: asc);
+        }
         final importantPaths = Configuration.instance.getPathsToBackUp();
         if (importantPaths.isNotEmpty) {
           return FilesDB.instance.getImportantFiles(