From bd6fe0371016e0d6baea405d7564ea344d815603 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 25 Sep 2024 13:14:54 +0530 Subject: [PATCH] [mob][photos] Do not show up the initial gallery filter on hierarchical search's filter recommendations For example, if we search for an album 'Trip to Coorg' and go in the album, 'Trip to Coorg' shouldn't come up in recommended filters --- .../search/hierarchical/album_filter.dart | 8 +++++ .../hierarchical_search_filter.dart | 4 +++ .../ui/viewer/gallery/collection_page.dart | 9 ++++- .../state/search_filter_data_provider.dart | 35 ++++++++++++++++--- 4 files changed, 51 insertions(+), 5 deletions(-) diff --git a/mobile/lib/models/search/hierarchical/album_filter.dart b/mobile/lib/models/search/hierarchical/album_filter.dart index 69d44d21b4..a076942de3 100644 --- a/mobile/lib/models/search/hierarchical/album_filter.dart +++ b/mobile/lib/models/search/hierarchical/album_filter.dart @@ -40,4 +40,12 @@ class AlbumFilter extends HierarchicalSearchFilter { Set getMatchedUploadedIDs() { return matchedUploadedIDs; } + + @override + bool isSameFilter(HierarchicalSearchFilter other) { + if (other is AlbumFilter) { + return other.collectionID == collectionID; + } + return false; + } } diff --git a/mobile/lib/models/search/hierarchical/hierarchical_search_filter.dart b/mobile/lib/models/search/hierarchical/hierarchical_search_filter.dart index 6c46f64019..72dd574d61 100644 --- a/mobile/lib/models/search/hierarchical/hierarchical_search_filter.dart +++ b/mobile/lib/models/search/hierarchical/hierarchical_search_filter.dart @@ -1,10 +1,14 @@ import "package:flutter/widgets.dart"; import "package:photos/models/file/file.dart"; +int kMostRelevantFilter = 10000; +int kLeastRelevantFilter = -1; + abstract class HierarchicalSearchFilter { String name(); IconData? icon(); int relevance(); bool isMatch(EnteFile file); Set getMatchedUploadedIDs(); + bool isSameFilter(HierarchicalSearchFilter other); } diff --git a/mobile/lib/ui/viewer/gallery/collection_page.dart b/mobile/lib/ui/viewer/gallery/collection_page.dart index 901a1a465f..5a8997aa29 100644 --- a/mobile/lib/ui/viewer/gallery/collection_page.dart +++ b/mobile/lib/ui/viewer/gallery/collection_page.dart @@ -9,6 +9,8 @@ import 'package:photos/models/collection/collection_items.dart'; import 'package:photos/models/file/file.dart'; import 'package:photos/models/file_load_result.dart'; import 'package:photos/models/gallery_type.dart'; +import "package:photos/models/search/hierarchical/album_filter.dart"; +import "package:photos/models/search/hierarchical/hierarchical_search_filter.dart"; import 'package:photos/models/selected_files.dart'; import 'package:photos/services/ignored_files_service.dart'; import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart'; @@ -101,7 +103,12 @@ class CollectionPage extends StatelessWidget { : const SizedBox(height: 212), ); return InheritedSearchFilterData( - searchFilterDataProvider: SearchFilterDataProvider(), + searchFilterDataProvider: SearchFilterDataProvider() + ..initialGalleryFilter = AlbumFilter( + collectionID: c.collection.id, + albumName: c.collection.displayName, + occurrence: kMostRelevantFilter, + ), child: Scaffold( appBar: PreferredSize( preferredSize: const Size.fromHeight(50.0), diff --git a/mobile/lib/ui/viewer/gallery/state/search_filter_data_provider.dart b/mobile/lib/ui/viewer/gallery/state/search_filter_data_provider.dart index ec27271375..74ebc78612 100644 --- a/mobile/lib/ui/viewer/gallery/state/search_filter_data_provider.dart +++ b/mobile/lib/ui/viewer/gallery/state/search_filter_data_provider.dart @@ -5,13 +5,20 @@ class SearchFilterDataProvider { final _appliedFiltersNotifier = _AppliedFiltersNotifier(); final _recommendedFiltersNotifier = _RecommendedFiltersNotifier(); + //TODO: Make this non-nullable and required so every time this is wrapped + //over a gallery's scaffold, it's forced to provide an initial gallery filter + HierarchicalSearchFilter? initialGalleryFilter; + List get recommendations => _recommendedFiltersNotifier.recommendedFilters; List get appliedFilters => _appliedFiltersNotifier.appliedFilters; void addRecommendations(List filters) { - _recommendedFiltersNotifier.addFilters(filters); + _recommendedFiltersNotifier.addFilters( + filters, + initialGalleryFilter: initialGalleryFilter, + ); } void applyFilters(List filters) { @@ -21,7 +28,10 @@ class SearchFilterDataProvider { void removeAppliedFilters(List filters) { _appliedFiltersNotifier.removeFilters(filters); - _recommendedFiltersNotifier.addFilters(filters); + _recommendedFiltersNotifier.addFilters( + filters, + initialGalleryFilter: initialGalleryFilter, + ); } void clearRecommendations() { @@ -82,8 +92,25 @@ class _RecommendedFiltersNotifier extends ChangeNotifier { List get recommendedFilters => _recommendedFilters; - void addFilters(List filters) { - _recommendedFilters.addAll(filters); + void addFilters( + List filters, { + required HierarchicalSearchFilter? initialGalleryFilter, + }) { + if (initialGalleryFilter != null) { + for (HierarchicalSearchFilter filter in filters) { + if (filter.isSameFilter(initialGalleryFilter)) { + continue; + } + _recommendedFilters.add(filter); + } + } else { + //To check if such cases come up during development of hierarchical search + assert( + false, + "Initial gallery filter not provided", + ); + _recommendedFilters.addAll(filters); + } notifyListeners(); }