diff --git a/lib/events/event.dart b/lib/events/event.dart index 2bd13ad51..e6e0602fe 100644 --- a/lib/events/event.dart +++ b/lib/events/event.dart @@ -1,3 +1,3 @@ class Event { - String get reason => toString(); + String get reason => '$runtimeType'; } diff --git a/lib/events/files_updated_event.dart b/lib/events/files_updated_event.dart index e74a37715..7675a990a 100644 --- a/lib/events/files_updated_event.dart +++ b/lib/events/files_updated_event.dart @@ -15,7 +15,7 @@ class FilesUpdatedEvent extends Event { }); @override - String get reason => '${toString()}{type: ${type.name}, "via": $source}'; + String get reason => '$runtimeType{type: ${type.name}, "via": $source}'; } enum EventType { diff --git a/lib/events/force_reload_home_gallery_event.dart b/lib/events/force_reload_home_gallery_event.dart index fed8cea0e..3ff8a898e 100644 --- a/lib/events/force_reload_home_gallery_event.dart +++ b/lib/events/force_reload_home_gallery_event.dart @@ -6,5 +6,5 @@ class ForceReloadHomeGalleryEvent extends Event { ForceReloadHomeGalleryEvent(this.message); @override - String get reason => 'ForceReloadHomeGalleryEvent - $message'; + String get reason => '$runtimeType - $message'; } diff --git a/lib/events/local_photos_updated_event.dart b/lib/events/local_photos_updated_event.dart index b8295df8b..0e08407fb 100644 --- a/lib/events/local_photos_updated_event.dart +++ b/lib/events/local_photos_updated_event.dart @@ -1,7 +1,7 @@ import 'package:photos/events/files_updated_event.dart'; class LocalPhotosUpdatedEvent extends FilesUpdatedEvent { - LocalPhotosUpdatedEvent(updatedFiles, {type, source}) + LocalPhotosUpdatedEvent(updatedFiles, {type, required source}) : super( updatedFiles, type: type ?? EventType.addedOrUpdated, diff --git a/lib/services/collections_service.dart b/lib/services/collections_service.dart index af2579914..268687546 100644 --- a/lib/services/collections_service.dart +++ b/lib/services/collections_service.dart @@ -103,7 +103,12 @@ class CollectionsService { if (collection.isDeleted) { await _filesDB.deleteCollection(collection.id); await setCollectionSyncTime(collection.id, null); - Bus.instance.fire(LocalPhotosUpdatedEvent(List.empty())); + Bus.instance.fire( + LocalPhotosUpdatedEvent( + List.empty(), + source: "syncCollectionDeleted", + ), + ); } // remove reference for incoming collections when unshared/deleted if (collection.isDeleted && ownerID != collection?.owner?.id) { @@ -876,7 +881,7 @@ class CollectionsService { await _filesDB.removeFromCollection(collectionID, params["fileIDs"]); Bus.instance .fire(CollectionUpdatedEvent(collectionID, files, "removeFrom")); - Bus.instance.fire(LocalPhotosUpdatedEvent(files)); + Bus.instance.fire(LocalPhotosUpdatedEvent(files, source: "removeFrom")); RemoteSyncService.instance.sync(silently: true).ignore(); } diff --git a/lib/services/file_magic_service.dart b/lib/services/file_magic_service.dart index d878de28f..38ae02d74 100644 --- a/lib/services/file_magic_service.dart +++ b/lib/services/file_magic_service.dart @@ -37,11 +37,21 @@ class FileMagicService { if (visibility == visibilityVisible) { // Force reload home gallery to pull in the now unarchived files Bus.instance.fire(ForceReloadHomeGalleryEvent("unarchivedFiles")); - Bus.instance - .fire(LocalPhotosUpdatedEvent(files, type: EventType.unarchived)); + Bus.instance.fire( + LocalPhotosUpdatedEvent( + files, + type: EventType.unarchived, + source: "vizChange", + ), + ); } else { - Bus.instance - .fire(LocalPhotosUpdatedEvent(files, type: EventType.archived)); + Bus.instance.fire( + LocalPhotosUpdatedEvent( + files, + type: EventType.archived, + source: "vizChange", + ), + ); } } diff --git a/lib/services/local_sync_service.dart b/lib/services/local_sync_service.dart index 6221a8d13..606a37d63 100644 --- a/lib/services/local_sync_service.dart +++ b/lib/services/local_sync_service.dart @@ -232,7 +232,10 @@ class LocalSyncService { ); if (hasAnyMappingChanged || hasUnsyncedFiles) { Bus.instance.fire( - LocalPhotosUpdatedEvent(localDiffResult.uniqueLocalFiles), + LocalPhotosUpdatedEvent( + localDiffResult.uniqueLocalFiles, + source: "syncAllChange", + ), ); } _logger.info("syncAll took ${stopwatch.elapsed.inMilliseconds}ms "); @@ -359,7 +362,9 @@ class LocalSyncService { conflictAlgorithm: ConflictAlgorithm.ignore, ); _logger.info("Inserted " + files.length.toString() + " files."); - Bus.instance.fire(LocalPhotosUpdatedEvent(allFiles)); + Bus.instance.fire( + LocalPhotosUpdatedEvent(allFiles, source: "loadedPhoto"), + ); } await _prefs.setInt(kDbUpdationTimeKey, toTime); } diff --git a/lib/services/remote_sync_service.dart b/lib/services/remote_sync_service.dart index bc46b1cee..2daecd62a 100644 --- a/lib/services/remote_sync_service.dart +++ b/lib/services/remote_sync_service.dart @@ -354,7 +354,9 @@ class RemoteSyncService { // remove all collectionIDs which are still marked for backup oldCollectionIDsForAutoSync.removeAll(newCollectionIDsForAutoSync); await removeFilesQueuedForUpload(oldCollectionIDsForAutoSync.toList()); - Bus.instance.fire(LocalPhotosUpdatedEvent([])); + Bus.instance.fire( + LocalPhotosUpdatedEvent([], source: "deviceFolderSync"), + ); Bus.instance.fire(BackupFoldersUpdatedEvent()); } diff --git a/lib/ui/tools/editor/image_editor_page.dart b/lib/ui/tools/editor/image_editor_page.dart index 0cd094ad3..1a669e2a3 100644 --- a/lib/ui/tools/editor/image_editor_page.dart +++ b/lib/ui/tools/editor/image_editor_page.dart @@ -360,7 +360,7 @@ class _ImageEditorPageState extends State { } newFile.generatedID = await FilesDB.instance.insert(newFile); await LocalSyncService.instance.trackEditedFile(newFile); - Bus.instance.fire(LocalPhotosUpdatedEvent([newFile])); + Bus.instance.fire(LocalPhotosUpdatedEvent([newFile], source: "editSave")); SyncService.instance.sync(); showToast(context, "Edits saved"); _logger.info("Original file " + widget.originalFile.toString()); diff --git a/lib/ui/viewer/file/fading_app_bar.dart b/lib/ui/viewer/file/fading_app_bar.dart index f411cb862..74c5b671b 100644 --- a/lib/ui/viewer/file/fading_app_bar.dart +++ b/lib/ui/viewer/file/fading_app_bar.dart @@ -458,7 +458,12 @@ class FadingAppBarState extends State { await IgnoredFilesService.instance.cacheAndInsert([ignoreVideoFile]); file.localID = savedAsset.id; await FilesDB.instance.insert(file); - Bus.instance.fire(LocalPhotosUpdatedEvent([file])); + Bus.instance.fire( + LocalPhotosUpdatedEvent( + [file], + source: "download", + ), + ); } else if (!downloadLivePhotoOnDroid && savedAsset == null) { _logger.severe('Failed to save assert of type $type'); } diff --git a/lib/ui/viewer/file/thumbnail_widget.dart b/lib/ui/viewer/file/thumbnail_widget.dart index c3a2a8399..8775aeec7 100644 --- a/lib/ui/viewer/file/thumbnail_widget.dart +++ b/lib/ui/viewer/file/thumbnail_widget.dart @@ -176,6 +176,7 @@ class _ThumbnailWidgetState extends State { LocalPhotosUpdatedEvent( [widget.file], type: EventType.deletedFromDevice, + source: "thumbFileDeleted", ), ); } diff --git a/lib/ui/viewer/file/zoomable_image.dart b/lib/ui/viewer/file/zoomable_image.dart index f0c585e50..80327efb6 100644 --- a/lib/ui/viewer/file/zoomable_image.dart +++ b/lib/ui/viewer/file/zoomable_image.dart @@ -183,6 +183,7 @@ class _ZoomableImageState extends State LocalPhotosUpdatedEvent( [_photo], type: EventType.deletedFromDevice, + source: "zoomPreview", ), ); } diff --git a/lib/ui/viewer/gallery/gallery.dart b/lib/ui/viewer/gallery/gallery.dart index 05694b419..d3b6a9aad 100644 --- a/lib/ui/viewer/gallery/gallery.dart +++ b/lib/ui/viewer/gallery/gallery.dart @@ -89,9 +89,16 @@ class _GalleryState extends State { _itemScroller = ItemScrollController(); if (widget.reloadEvent != null) { _reloadEventSubscription = widget.reloadEvent.listen((event) async { - _logger.info("Reloading ALL files on ${event.type.name} event"); + // In soft refresh, setState is called for entire gallery only when + // number of child change + _logger.finest("Soft refresh all files on ${event.reason} "); final result = await _loadFiles(); - _onFilesLoaded(result.files); + final bool hasReloaded = _onFilesLoaded(result.files); + if (hasReloaded && kDebugMode) { + _logger.finest( + "Reloaded gallery on soft refresh all files on ${event.reason}", + ); + } }); } _tabDoubleTapEvent = @@ -109,8 +116,7 @@ class _GalleryState extends State { for (final event in widget.forceReloadEvents) { _forceReloadEventSubscriptions.add( event.listen((event) async { - _logger.info(event.reason); - + _logger.finest("Force refresh all files on ${event.reason}"); final result = await _loadFiles(); _setFilesAndReload(result.files); }), @@ -138,7 +144,7 @@ class _GalleryState extends State { } Future _loadFiles({int limit}) async { - _logger.info("Loading files"); + _logger.info("Loading ${limit ?? "all"} files"); try { final startTime = DateTime.now().microsecondsSinceEpoch; final result = await widget.asyncLoader( diff --git a/lib/utils/delete_file_util.dart b/lib/utils/delete_file_util.dart index fd322c198..a8e5be8af 100644 --- a/lib/utils/delete_file_util.dart +++ b/lib/utils/delete_file_util.dart @@ -126,6 +126,7 @@ Future deleteFilesFromEverywhere( LocalPhotosUpdatedEvent( deletedFiles, type: EventType.deletedFromEverywhere, + source: "deleteFilesEverywhere", ), ); if (hasLocalOnlyFiles && Platform.isAndroid) { @@ -182,8 +183,13 @@ Future deleteFilesFromRemoteOnly( ), ); } - Bus.instance - .fire(LocalPhotosUpdatedEvent(files, type: EventType.deletedFromRemote)); + Bus.instance.fire( + LocalPhotosUpdatedEvent( + files, + type: EventType.deletedFromRemote, + source: "deleteFromRemoteOnly", + ), + ); SyncService.instance.sync(); await dialog.hide(); RemoteSyncService.instance.sync(silently: true); @@ -245,6 +251,7 @@ Future deleteFilesOnDeviceOnly( LocalPhotosUpdatedEvent( deletedFiles, type: EventType.deletedFromDevice, + source: "deleteFilesOnDeviceOnly", ), ); } @@ -343,7 +350,9 @@ Future deleteLocalFiles( final deletedFiles = await FilesDB.instance.getLocalFiles(deletedIDs); await FilesDB.instance.deleteLocalFiles(deletedIDs); _logger.info(deletedFiles.length.toString() + " files deleted locally"); - Bus.instance.fire(LocalPhotosUpdatedEvent(deletedFiles)); + Bus.instance.fire( + LocalPhotosUpdatedEvent(deletedFiles, source: "deleteLocal"), + ); return true; } else { showToast(context, "Could not free up space"); diff --git a/lib/utils/file_uploader.dart b/lib/utils/file_uploader.dart index f04349b0f..6a23c849b 100644 --- a/lib/utils/file_uploader.dart +++ b/lib/utils/file_uploader.dart @@ -448,7 +448,12 @@ class FileUploader { await FilesDB.instance.update(remoteFile); } if (!_isBackground) { - Bus.instance.fire(LocalPhotosUpdatedEvent([remoteFile])); + Bus.instance.fire( + LocalPhotosUpdatedEvent( + [remoteFile], + source: "downloadComplete", + ), + ); } _logger.info("File upload complete for " + remoteFile.toString()); uploadCompleted = true; @@ -533,7 +538,8 @@ class FileUploader { Bus.instance.fire( LocalPhotosUpdatedEvent( [fileToUpload], - type: EventType.deletedFromEverywhere, // + type: EventType.deletedFromEverywhere, + source: "sameLocalSameCollection", // ), ); return Tuple2(true, sameLocalSameCollection); @@ -562,6 +568,7 @@ class FileUploader { Bus.instance.fire( LocalPhotosUpdatedEvent( [fileToUpload], + source: "alreadyUploadedInSameCollection", type: EventType.deletedFromEverywhere, // ), ); diff --git a/test/utils/date_time_util_test.dart b/test/utils/date_time_util_test.dart index b0bff610c..6dcfc0e40 100644 --- a/test/utils/date_time_util_test.dart +++ b/test/utils/date_time_util_test.dart @@ -31,10 +31,11 @@ void main() { }); test("verify constants", () { + final date = DateTime.fromMicrosecondsSinceEpoch(jan011981Time); expect( - jan011981Time, - DateTime(1981, 1, 1).toUtc().microsecondsSinceEpoch, - reason: "constant mismatch", + date.year == 1981 && date.month == 1, + true, + reason: "constant mismatch : ${date.toIso8601String()}", ); }); }