From 43dc2794d75242a007cc3cc964c83c13b8266a5f Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 23 Oct 2024 20:39:11 +0530 Subject: [PATCH] [mob][photos] Keep selection sheet the same until the initial top level filter of the gallery is removed. Once removed, use GalleryType.searchResult for the selection sheet --- .../actions/file_selection_overlay_bar.dart | 73 ++++++++++++++++++- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/mobile/lib/ui/viewer/actions/file_selection_overlay_bar.dart b/mobile/lib/ui/viewer/actions/file_selection_overlay_bar.dart index a6b98b4e7f..cb11444103 100644 --- a/mobile/lib/ui/viewer/actions/file_selection_overlay_bar.dart +++ b/mobile/lib/ui/viewer/actions/file_selection_overlay_bar.dart @@ -2,11 +2,14 @@ import 'package:flutter/material.dart'; import 'package:photos/models/collection/collection.dart'; import 'package:photos/models/gallery_type.dart'; import "package:photos/models/ml/face/person.dart"; +import "package:photos/models/search/hierarchical/hierarchical_search_filter.dart"; import 'package:photos/models/selected_files.dart'; import "package:photos/theme/effects.dart"; import "package:photos/theme/ente_theme.dart"; import 'package:photos/ui/components/bottom_action_bar/bottom_action_bar_widget.dart'; import "package:photos/ui/viewer/gallery/state/gallery_files_inherited_widget.dart"; +import "package:photos/ui/viewer/gallery/state/inherited_search_filter_data.dart"; +import "package:photos/ui/viewer/gallery/state/search_filter_data_provider.dart"; import "package:photos/ui/viewer/gallery/state/selection_state.dart"; class FileSelectionOverlayBar extends StatefulWidget { @@ -34,10 +37,14 @@ class FileSelectionOverlayBar extends StatefulWidget { class _FileSelectionOverlayBarState extends State { final ValueNotifier _hasSelectedFilesNotifier = ValueNotifier(false); + late GalleryType _galleryType; + SearchFilterDataProvider? _searchFilterDataProvider; + bool? _galleryInitialFilterStillApplied; @override void initState() { super.initState(); + _galleryType = widget.galleryType; widget.selectedFiles.addListener(_selectedFilesListener); } @@ -45,16 +52,46 @@ class _FileSelectionOverlayBarState extends State { void dispose() { _hasSelectedFilesNotifier.dispose(); widget.selectedFiles.removeListener(_selectedFilesListener); + _searchFilterDataProvider?.removeListener( + listener: _updateGalleryTypeIfRequired, + fromApplied: true, + ); super.dispose(); } + @override + void didUpdateWidget(covariant FileSelectionOverlayBar oldWidget) { + super.didUpdateWidget(oldWidget); + _galleryType = widget.galleryType; + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final inheritedSearchFilterData = + InheritedSearchFilterData.maybeOf(context); + if (inheritedSearchFilterData?.isHierarchicalSearchable ?? false) { + _searchFilterDataProvider = + inheritedSearchFilterData!.searchFilterDataProvider; + + _searchFilterDataProvider!.removeListener( + listener: _updateGalleryTypeIfRequired, + fromApplied: true, + ); + _searchFilterDataProvider!.addListener( + listener: _updateGalleryTypeIfRequired, + toApplied: true, + ); + } + } + @override Widget build(BuildContext context) { debugPrint( '$runtimeType building with ${widget.selectedFiles.files.length}', ); - return widget.galleryType == GalleryType.homepage + return _galleryType == GalleryType.homepage ? _body() : PopScope( canPop: false, @@ -99,7 +136,7 @@ class _FileSelectionOverlayBarState extends State { ), child: BottomActionBarWidget( selectedFiles: widget.selectedFiles, - galleryType: widget.galleryType, + galleryType: _galleryType, collection: widget.collection, person: widget.person, clusterID: widget.clusterID, @@ -122,6 +159,38 @@ class _FileSelectionOverlayBarState extends State { _selectedFilesListener() { _hasSelectedFilesNotifier.value = widget.selectedFiles.files.isNotEmpty; } + + /// This method is used to update the GalleryType if the initial filter is + /// removed from the applied filters. As long as the inital filter is present + /// in the applied filters, the gallery type will remain the same as the type + /// initally passed in the widget constructor. Once the inital filter is + /// removed, the gallery type will be updated to GalleryType.searchResults + /// and never be updated again. + void _updateGalleryTypeIfRequired() { + if (_galleryInitialFilterStillApplied != null && + !_galleryInitialFilterStillApplied!) { + return; + } + + final appliedFilters = _searchFilterDataProvider!.appliedFilters; + final initialFilter = _searchFilterDataProvider!.initialGalleryFilter; + bool initalFilterIsInAppliedFiters = false; + for (HierarchicalSearchFilter filter in appliedFilters) { + if (filter.isSameFilter(initialFilter)) { + initalFilterIsInAppliedFiters = true; + break; + } + } + + if (!initalFilterIsInAppliedFiters) { + setState(() { + _galleryInitialFilterStillApplied = false; + _galleryType = GalleryType.searchResults; + }); + } else { + _galleryInitialFilterStillApplied = true; + } + } } class SelectAllButton extends StatefulWidget {