From 5f2cc6f6c3ae2fea73a2efc0a79a4098de5209cd Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 7 Oct 2024 16:26:05 +0530 Subject: [PATCH] [mob][photos] Add initialFilter in search results page depending on the type of search result passed --- .../models/search/album_search_result.dart | 11 ++ .../lib/models/search/file_search_result.dart | 6 ++ .../models/search/generic_search_result.dart | 6 ++ mobile/lib/models/search/search_result.dart | 3 + mobile/lib/models/search/search_types.dart | 101 ++++++++++++++++++ .../search/result/search_result_page.dart | 10 +- mobile/lib/utils/file_util.dart | 10 ++ .../lib/utils/hierarchical_search_util.dart | 5 + 8 files changed, 144 insertions(+), 8 deletions(-) diff --git a/mobile/lib/models/search/album_search_result.dart b/mobile/lib/models/search/album_search_result.dart index 543012b467..6bfafeac88 100644 --- a/mobile/lib/models/search/album_search_result.dart +++ b/mobile/lib/models/search/album_search_result.dart @@ -1,5 +1,7 @@ import 'package:photos/models/collection/collection_items.dart'; import 'package:photos/models/file/file.dart'; +import "package:photos/models/search/hierarchical/album_filter.dart"; +import "package:photos/models/search/hierarchical/hierarchical_search_filter.dart"; import 'package:photos/models/search/search_result.dart'; import "package:photos/models/search/search_types.dart"; @@ -28,4 +30,13 @@ class AlbumSearchResult extends SearchResult { // for album search result, we should open the album page directly throw UnimplementedError(); } + + @override + HierarchicalSearchFilter toHierarchicalSearchFilter() { + return AlbumFilter( + collectionID: collectionWithThumbnail.collection.id, + albumName: collectionWithThumbnail.collection.displayName, + occurrence: kMostRelevantFilter, + ); + } } diff --git a/mobile/lib/models/search/file_search_result.dart b/mobile/lib/models/search/file_search_result.dart index 8648236c89..6b423f04e3 100644 --- a/mobile/lib/models/search/file_search_result.dart +++ b/mobile/lib/models/search/file_search_result.dart @@ -1,4 +1,5 @@ import 'package:photos/models/file/file.dart'; +import "package:photos/models/search/hierarchical/hierarchical_search_filter.dart"; import 'package:photos/models/search/search_result.dart'; import "package:photos/models/search/search_types.dart"; @@ -27,4 +28,9 @@ class FileSearchResult extends SearchResult { // for fileSearchResult, the file detailed page view will be opened throw UnimplementedError(); } + + @override + HierarchicalSearchFilter toHierarchicalSearchFilter() { + throw UnimplementedError(); + } } diff --git a/mobile/lib/models/search/generic_search_result.dart b/mobile/lib/models/search/generic_search_result.dart index a40f71fd32..9235d3e6a2 100644 --- a/mobile/lib/models/search/generic_search_result.dart +++ b/mobile/lib/models/search/generic_search_result.dart @@ -1,5 +1,6 @@ import "package:flutter/cupertino.dart"; import 'package:photos/models/file/file.dart'; +import "package:photos/models/search/hierarchical/hierarchical_search_filter.dart"; import 'package:photos/models/search/search_result.dart'; import "package:photos/models/search/search_types.dart"; @@ -37,4 +38,9 @@ class GenericSearchResult extends SearchResult { List resultFiles() { return _files; } + + @override + HierarchicalSearchFilter toHierarchicalSearchFilter() { + return _type.toHierarchicalSearchFilter(this); + } } diff --git a/mobile/lib/models/search/search_result.dart b/mobile/lib/models/search/search_result.dart index 02c922af0d..c50c8b4ed0 100644 --- a/mobile/lib/models/search/search_result.dart +++ b/mobile/lib/models/search/search_result.dart @@ -1,4 +1,5 @@ import "package:photos/models/file/file.dart"; +import "package:photos/models/search/hierarchical/hierarchical_search_filter.dart"; import "package:photos/models/search/search_types.dart"; abstract class SearchResult { @@ -13,4 +14,6 @@ abstract class SearchResult { } List resultFiles(); + + HierarchicalSearchFilter toHierarchicalSearchFilter(); } diff --git a/mobile/lib/models/search/search_types.dart b/mobile/lib/models/search/search_types.dart index cd66acdee7..2d24fb9bca 100644 --- a/mobile/lib/models/search/search_types.dart +++ b/mobile/lib/models/search/search_types.dart @@ -11,6 +11,10 @@ import "package:photos/events/people_changed_event.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/models/collection/collection.dart"; import "package:photos/models/collection/collection_items.dart"; +import "package:photos/models/search/album_search_result.dart"; +import "package:photos/models/search/hierarchical/album_filter.dart"; +import "package:photos/models/search/hierarchical/hierarchical_search_filter.dart"; +import "package:photos/models/search/hierarchical/top_level_generic_filter.dart"; import "package:photos/models/search/search_result.dart"; import "package:photos/models/typedefs.dart"; import "package:photos/services/collections_service.dart"; @@ -19,6 +23,7 @@ import "package:photos/ui/viewer/gallery/collection_page.dart"; import "package:photos/ui/viewer/location/add_location_sheet.dart"; import "package:photos/ui/viewer/location/pick_center_point_widget.dart"; import "package:photos/utils/dialog_util.dart"; +import "package:photos/utils/file_util.dart"; import "package:photos/utils/navigation_util.dart"; import "package:photos/utils/share_util.dart"; @@ -51,6 +56,102 @@ enum SectionType { fileTypesAndExtension, } +extension ResultTypeExtensions on ResultType { + HierarchicalSearchFilter toHierarchicalSearchFilter( + SearchResult searchResult, + ) { + switch (this) { + case ResultType.collection: + return AlbumFilter( + collectionID: (searchResult as AlbumSearchResult) + .collectionWithThumbnail + .collection + .id, + albumName: searchResult.name(), + occurrence: kMostRelevantFilter, + ); + case ResultType.file: + throw UnimplementedError(); + + /// Location results are never shown from SearchResultsPage + case ResultType.location: + throw UnimplementedError(); + case ResultType.locationSuggestion: + throw UnimplementedError(); + case ResultType.month: + return TopLevelGenericFilter( + filterName: searchResult.name(), + occurrence: kMostRelevantFilter, + filterIcon: Icons.calendar_today_outlined, + matchedUploadedIDs: + filesToUploadedFileIDs(searchResult.resultFiles()), + ); + case ResultType.year: + return TopLevelGenericFilter( + filterName: searchResult.name(), + occurrence: kMostRelevantFilter, + filterIcon: Icons.calendar_today_outlined, + matchedUploadedIDs: + filesToUploadedFileIDs(searchResult.resultFiles()), + ); + case ResultType.fileType: + return TopLevelGenericFilter( + filterName: searchResult.name(), + occurrence: kMostRelevantFilter, + matchedUploadedIDs: + filesToUploadedFileIDs(searchResult.resultFiles()), + ); + case ResultType.fileExtension: + return TopLevelGenericFilter( + filterName: searchResult.name(), + occurrence: kMostRelevantFilter, + matchedUploadedIDs: + filesToUploadedFileIDs(searchResult.resultFiles()), + ); + case ResultType.fileCaption: + return TopLevelGenericFilter( + filterName: searchResult.name(), + occurrence: kMostRelevantFilter, + filterIcon: Icons.description_outlined, + matchedUploadedIDs: + filesToUploadedFileIDs(searchResult.resultFiles()), + ); + case ResultType.event: + return TopLevelGenericFilter( + filterName: searchResult.name(), + occurrence: kMostRelevantFilter, + filterIcon: Icons.event_outlined, + matchedUploadedIDs: + filesToUploadedFileIDs(searchResult.resultFiles()), + ); + case ResultType.shared: + return TopLevelGenericFilter( + filterName: searchResult.name(), + occurrence: kMostRelevantFilter, + filterIcon: Icons.person_outline, + matchedUploadedIDs: + filesToUploadedFileIDs(searchResult.resultFiles()), + ); + case ResultType.faces: + return TopLevelGenericFilter( + filterName: searchResult.name(), + occurrence: kMostRelevantFilter, + filterIcon: Icons.face_outlined, + matchedUploadedIDs: + filesToUploadedFileIDs(searchResult.resultFiles()), + ); + case ResultType.magic: + return TopLevelGenericFilter( + filterName: searchResult.name(), + occurrence: kMostRelevantFilter, + filterIcon: Icons.auto_awesome_outlined, + matchedUploadedIDs: + filesToUploadedFileIDs(searchResult.resultFiles()), + ); + } + } +} + extension SectionTypeExtensions on SectionType { // passing context for internalization in the future String sectionTitle(BuildContext context) { diff --git a/mobile/lib/ui/viewer/search/result/search_result_page.dart b/mobile/lib/ui/viewer/search/result/search_result_page.dart index ed84cb2cf3..44244c9501 100644 --- a/mobile/lib/ui/viewer/search/result/search_result_page.dart +++ b/mobile/lib/ui/viewer/search/result/search_result_page.dart @@ -5,11 +5,8 @@ import 'package:photos/core/event_bus.dart'; import 'package:photos/events/files_updated_event.dart'; import 'package:photos/events/local_photos_updated_event.dart'; import 'package:photos/models/file/file.dart'; -import "package:photos/models/file/file_type.dart"; import 'package:photos/models/file_load_result.dart'; import 'package:photos/models/gallery_type.dart'; -import "package:photos/models/search/hierarchical/file_type_filter.dart"; -import "package:photos/models/search/hierarchical/hierarchical_search_filter.dart"; import 'package:photos/models/search/search_result.dart'; import 'package:photos/models/selected_files.dart'; import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart'; @@ -102,11 +99,8 @@ class _SearchResultPageState extends State { return GalleryFilesState( child: InheritedSearchFilterData( searchFilterDataProvider: SearchFilterDataProvider( - //TODO: Add filter type according to the search result - initialGalleryFilter: FileTypeFilter( - fileType: FileType.image, - occurrence: kMostRelevantFilter, - ), + initialGalleryFilter: + widget.searchResult.toHierarchicalSearchFilter(), ), child: Scaffold( appBar: PreferredSize( diff --git a/mobile/lib/utils/file_util.dart b/mobile/lib/utils/file_util.dart index 35240a3cc6..8b0f76669f 100644 --- a/mobile/lib/utils/file_util.dart +++ b/mobile/lib/utils/file_util.dart @@ -377,3 +377,13 @@ class _LivePhoto { _LivePhoto(this.image, this.video); } + +Set filesToUploadedFileIDs(List files) { + final uploadedFileIDs = {}; + for (final file in files) { + if (file.isUploaded) { + uploadedFileIDs.add(file.uploadedFileID!); + } + } + return uploadedFileIDs; +} diff --git a/mobile/lib/utils/hierarchical_search_util.dart b/mobile/lib/utils/hierarchical_search_util.dart index 9c5202025c..e8078f467f 100644 --- a/mobile/lib/utils/hierarchical_search_util.dart +++ b/mobile/lib/utils/hierarchical_search_util.dart @@ -1,3 +1,5 @@ +import "dart:developer"; + import "package:logging/logging.dart"; import "package:photos/core/configuration.dart"; import "package:photos/db/files_db.dart"; @@ -33,6 +35,9 @@ Future> getFilteredFiles( continue; } for (HierarchicalSearchFilter filter in resultsNeverComputedFilters) { + log( + "Computing results for never computed $filter: ${filter.name()}", + ); if (filter.isMatch(file)) { filter.matchedUploadedIDs.add(file.uploadedFileID!); }