From 637974f63b78f13a64041456303b5dac56678e08 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 18 Sep 2024 00:27:56 +0530 Subject: [PATCH 1/7] [mob] Fix showRecent handling in all page --- mobile/lib/services/magic_cache_service.dart | 13 ++++++------- .../search/result/search_section_all_page.dart | 8 +++----- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/mobile/lib/services/magic_cache_service.dart b/mobile/lib/services/magic_cache_service.dart index 3f7254d453..6a272b6328 100644 --- a/mobile/lib/services/magic_cache_service.dart +++ b/mobile/lib/services/magic_cache_service.dart @@ -62,6 +62,7 @@ GenericSearchResult? toGenericSearchResult( ResultType.magic, prompt.title, enteFilesInMagicCache, + params: {"enableGrouping": prompt.recentFirst}, onResultTap: (ctx) { routeToPage( ctx, @@ -133,13 +134,11 @@ class MagicCacheService { .getAssetIfUpdated(_kMagicPromptsDataUrl); if (updatedJSONFile != null) { _pendingUpdateReason.add("Prompts data updated"); - } else { - if (lastMagicCacheUpdateTime < - DateTime.now() - .subtract(const Duration(days: 3)) - .millisecondsSinceEpoch) { - _pendingUpdateReason.add("Cache is old"); - } + } else if (lastMagicCacheUpdateTime < + DateTime.now() + .subtract(const Duration(days: 1)) + .millisecondsSinceEpoch) { + _pendingUpdateReason.add("Cache is old"); } } diff --git a/mobile/lib/ui/viewer/search/result/search_section_all_page.dart b/mobile/lib/ui/viewer/search/result/search_section_all_page.dart index 587049801b..9ee58a5a63 100644 --- a/mobile/lib/ui/viewer/search/result/search_section_all_page.dart +++ b/mobile/lib/ui/viewer/search/result/search_section_all_page.dart @@ -170,12 +170,10 @@ class _SearchSectionAllPageState extends State { MagicResultScreen( magicSectionResult.resultFiles(), name: magicSectionResult.name(), + enableGrouping: magicSectionResult + .params["enableGrouping"]! as bool, heroTag: "searchable_item" + - GenericSearchResult( - ResultType.magic, - magicSectionResult.name(), - magicSectionResult.resultFiles(), - ).heroTag(), + magicSectionResult.heroTag(), ), ); }, From 2c4dd13ab0a5386edd096c16fa6b9a585266d064 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 13 Sep 2024 11:44:53 +0530 Subject: [PATCH 2/7] [mob][photos] Update magic section UI when magic cache gets updated --- mobile/lib/events/magic_cache_updated_event.dart | 3 +++ mobile/lib/models/search/search_types.dart | 3 +++ mobile/lib/services/magic_cache_service.dart | 3 +++ 3 files changed, 9 insertions(+) create mode 100644 mobile/lib/events/magic_cache_updated_event.dart diff --git a/mobile/lib/events/magic_cache_updated_event.dart b/mobile/lib/events/magic_cache_updated_event.dart new file mode 100644 index 0000000000..028c0ba59c --- /dev/null +++ b/mobile/lib/events/magic_cache_updated_event.dart @@ -0,0 +1,3 @@ +import "package:photos/events/event.dart"; + +class MagicCacheUpdatedEvent extends Event {} diff --git a/mobile/lib/models/search/search_types.dart b/mobile/lib/models/search/search_types.dart index 0674a28aac..1ea0b3a7af 100644 --- a/mobile/lib/models/search/search_types.dart +++ b/mobile/lib/models/search/search_types.dart @@ -6,6 +6,7 @@ import "package:photos/core/event_bus.dart"; import "package:photos/events/collection_updated_event.dart"; import "package:photos/events/event.dart"; import "package:photos/events/location_tag_updated_event.dart"; +import "package:photos/events/magic_cache_updated_event.dart"; import "package:photos/events/people_changed_event.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/models/collection/collection.dart"; @@ -291,6 +292,8 @@ extension SectionTypeExtensions on SectionType { switch (this) { case SectionType.location: return [Bus.instance.on()]; + case SectionType.magic: + return [Bus.instance.on()]; default: return []; } diff --git a/mobile/lib/services/magic_cache_service.dart b/mobile/lib/services/magic_cache_service.dart index 6a272b6328..2acbb656f4 100644 --- a/mobile/lib/services/magic_cache_service.dart +++ b/mobile/lib/services/magic_cache_service.dart @@ -8,6 +8,7 @@ import "package:logging/logging.dart"; import "package:path_provider/path_provider.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/events/file_uploaded_event.dart"; +import "package:photos/events/magic_cache_updated_event.dart"; import "package:photos/extensions/stop_watch.dart"; import "package:photos/models/file/extensions/file_props.dart"; import "package:photos/models/file/file.dart"; @@ -177,10 +178,12 @@ class MagicCacheService { w?.log("cacheWritten"); await _resetLastMagicCacheUpdateTime(); w?.logAndReset('done'); + Bus.instance.fire(MagicCacheUpdatedEvent()); } catch (e, s) { _logger.info("Error updating magic cache", e, s); } finally { _isUpdateInProgress = false; + Bus.instance.fire(MagicCacheUpdatedEvent()); } } From 9c1f744f73090fb1f1ae3371bcd88afd4c69fcd8 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 18 Sep 2024 11:42:54 +0530 Subject: [PATCH 3/7] [mob] Switch to list for maintaining order --- .../semantic_search/semantic_search_service.dart | 4 ++-- mobile/lib/services/magic_cache_service.dart | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 8eb60cc211..8885829743 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -178,7 +178,7 @@ class SemanticSearchService { return results; } - Future> getMatchingFileIDs( + Future> getMatchingFileIDs( String query, double minimumSimilarity, ) async { @@ -187,7 +187,7 @@ class SemanticSearchService { textEmbedding, minimumSimilarity: minimumSimilarity, ); - final result = {}; + final result = []; for (final r in queryResults) { result.add(r.id); } diff --git a/mobile/lib/services/magic_cache_service.dart b/mobile/lib/services/magic_cache_service.dart index 2acbb656f4..445e875699 100644 --- a/mobile/lib/services/magic_cache_service.dart +++ b/mobile/lib/services/magic_cache_service.dart @@ -25,13 +25,13 @@ import "package:shared_preferences/shared_preferences.dart"; class MagicCache { final String title; - final Set fileUploadedIDs; + final List fileUploadedIDs; MagicCache(this.title, this.fileUploadedIDs); factory MagicCache.fromJson(Map json) { return MagicCache( json['title'], - Set.from(json['fileUploadedIDs']), + List.from(json['fileUploadedIDs']), ); } Map toJson() { From b4c6805d42d67dd71a455c9fcaa993b86e73bf35 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 18 Sep 2024 11:52:03 +0530 Subject: [PATCH 4/7] [mob] Support for force refresh --- mobile/lib/services/magic_cache_service.dart | 5 ++++- mobile/lib/ui/settings/debug/ml_debug_section_widget.dart | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/mobile/lib/services/magic_cache_service.dart b/mobile/lib/services/magic_cache_service.dart index 445e875699..63d585abd5 100644 --- a/mobile/lib/services/magic_cache_service.dart +++ b/mobile/lib/services/magic_cache_service.dart @@ -147,10 +147,13 @@ class MagicCacheService { return (await getApplicationSupportDirectory()).path + "/cache/magic_cache"; } - Future updateCache() async { + Future updateCache({bool forced = false}) async { if (!enableDiscover) { return; } + if (forced) { + _pendingUpdateReason.add("Forced update"); + } try { if (_pendingUpdateReason.isEmpty || _isUpdateInProgress) { _logger.info( diff --git a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart index 0f0a6f26f0..f5ffa336b2 100644 --- a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart @@ -222,7 +222,7 @@ class _MLDebugSectionWidgetState extends State { trailingIconIsMuted: true, onTap: () async { try { - await MagicCacheService.instance.updateCache(); + await MagicCacheService.instance.updateCache(forced: true); } catch (e, s) { logger.warning('Update discover failed', e, s); await showGenericErrorDialog(context: context, error: e); From d308eb9274717850d96ae0bcaf4d729202e2d822 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 18 Sep 2024 12:04:27 +0530 Subject: [PATCH 5/7] [mob] Fix ordering for discover results --- mobile/lib/services/magic_cache_service.dart | 33 +++++++++++++++++-- mobile/lib/services/search_service.dart | 1 + .../search/result/magic_result_screen.dart | 12 +++++++ .../result/search_section_all_page.dart | 3 ++ 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/mobile/lib/services/magic_cache_service.dart b/mobile/lib/services/magic_cache_service.dart index 63d585abd5..5c6f8abbcb 100644 --- a/mobile/lib/services/magic_cache_service.dart +++ b/mobile/lib/services/magic_cache_service.dart @@ -26,8 +26,21 @@ import "package:shared_preferences/shared_preferences.dart"; class MagicCache { final String title; final List fileUploadedIDs; + Map? _fileIdToPositionMap; + MagicCache(this.title, this.fileUploadedIDs); + // Get map of uploadID to index in fileUploadedIDs + Map get fileIdToPositionMap { + if (_fileIdToPositionMap == null) { + _fileIdToPositionMap = {}; + for (int i = 0; i < fileUploadedIDs.length; i++) { + _fileIdToPositionMap![fileUploadedIDs[i]] = i; + } + } + return _fileIdToPositionMap!; + } + factory MagicCache.fromJson(Map json) { return MagicCache( json['title'], @@ -55,15 +68,25 @@ class MagicCache { GenericSearchResult? toGenericSearchResult( Prompt prompt, List enteFilesInMagicCache, + Map fileIdToPositionMap, ) { if (enteFilesInMagicCache.isEmpty) { return null; } + if (!prompt.recentFirst) { + enteFilesInMagicCache.sort((a, b) { + return fileIdToPositionMap[a.uploadedFileID!]! + .compareTo(fileIdToPositionMap[b.uploadedFileID!]!); + }); + } return GenericSearchResult( ResultType.magic, prompt.title, enteFilesInMagicCache, - params: {"enableGrouping": prompt.recentFirst}, + params: { + "enableGrouping": prompt.recentFirst, + "fileIdToPosMap": fileIdToPositionMap + }, onResultTap: (ctx) { routeToPage( ctx, @@ -71,6 +94,7 @@ GenericSearchResult? toGenericSearchResult( enteFilesInMagicCache, name: prompt.title, enableGrouping: prompt.recentFirst, + fileIdToPosMap: fileIdToPositionMap, heroTag: GenericSearchResult( ResultType.magic, prompt.title, @@ -246,9 +270,12 @@ class MagicCacheService { w?.log("cacheFound"); } final Map> magicIdToFiles = {}; + final Map promptMap = {}; + final Map> promptFileOrder = {}; for (MagicCache c in magicCaches) { magicIdToFiles[c.title] = []; + promptFileOrder[c.title] = c.fileIdToPositionMap; } for (final p in prompts) { promptMap[p.title] = p; @@ -258,7 +285,8 @@ class MagicCacheService { for (EnteFile file in files) { if (!file.isUploaded) continue; for (MagicCache magicCache in magicCaches) { - if (magicCache.fileUploadedIDs.contains(file.uploadedFileID!)) { + if (magicCache.fileIdToPositionMap + .containsKey(file.uploadedFileID!)) { if (file.isVideo && (promptMap[magicCache.title]?.showVideo ?? true) == false) { continue; @@ -271,6 +299,7 @@ class MagicCacheService { final genericSearchResult = toGenericSearchResult( p, magicIdToFiles[p.title] ?? [], + promptFileOrder[p.title] ?? {}, ); if (genericSearchResult != null) { genericSearchResults.add(genericSearchResult); diff --git a/mobile/lib/services/search_service.dart b/mobile/lib/services/search_service.dart index e9366c1cfb..1c45b1ab73 100644 --- a/mobile/lib/services/search_service.dart +++ b/mobile/lib/services/search_service.dart @@ -1039,6 +1039,7 @@ class SearchService { MagicResultScreen( files, name: query, + enableGrouping: false, heroTag: GenericSearchResult(ResultType.magic, query, files) .heroTag(), ), diff --git a/mobile/lib/ui/viewer/search/result/magic_result_screen.dart b/mobile/lib/ui/viewer/search/result/magic_result_screen.dart index 2c58e9a5e7..a44dec62aa 100644 --- a/mobile/lib/ui/viewer/search/result/magic_result_screen.dart +++ b/mobile/lib/ui/viewer/search/result/magic_result_screen.dart @@ -21,6 +21,7 @@ class MagicResultScreen extends StatefulWidget { final String name; final String heroTag; final bool enableGrouping; + final Map fileIdToPosMap; static const GalleryType appBarType = GalleryType.magic; static const GalleryType overlayType = GalleryType.magic; @@ -29,6 +30,7 @@ class MagicResultScreen extends StatefulWidget { this.files, { required this.name, this.enableGrouping = false, + this.fileIdToPosMap = const {}, this.heroTag = "", super.key, }); @@ -65,10 +67,20 @@ class _MagicResultScreenState extends State { _magicSortChangeEvent = Bus.instance.on().listen((event) { if (event.sortType == MagicSortType.mostRelevant) { + if (_enableGrouping) { + files.sort( + (a, b) => + widget.fileIdToPosMap[a.uploadedFileID]! - + widget.fileIdToPosMap[b.uploadedFileID]!, + ); + } setState(() { _enableGrouping = false; }); } else if (event.sortType == MagicSortType.mostRecent) { + if (!_enableGrouping) { + files.sort((a, b) => b.creationTime!.compareTo(a.creationTime!)); + } setState(() { _enableGrouping = true; }); diff --git a/mobile/lib/ui/viewer/search/result/search_section_all_page.dart b/mobile/lib/ui/viewer/search/result/search_section_all_page.dart index 9ee58a5a63..c7585ed51c 100644 --- a/mobile/lib/ui/viewer/search/result/search_section_all_page.dart +++ b/mobile/lib/ui/viewer/search/result/search_section_all_page.dart @@ -172,6 +172,9 @@ class _SearchSectionAllPageState extends State { name: magicSectionResult.name(), enableGrouping: magicSectionResult .params["enableGrouping"]! as bool, + fileIdToPosMap: magicSectionResult + .params["fileIdToPosMap"] + as Map, heroTag: "searchable_item" + magicSectionResult.heroTag(), ), From 30b508fa566cadc6d6573ef6c6b92c30ca6a4f5f Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 18 Sep 2024 12:05:13 +0530 Subject: [PATCH 6/7] [mob] Enable discover for all --- mobile/lib/services/magic_cache_service.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mobile/lib/services/magic_cache_service.dart b/mobile/lib/services/magic_cache_service.dart index 5c6f8abbcb..7766d8e6e9 100644 --- a/mobile/lib/services/magic_cache_service.dart +++ b/mobile/lib/services/magic_cache_service.dart @@ -148,8 +148,7 @@ class MagicCacheService { return _prefs.getInt(_lastMagicCacheUpdateTime) ?? 0; } - bool get enableDiscover => - localSettings.isMLIndexingEnabled && flagService.internalUser; + bool get enableDiscover => localSettings.isMLIndexingEnabled; Future _updateCacheIfTheTimeHasCome() async { if (!enableDiscover) { From 7e16f4f5be8669a301609f38bec96c8dafa4ce09 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 18 Sep 2024 12:05:44 +0530 Subject: [PATCH 7/7] [mob] bump version v0.9.40 --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 2484940865..b484deab3a 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.39+939 +version: 0.9.40+940 publish_to: none environment: