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