Prechádzať zdrojové kódy

Define precise event types for file deletion

vishnukvmd 3 rokov pred
rodič
commit
a7f96ae1f3

+ 5 - 1
lib/events/files_updated_event.dart

@@ -13,5 +13,9 @@ class FilesUpdatedEvent extends Event {
 
 enum EventType {
   added_or_updated,
-  deleted,
+  deleted_from_device,
+  deleted_from_remote,
+  deleted_from_everywhere,
+  archived,
+  unarchived,
 }

+ 1 - 1
lib/services/collections_service.dart

@@ -511,7 +511,7 @@ class CollectionsService {
           fromCollectionID, files.map((e) => e.uploadedFileID).toList());
       Bus.instance.fire(CollectionUpdatedEvent(toCollectionID, files));
       Bus.instance.fire(CollectionUpdatedEvent(fromCollectionID, files,
-          type: EventType.deleted));
+          type: EventType.deleted_from_remote));
     });
   }
 

+ 5 - 3
lib/services/file_magic_service.dart

@@ -32,12 +32,14 @@ class FileMagicService {
   Future<void> changeVisibility(List<File> files, int visibility) async {
     Map<String, dynamic> update = {kMagicKeyVisibility: visibility};
     await _updateMagicData(files, update);
-    // h4ck: Remove archived elements from the UI. If this was an archival,
-    // ArchivePage will reload the new items anyway
-    Bus.instance.fire(LocalPhotosUpdatedEvent(files, type: EventType.deleted));
     if (visibility == kVisibilityVisible) {
       // Force reload home gallery to pull in the now unarchived files
       Bus.instance.fire(ForceReloadHomeGalleryEvent());
+      Bus.instance
+          .fire(LocalPhotosUpdatedEvent(files, type: EventType.unarchived));
+    } else {
+      Bus.instance
+          .fire(LocalPhotosUpdatedEvent(files, type: EventType.archived));
     }
   }
 

+ 3 - 3
lib/services/remote_sync_service.dart

@@ -113,9 +113,9 @@ class RemoteSyncService {
           (await FilesDB.instance.getFilesFromIDs(fileIDs)).values.toList();
       await FilesDB.instance.deleteFilesFromCollection(collectionID, fileIDs);
       Bus.instance.fire(CollectionUpdatedEvent(collectionID, deletedFiles,
-          type: EventType.deleted));
-      Bus.instance
-          .fire(LocalPhotosUpdatedEvent(deletedFiles, type: EventType.deleted));
+          type: EventType.deleted_from_remote));
+      Bus.instance.fire(LocalPhotosUpdatedEvent(deletedFiles,
+          type: EventType.deleted_from_remote));
     }
     if (diff.updatedFiles.isNotEmpty) {
       await _storeDiff(diff.updatedFiles, collectionID);

+ 1 - 2
lib/ui/archive_page.dart

@@ -1,5 +1,3 @@
-import 'dart:io';
-
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:photos/core/configuration.dart';
@@ -38,6 +36,7 @@ class ArchivePage extends StatelessWidget {
                     orElse: () => null) !=
                 null,
           ),
+      removalEventTypes: const {EventType.unarchived},
       forceReloadEvents: [
         Bus.instance.on<FilesUpdatedEvent>().where(
               (event) =>

+ 5 - 2
lib/ui/collection_page.dart

@@ -1,10 +1,9 @@
-import 'dart:io';
-
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:photos/core/event_bus.dart';
 import 'package:photos/db/files_db.dart';
 import 'package:photos/events/collection_updated_event.dart';
+import 'package:photos/events/files_updated_event.dart';
 import 'package:photos/models/collection_items.dart';
 import 'package:photos/models/selected_files.dart';
 
@@ -35,6 +34,10 @@ class CollectionPage extends StatelessWidget {
       reloadEvent: Bus.instance
           .on<CollectionUpdatedEvent>()
           .where((event) => event.collectionID == c.collection.id),
+      removalEventTypes: const {
+        EventType.deleted_from_remote,
+        EventType.deleted_from_everywhere,
+      },
       tagPrefix: tagPrefix,
       selectedFiles: _selectedFiles,
       initialFiles: initialFiles,

+ 5 - 2
lib/ui/device_folder_page.dart

@@ -1,10 +1,9 @@
-import 'dart:io';
-
 import 'package:flutter/material.dart';
 import 'package:photos/core/configuration.dart';
 import 'package:photos/core/event_bus.dart';
 import 'package:photos/db/files_db.dart';
 import 'package:photos/events/backup_folders_updated_event.dart';
+import 'package:photos/events/files_updated_event.dart';
 import 'package:photos/events/local_photos_updated_event.dart';
 import 'package:photos/models/device_folder.dart';
 import 'package:photos/models/selected_files.dart';
@@ -26,6 +25,10 @@ class DeviceFolderPage extends StatelessWidget {
             limit: limit, asc: asc);
       },
       reloadEvent: Bus.instance.on<LocalPhotosUpdatedEvent>(),
+      removalEventTypes: const {
+        EventType.deleted_from_device,
+        EventType.deleted_from_everywhere,
+      },
       tagPrefix: "device_folder:" + folder.path,
       selectedFiles: _selectedFiles,
       header: Configuration.instance.hasConfiguredAccount()

+ 3 - 0
lib/ui/gallery.dart

@@ -25,6 +25,7 @@ class Gallery extends StatefulWidget {
   final List<File> initialFiles;
   final Stream<FilesUpdatedEvent> reloadEvent;
   final List<Stream<Event>> forceReloadEvents;
+  final Set<EventType> removalEventTypes;
   final SelectedFiles selectedFiles;
   final String tagPrefix;
   final Widget header;
@@ -37,6 +38,7 @@ class Gallery extends StatefulWidget {
     this.initialFiles,
     this.reloadEvent,
     this.forceReloadEvents,
+    this.removalEventTypes = const {},
     this.header,
     this.footer,
     Key key,
@@ -186,6 +188,7 @@ class _GalleryState extends State<Gallery> {
           _collatedFiles[index],
           index,
           widget.reloadEvent,
+          widget.removalEventTypes,
           widget.asyncLoader,
           widget.selectedFiles,
           widget.tagPrefix,

+ 6 - 0
lib/ui/home_widget.dart

@@ -14,6 +14,7 @@ import 'package:photos/core/event_bus.dart';
 import 'package:photos/db/files_db.dart';
 import 'package:photos/events/account_configured_event.dart';
 import 'package:photos/events/backup_folders_updated_event.dart';
+import 'package:photos/events/files_updated_event.dart';
 import 'package:photos/events/force_reload_home_gallery_event.dart';
 import 'package:photos/events/local_photos_updated_event.dart';
 import 'package:photos/events/permission_granted_event.dart';
@@ -365,6 +366,11 @@ class _HomeWidgetState extends State<HomeWidget> {
         return result;
       },
       reloadEvent: Bus.instance.on<LocalPhotosUpdatedEvent>(),
+      removalEventTypes: const {
+        EventType.deleted_from_remote,
+        EventType.deleted_from_everywhere,
+        EventType.archived,
+      },
       forceReloadEvents: [
         Bus.instance.on<BackupFoldersUpdatedEvent>(),
         Bus.instance.on<ForceReloadHomeGalleryEvent>(),

+ 4 - 2
lib/ui/huge_listview/lazy_loading_gallery.dart

@@ -21,6 +21,7 @@ class LazyLoadingGallery extends StatefulWidget {
   final List<File> files;
   final int index;
   final Stream<FilesUpdatedEvent> reloadEvent;
+  final Set<EventType> removalEventTypes;
   final GalleryLoader asyncLoader;
   final SelectedFiles selectedFiles;
   final String tag;
@@ -30,6 +31,7 @@ class LazyLoadingGallery extends StatefulWidget {
     this.files,
     this.index,
     this.reloadEvent,
+    this.removalEventTypes,
     this.asyncLoader,
     this.selectedFiles,
     this.tag,
@@ -101,8 +103,8 @@ class _LazyLoadingGalleryState extends State<LazyLoadingGallery> {
             _files = result.files;
           });
         }
-      } else {
-        // Files were deleted
+      } else if (widget.removalEventTypes.contains(event.type)) {
+        // Files were removed
         final updateFileIDs = <int>{};
         for (final file in filesUpdatedThisDay) {
           updateFileIDs.add(file.generatedID);

+ 10 - 8
lib/utils/delete_file_util.dart

@@ -102,13 +102,13 @@ Future<void> deleteFilesFromEverywhere(
         deletedFiles
             .where((file) => file.collectionID == collectionID)
             .toList(),
-        type: EventType.deleted,
+        type: EventType.deleted_from_everywhere,
       ));
     }
   }
   if (deletedFiles.isNotEmpty) {
-    Bus.instance
-        .fire(LocalPhotosUpdatedEvent(deletedFiles, type: EventType.deleted));
+    Bus.instance.fire(LocalPhotosUpdatedEvent(deletedFiles,
+        type: EventType.deleted_from_everywhere));
     showShortToast("moved to trash");
   }
   await dialog.hide();
@@ -149,10 +149,11 @@ Future<void> deleteFilesFromRemoteOnly(
     Bus.instance.fire(CollectionUpdatedEvent(
       collectionID,
       files.where((file) => file.collectionID == collectionID).toList(),
-      type: EventType.deleted,
+      type: EventType.deleted_from_remote,
     ));
   }
-  Bus.instance.fire(LocalPhotosUpdatedEvent(files, type: EventType.deleted));
+  Bus.instance.fire(
+      LocalPhotosUpdatedEvent(files, type: EventType.deleted_from_remote));
   SyncService.instance.sync();
   await dialog.hide();
   RemoteSyncService.instance.sync(silently: true);
@@ -197,8 +198,8 @@ Future<void> deleteFilesOnDeviceOnly(
     }
   }
   if (deletedFiles.isNotEmpty || alreadyDeletedIDs.isNotEmpty) {
-    Bus.instance
-        .fire(LocalPhotosUpdatedEvent(deletedFiles, type: EventType.deleted));
+    Bus.instance.fire(LocalPhotosUpdatedEvent(deletedFiles,
+        type: EventType.deleted_from_device));
   }
   await dialog.hide();
 }
@@ -216,7 +217,8 @@ Future<bool> deleteFromTrash(BuildContext context, List<File> files) async {
     await TrashSyncService.instance.deleteFromTrash(files);
     showToast("successfully deleted");
     await dialog.hide();
-    Bus.instance.fire(FilesUpdatedEvent(files, type: EventType.deleted));
+    Bus.instance.fire(
+        FilesUpdatedEvent(files, type: EventType.deleted_from_everywhere));
     return true;
   } catch (e, s) {
     _logger.info("failed to delete from trash", e, s);