Sfoglia il codice sorgente

Merge pull request #126 from ente-io/trash_fixes

Fixes for trash implementation
Neeraj Gupta 3 anni fa
parent
commit
ffca408c4c

+ 1 - 1
lib/events/collection_updated_event.dart

@@ -4,5 +4,5 @@ class CollectionUpdatedEvent extends FilesUpdatedEvent {
   final int collectionID;
 
   CollectionUpdatedEvent(this.collectionID, updatedFiles, {type})
-      : super(updatedFiles, type: type ?? EventType.added_or_updated);
+      : super(updatedFiles, type: type ?? EventType.addedOrUpdated);
 }

+ 7 - 3
lib/events/files_updated_event.dart

@@ -7,11 +7,15 @@ class FilesUpdatedEvent extends Event {
 
   FilesUpdatedEvent(
     this.updatedFiles, {
-    this.type = EventType.added_or_updated,
+    this.type = EventType.addedOrUpdated,
   });
 }
 
 enum EventType {
-  added_or_updated,
-  deleted,
+  addedOrUpdated,
+  deletedFromDevice,
+  deletedFromRemote,
+  deletedFromEverywhere,
+  archived,
+  unarchived,
 }

+ 1 - 1
lib/events/local_photos_updated_event.dart

@@ -2,5 +2,5 @@ import 'package:photos/events/files_updated_event.dart';
 
 class LocalPhotosUpdatedEvent extends FilesUpdatedEvent {
   LocalPhotosUpdatedEvent(updatedFiles, {type})
-      : super(updatedFiles, type: type ?? EventType.added_or_updated);
+      : super(updatedFiles, type: type ?? EventType.addedOrUpdated);
 }

+ 0 - 5
lib/events/remote_sync_event.dart

@@ -1,5 +0,0 @@
-class RemoteSyncEvent {
-  final bool success;
-
-  RemoteSyncEvent(this.success);
-}

+ 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.deletedFromRemote));
     });
   }
 

+ 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));
     }
   }
 

+ 11 - 20
lib/services/remote_sync_service.dart

@@ -30,6 +30,7 @@ class RemoteSyncService {
   final _diffFetcher = DiffFetcher();
   int _completedUploads = 0;
   SharedPreferences _prefs;
+  Completer<void> _existingSync;
 
   static const kHasSyncedArchiveKey = "has_synced_archive";
 
@@ -54,6 +55,11 @@ class RemoteSyncService {
       _logger.info("Skipping remote sync since account is not configured");
       return;
     }
+    if (_existingSync != null) {
+      _logger.info("Remote sync already in progress, skipping");
+      return _existingSync.future;
+    }
+    _existingSync = Completer<void>();
 
     bool isFirstSync = !_collectionsService.hasSyncedCollections();
     await _collectionsService.sync();
@@ -75,6 +81,8 @@ class RemoteSyncService {
         .syncTrash()
         .onError((e, s) => _logger.severe('trash sync failed', e, s));
     bool hasUploadedFiles = await _uploadDiff();
+    _existingSync.complete();
+    _existingSync = null;
     if (hasUploadedFiles) {
       sync(silently: true);
     }
@@ -113,9 +121,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.deletedFromRemote));
+      Bus.instance.fire(LocalPhotosUpdatedEvent(deletedFiles,
+          type: EventType.deletedFromRemote));
     }
     if (diff.updatedFiles.isNotEmpty) {
       await _storeDiff(diff.updatedFiles, collectionID);
@@ -138,23 +146,6 @@ class RemoteSyncService {
     }
   }
 
-  bool _shouldIgnoreFileUpload(
-    File file, {
-    Map<String, Set<String>> ignoredFilesMap,
-    Set<String> ignoredLocalIDs,
-  }) {
-    if (file.localID == null || file.localID.isEmpty) {
-      return false;
-    }
-    if (Platform.isIOS) {
-      return ignoredLocalIDs.contains(file.localID);
-    }
-    // For android, check if there's any ignored file with same device folder
-    // and title.
-    return ignoredFilesMap.containsKey(file.deviceFolder) &&
-        ignoredFilesMap[file.deviceFolder].contains(file.title);
-  }
-
   Future<bool> _uploadDiff() async {
     final foldersToBackUp = Configuration.instance.getPathsToBackUp();
     List<File> filesToBeUploaded;

+ 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) =>

+ 0 - 3
lib/ui/change_collection_name_dialog.dart

@@ -1,9 +1,6 @@
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
-import 'package:photos/services/user_service.dart';
 import 'package:photos/utils/dialog_util.dart';
-import 'package:photos/utils/email_util.dart';
-import 'package:photos/utils/toast_util.dart';
 
 class ChangeCollectionNameDialog extends StatefulWidget {
   final String name;

+ 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.deletedFromRemote,
+        EventType.deletedFromEverywhere,
+      },
       tagPrefix: tagPrefix,
       selectedFiles: _selectedFiles,
       initialFiles: initialFiles,

+ 39 - 31
lib/ui/collections_gallery_widget.dart

@@ -188,16 +188,18 @@ class _CollectionsGalleryWidgetState extends State<CollectionsGalleryWidget>
               mainAxisSize: MainAxisSize.min,
               children: [
                 OutlinedButton(
-                    style: OutlinedButton.styleFrom(
-                      shape: RoundedRectangleBorder(
-                        borderRadius: BorderRadius.circular(5),
-                      ),
-                      padding: EdgeInsets.fromLTRB(20, 10, 20, 10),
-                      side: BorderSide(
-                        width: 2,
-                        color: Colors.white12,
-                      ),
+                  style: OutlinedButton.styleFrom(
+                    shape: RoundedRectangleBorder(
+                      borderRadius: BorderRadius.circular(5),
+                    ),
+                    padding: EdgeInsets.fromLTRB(20, 10, 20, 10),
+                    side: BorderSide(
+                      width: 2,
+                      color: Colors.white12,
                     ),
+                  ),
+                  child: SizedBox(
+                    width: 100,
                     child: Row(
                       mainAxisAlignment: MainAxisAlignment.center,
                       crossAxisAlignment: CrossAxisAlignment.center,
@@ -216,24 +218,28 @@ class _CollectionsGalleryWidgetState extends State<CollectionsGalleryWidget>
                         ),
                       ],
                     ),
-                    onPressed: () async {
-                      routeToPage(
-                        context,
-                        ArchivePage(),
-                      );
-                    }),
-                Padding(padding: EdgeInsets.fromLTRB(18,0,18,0)),
+                  ),
+                  onPressed: () async {
+                    routeToPage(
+                      context,
+                      ArchivePage(),
+                    );
+                  },
+                ),
+                Padding(padding: EdgeInsets.fromLTRB(18, 0, 18, 0)),
                 OutlinedButton(
-                    style: OutlinedButton.styleFrom(
-                      shape: RoundedRectangleBorder(
-                        borderRadius: BorderRadius.circular(5),
-                      ),
-                      padding: EdgeInsets.fromLTRB(20, 10, 20, 10),
-                      side: BorderSide(
-                        width: 2,
-                        color: Colors.white12,
-                      ),
+                  style: OutlinedButton.styleFrom(
+                    shape: RoundedRectangleBorder(
+                      borderRadius: BorderRadius.circular(5),
+                    ),
+                    padding: EdgeInsets.fromLTRB(20, 10, 20, 10),
+                    side: BorderSide(
+                      width: 2,
+                      color: Colors.white12,
                     ),
+                  ),
+                  child: SizedBox(
+                    width: 100,
                     child: Row(
                       mainAxisAlignment: MainAxisAlignment.center,
                       crossAxisAlignment: CrossAxisAlignment.center,
@@ -252,12 +258,14 @@ class _CollectionsGalleryWidgetState extends State<CollectionsGalleryWidget>
                         ),
                       ],
                     ),
-                    onPressed: () async {
-                      routeToPage(
-                        context,
-                        TrashPage(),
-                      );
-                    }),
+                  ),
+                  onPressed: () async {
+                    routeToPage(
+                      context,
+                      TrashPage(),
+                    );
+                  },
+                ),
               ],
             ),
             Padding(padding: EdgeInsets.fromLTRB(12, 12, 12, 72)),

+ 1 - 0
lib/ui/create_collection_page.dart

@@ -142,6 +142,7 @@ class _CreateCollectionPageState extends State<CreateCollectionPage> {
     return Container(
       padding: EdgeInsets.only(left: 24, bottom: 16),
       child: GestureDetector(
+        behavior: HitTestBehavior.translucent,
         child: Row(
           children: <Widget>[
             ClipRRect(

+ 1 - 3
lib/ui/detail_page.dart

@@ -240,8 +240,7 @@ class _DetailPageState extends State<DetailPage> {
     final totalFiles = _files.length;
     if (totalFiles == 1) {
       // Deleted the only file
-      Navigator.of(context, rootNavigator: true).pop(); // Close pageview
-      Navigator.of(context, rootNavigator: true).pop(); // Close gallery
+      Navigator.of(context).pop(); // Close pageview
       return;
     }
     if (_selectedIndex == totalFiles - 1) {
@@ -259,7 +258,6 @@ class _DetailPageState extends State<DetailPage> {
         _files.remove(file);
       });
     }
-    Navigator.of(context, rootNavigator: true).pop(); // Close dialog
   }
 
   Future<void> _onEditFileRequested(File file) async {

+ 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.deletedFromDevice,
+        EventType.deletedFromEverywhere,
+      },
       tagPrefix: "device_folder:" + folder.path,
       selectedFiles: _selectedFiles,
       header: Configuration.instance.hasConfiguredAccount()

+ 5 - 1
lib/ui/fading_app_bar.dart

@@ -278,6 +278,7 @@ class FadingAppBarState extends State<FadingAppBar> {
         isDestructiveAction: true,
         onPressed: () async {
           await deleteFilesFromEverywhere(context, [file]);
+          Navigator.of(context, rootNavigator: true).pop();
           widget.onFileDeleted(file);
         },
       ));
@@ -290,6 +291,7 @@ class FadingAppBarState extends State<FadingAppBar> {
           await deleteFilesOnDeviceOnly(context, [file]);
           showToast("file deleted from device");
           Navigator.of(context, rootNavigator: true).pop();
+          // TODO: Fix behavior when inside a device folder
         },
       ));
 
@@ -298,8 +300,9 @@ class FadingAppBarState extends State<FadingAppBar> {
         isDestructiveAction: true,
         onPressed: () async {
           await deleteFilesFromRemoteOnly(context, [file]);
-          showToast("moved to trash");
+          showShortToast("moved to trash");
           Navigator.of(context, rootNavigator: true).pop();
+          // TODO: Fix behavior when inside a collection
         },
       ));
 
@@ -308,6 +311,7 @@ class FadingAppBarState extends State<FadingAppBar> {
         isDestructiveAction: true,
         onPressed: () async {
           await deleteFilesFromEverywhere(context, [file]);
+          Navigator.of(context, rootNavigator: true).pop();
           widget.onFileDeleted(file);
         },
       ));

+ 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,

+ 1 - 1
lib/ui/gallery_app_bar_widget.dart

@@ -524,7 +524,7 @@ class _GalleryAppBarWidgetState extends State<GalleryAppBarWidget> {
           await deleteFilesFromRemoteOnly(
               context, widget.selectedFiles.files.toList());
           _clearSelectedFiles();
-          showToast("moved to trash");
+          showShortToast("moved to trash");
         },
       ));
       actions.add(CupertinoActionSheetAction(

+ 12 - 7
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';
@@ -341,31 +342,35 @@ class _HomeWidgetState extends State<HomeWidget> {
       asyncLoader: (creationStartTime, creationEndTime, {limit, asc}) async {
         final importantPaths = Configuration.instance.getPathsToBackUp();
         final ownerID = Configuration.instance.getUserID();
-        Future<FileLoadResult> result;
+        FileLoadResult result;
         if (importantPaths.isNotEmpty) {
-          result = FilesDB.instance.getImportantFiles(creationStartTime,
+          result = await FilesDB.instance.getImportantFiles(creationStartTime,
               creationEndTime, ownerID, importantPaths.toList(),
               limit: limit, asc: asc);
         } else {
           if (LocalSyncService.instance.hasGrantedLimitedPermissions()) {
-            result = FilesDB.instance.getAllLocalAndUploadedFiles(
+            result = await FilesDB.instance.getAllLocalAndUploadedFiles(
                 creationStartTime, creationEndTime, ownerID,
                 limit: limit, asc: asc);
           } else {
-            result = FilesDB.instance.getAllUploadedFiles(
+            result = await FilesDB.instance.getAllUploadedFiles(
                 creationStartTime, creationEndTime, ownerID,
                 limit: limit, asc: asc);
           }
         }
-        final fileLoadResult = await result;
         // hide ignored files from home page UI
         final ignoredIDs = await IgnoredFilesService.instance.ignoredIDs;
-        fileLoadResult.files.removeWhere((f) =>
+        result.files.removeWhere((f) =>
             f.uploadedFileID == null &&
             IgnoredFilesService.instance.shouldSkipUpload(ignoredIDs, f));
-        return fileLoadResult;
+        return result;
       },
       reloadEvent: Bus.instance.on<LocalPhotosUpdatedEvent>(),
+      removalEventTypes: const {
+        EventType.deletedFromRemote,
+        EventType.deletedFromEverywhere,
+        EventType.archived,
+      },
       forceReloadEvents: [
         Bus.instance.on<BackupFoldersUpdatedEvent>(),
         Bus.instance.on<ForceReloadHomeGalleryEvent>(),

+ 5 - 3
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,
@@ -90,7 +92,7 @@ class _LazyLoadingGalleryState extends State<LazyLoadingGallery> {
       _logger.info(filesUpdatedThisDay.length.toString() +
           " files were updated on " +
           getDayTitle(galleryDate.microsecondsSinceEpoch));
-      if (event.type == EventType.added_or_updated) {
+      if (event.type == EventType.addedOrUpdated) {
         final dayStartTime =
             DateTime(galleryDate.year, galleryDate.month, galleryDate.day);
         final result = await widget.asyncLoader(
@@ -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);

+ 0 - 1
lib/ui/thumbnail_widget.dart

@@ -1,5 +1,4 @@
 import 'package:flutter/material.dart';
-import 'dart:math';
 import 'package:logging/logging.dart';
 import 'package:flutter/widgets.dart';
 import 'package:photos/core/cache/thumbnail_cache.dart';

+ 1 - 2
lib/ui/video_widget.dart

@@ -3,7 +3,6 @@ import 'package:chewie/chewie.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/widgets.dart';
-import 'package:fluttertoast/fluttertoast.dart';
 import 'package:logging/logging.dart';
 import 'package:photos/models/file.dart';
 import 'package:photos/ui/thumbnail_widget.dart';
@@ -74,7 +73,7 @@ class _VideoWidgetState extends State<VideoWidget> {
           setState(() {
             _progress = count / total;
             if (_progress == 1) {
-              showToast("decrypting video...", toastLength: Toast.LENGTH_SHORT);
+              showShortToast("decrypting video...");
             }
           });
         }

+ 1 - 2
lib/ui/zoomable_live_image.dart

@@ -19,7 +19,6 @@ class ZoomableLiveImage extends StatefulWidget {
   final String tagPrefix;
   final Decoration backgroundDecoration;
 
-
   ZoomableLiveImage(
     this.file, {
     Key key,
@@ -138,7 +137,7 @@ class _ZoomableLiveImageState extends State<ZoomableLiveImage>
     if (videoFile != null && videoFile.existsSync()) {
       _setVideoPlayerController(file: videoFile);
     } else {
-      showToast("download failed", toastLength: Toast.LENGTH_SHORT);
+      showShortToast("download failed");
     }
     _isLoadingVideoPlayer = false;
   }

+ 11 - 9
lib/utils/delete_file_util.dart

@@ -102,16 +102,16 @@ Future<void> deleteFilesFromEverywhere(
         deletedFiles
             .where((file) => file.collectionID == collectionID)
             .toList(),
-        type: EventType.deleted,
+        type: EventType.deletedFromEverywhere,
       ));
     }
   }
   if (deletedFiles.isNotEmpty) {
-    Bus.instance
-        .fire(LocalPhotosUpdatedEvent(deletedFiles, type: EventType.deleted));
+    Bus.instance.fire(LocalPhotosUpdatedEvent(deletedFiles,
+        type: EventType.deletedFromEverywhere));
+    showShortToast("moved to trash");
   }
   await dialog.hide();
-  showToast("moved to trash");
   if (uploadedFilesToBeTrashed.isNotEmpty) {
     RemoteSyncService.instance.sync(silently: true);
   }
@@ -149,10 +149,11 @@ Future<void> deleteFilesFromRemoteOnly(
     Bus.instance.fire(CollectionUpdatedEvent(
       collectionID,
       files.where((file) => file.collectionID == collectionID).toList(),
-      type: EventType.deleted,
+      type: EventType.deletedFromRemote,
     ));
   }
-  Bus.instance.fire(LocalPhotosUpdatedEvent(files, type: EventType.deleted));
+  Bus.instance.fire(
+      LocalPhotosUpdatedEvent(files, type: EventType.deletedFromRemote));
   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.deletedFromDevice));
   }
   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.deletedFromEverywhere));
     return true;
   } catch (e, s) {
     _logger.info("failed to delete from trash", e, s);

+ 6 - 4
lib/utils/diff_fetcher.dart

@@ -5,10 +5,8 @@ import 'package:dio/dio.dart';
 import 'package:flutter_sodium/flutter_sodium.dart';
 import 'package:logging/logging.dart';
 import 'package:photos/core/configuration.dart';
-import 'package:photos/core/event_bus.dart';
 import 'package:photos/core/network.dart';
 import 'package:photos/db/files_db.dart';
-import 'package:photos/events/remote_sync_event.dart';
 import 'package:photos/models/file.dart';
 import 'package:photos/models/magic_metadata.dart';
 import 'package:photos/utils/crypto_util.dart';
@@ -19,6 +17,10 @@ class DiffFetcher {
   final _dio = Network.instance.getDio();
 
   Future<Diff> getEncryptedFilesDiff(int collectionID, int sinceTime) async {
+    _logger.info("Fetching diff in collection " +
+        collectionID.toString() +
+        " since " +
+        sinceTime.toString());
     try {
       final response = await _dio.get(
         Configuration.instance.getHttpEndpoint() + "/collections/v2/diff",
@@ -32,7 +34,6 @@ class DiffFetcher {
       final files = <File>[];
       int latestUpdatedAtTime = 0;
       if (response != null) {
-        Bus.instance.fire(RemoteSyncEvent(true));
         final diff = response.data["diff"] as List;
         final bool hasMore = response.data["hasMore"] as bool;
         final startTime = DateTime.now();
@@ -101,6 +102,8 @@ class DiffFetcher {
         final endTime = DateTime.now();
         _logger.info("time for parsing " +
             files.length.toString() +
+            " items within collection " +
+            collectionID.toString() +
             ": " +
             Duration(
                     microseconds: (endTime.microsecondsSinceEpoch -
@@ -109,7 +112,6 @@ class DiffFetcher {
                 .toString());
         return Diff(files, deletedFiles, hasMore, latestUpdatedAtTime);
       } else {
-        Bus.instance.fire(RemoteSyncEvent(false));
         return Diff(<File>[], <File>[], false, 0);
       }
     } catch (e, s) {

+ 4 - 7
lib/utils/magic_util.dart

@@ -1,5 +1,4 @@
 import 'package:flutter/widgets.dart';
-import 'package:fluttertoast/fluttertoast.dart';
 import 'package:logging/logging.dart';
 import 'package:photos/core/event_bus.dart';
 import 'package:photos/events/force_reload_home_gallery_event.dart';
@@ -18,11 +17,9 @@ Future<void> changeVisibility(
   await dialog.show();
   try {
     await FileMagicService.instance.changeVisibility(files, newVisibility);
-    showToast(
-        newVisibility == kVisibilityArchive
-            ? "successfully archived"
-            : "successfully unarchived",
-        toastLength: Toast.LENGTH_SHORT);
+    showShortToast(newVisibility == kVisibilityArchive
+        ? "successfully archived"
+        : "successfully unarchived");
 
     await dialog.hide();
   } catch (e, s) {
@@ -54,7 +51,7 @@ Future<void> _updatePublicMetadata(
   try {
     Map<String, dynamic> update = {key: value};
     await FileMagicService.instance.updatePublicMagicMetadata(files, update);
-    showToast('done', toastLength: Toast.LENGTH_SHORT);
+    showShortToast('done');
     await dialog.hide();
     if (_shouldReloadGallery(key)) {
       Bus.instance.fire(ForceReloadHomeGalleryEvent());

+ 7 - 2
lib/utils/toast_util.dart

@@ -4,7 +4,8 @@ import 'package:flutter/material.dart';
 import 'package:flutter_easyloading/flutter_easyloading.dart';
 import 'package:fluttertoast/fluttertoast.dart';
 
-Future<void> showToast(String message, {toastLength = Toast.LENGTH_LONG}) async {
+Future<void> showToast(String message,
+    {toastLength = Toast.LENGTH_LONG}) async {
   if (Platform.isAndroid) {
     await Fluttertoast.cancel();
     return Fluttertoast.showToast(
@@ -24,8 +25,12 @@ Future<void> showToast(String message, {toastLength = Toast.LENGTH_LONG}) async
       ..loadingStyle = EasyLoadingStyle.custom;
     return EasyLoading.showToast(
       message,
-      duration: Duration(seconds: (toastLength == Toast.LENGTH_LONG ? 5 : 3)),
+      duration: Duration(seconds: (toastLength == Toast.LENGTH_LONG ? 5 : 2)),
       toastPosition: EasyLoadingToastPosition.bottom,
     );
   }
 }
+
+Future<void> showShortToast(String message) {
+  return showToast(message, toastLength: Toast.LENGTH_SHORT);
+}

+ 0 - 4
lib/utils/trash_diff_fetcher.dart

@@ -5,9 +5,7 @@ import 'package:dio/dio.dart';
 import 'package:flutter_sodium/flutter_sodium.dart';
 import 'package:logging/logging.dart';
 import 'package:photos/core/configuration.dart';
-import 'package:photos/core/event_bus.dart';
 import 'package:photos/core/network.dart';
-import 'package:photos/events/remote_sync_event.dart';
 import 'package:photos/models/magic_metadata.dart';
 import 'package:photos/models/trash_file.dart';
 import 'package:photos/utils/crypto_util.dart';
@@ -32,7 +30,6 @@ class TrashDiffFetcher {
       final deletedFiles = <TrashFile>[];
       final restoredFiles = <TrashFile>[];
       if (response != null) {
-        Bus.instance.fire(RemoteSyncEvent(true));
         final diff = response.data["diff"] as List;
         final bool hasMore = response.data["hasMore"] as bool;
         final startTime = DateTime.now();
@@ -103,7 +100,6 @@ class TrashDiffFetcher {
         return Diff(trashedFiles, restoredFiles, deletedFiles, hasMore,
             latestUpdatedAtTime);
       } else {
-        Bus.instance.fire(RemoteSyncEvent(false));
         return Diff(<TrashFile>[], <TrashFile>[], <TrashFile>[], false, 0);
       }
     } catch (e, s) {