From 232f793fb0e9c371bcc17152ca72067029bf3207 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Thu, 2 Jan 2025 23:41:40 +0530 Subject: [PATCH] [mob][photos] Add logic to reload home gallery on toggling hide shared items from home gallery settings and also store the preference in local settings --- ..._shared_items_from_home_gallery_event.dart | 7 +++ mobile/lib/ui/home/home_gallery_widget.dart | 57 +++++++++++++++++-- .../ui/settings/advanced_settings_screen.dart | 31 ++++++++++ mobile/lib/utils/local_settings.dart | 9 +++ 4 files changed, 98 insertions(+), 6 deletions(-) create mode 100644 mobile/lib/events/hide_shared_items_from_home_gallery_event.dart diff --git a/mobile/lib/events/hide_shared_items_from_home_gallery_event.dart b/mobile/lib/events/hide_shared_items_from_home_gallery_event.dart new file mode 100644 index 0000000000..4284acb0ff --- /dev/null +++ b/mobile/lib/events/hide_shared_items_from_home_gallery_event.dart @@ -0,0 +1,7 @@ +import "package:photos/events/event.dart"; + +class HideSharedItemsFromHomeGalleryEvent extends Event { + final bool shouldHide; + + HideSharedItemsFromHomeGalleryEvent(this.shouldHide); +} diff --git a/mobile/lib/ui/home/home_gallery_widget.dart b/mobile/lib/ui/home/home_gallery_widget.dart index aaac05504e..2307633b3e 100644 --- a/mobile/lib/ui/home/home_gallery_widget.dart +++ b/mobile/lib/ui/home/home_gallery_widget.dart @@ -1,3 +1,5 @@ +import "dart:async"; + import 'package:flutter/material.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/core/event_bus.dart'; @@ -5,18 +7,21 @@ import 'package:photos/db/files_db.dart'; import 'package:photos/events/backup_folders_updated_event.dart'; import 'package:photos/events/files_updated_event.dart'; import 'package:photos/events/force_reload_home_gallery_event.dart'; +import "package:photos/events/hide_shared_items_from_home_gallery_event.dart"; import 'package:photos/events/local_photos_updated_event.dart'; import 'package:photos/models/file_load_result.dart'; import 'package:photos/models/gallery_type.dart'; import 'package:photos/models/selected_files.dart'; +import "package:photos/service_locator.dart"; import 'package:photos/services/collections_service.dart'; import "package:photos/services/filter/db_filters.dart"; import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart'; import 'package:photos/ui/viewer/gallery/gallery.dart'; import "package:photos/ui/viewer/gallery/state/gallery_files_inherited_widget.dart"; import "package:photos/ui/viewer/gallery/state/selection_state.dart"; +import "package:photos/utils/debouncer.dart"; -class HomeGalleryWidget extends StatelessWidget { +class HomeGalleryWidget extends StatefulWidget { final Widget? header; final Widget? footer; final SelectedFiles selectedFiles; @@ -28,10 +33,49 @@ class HomeGalleryWidget extends StatelessWidget { required this.selectedFiles, }); + @override + State createState() => _HomeGalleryWidgetState(); +} + +class _HomeGalleryWidgetState extends State { + late final StreamSubscription + _hideSharedFilesFromHomeSubscription; + bool _shouldHideSharedItems = localSettings.hideSharedItemsFromHomeGallery; + + /// This deboucner is to delay the UI update of the shared items toggle + /// since it's expensive (a new differnt key is used for the gallery + /// widget when hide is toggled), without which, causes the toggle button used + /// for it in settings to have janky animation. + final _hideSharedItemsToggleDebouncer = Debouncer( + const Duration(milliseconds: 500), + ); + + @override + void initState() { + super.initState(); + _hideSharedFilesFromHomeSubscription = + Bus.instance.on().listen((event) { + localSettings.setHideSharedItemsFromHomeGallery(event.shouldHide); + _hideSharedItemsToggleDebouncer.run(() async { + setState(() { + _shouldHideSharedItems = event.shouldHide; + }); + }); + }); + } + + @override + void dispose() { + super.dispose(); + _hideSharedFilesFromHomeSubscription.cancel(); + _hideSharedItemsToggleDebouncer.cancelDebounceTimer(); + } + @override Widget build(BuildContext context) { final double bottomSafeArea = MediaQuery.paddingOf(context).bottom; final gallery = Gallery( + key: ValueKey(_shouldHideSharedItems), asyncLoader: (creationStartTime, creationEndTime, {limit, asc}) async { final ownerID = Configuration.instance.getUserID(); final hasSelectedAllForBackup = @@ -61,6 +105,7 @@ class HomeGalleryWidget extends StatelessWidget { limit: limit, asc: asc, filterOptions: filterOptions, + applyOwnerCheck: _shouldHideSharedItems, ); } @@ -78,9 +123,9 @@ class HomeGalleryWidget extends StatelessWidget { Bus.instance.on(), ], tagPrefix: "home_gallery", - selectedFiles: selectedFiles, - header: header, - footer: footer, + selectedFiles: widget.selectedFiles, + header: widget.header, + footer: widget.footer, // scrollSafe area -> SafeArea + Preserver more + Nav Bar buttons scrollBottomSafeArea: bottomSafeArea + 180, reloadDebounceTime: const Duration(seconds: 2), @@ -88,12 +133,12 @@ class HomeGalleryWidget extends StatelessWidget { ); return GalleryFilesState( child: SelectionState( - selectedFiles: selectedFiles, + selectedFiles: widget.selectedFiles, child: Stack( alignment: Alignment.bottomCenter, children: [ gallery, - FileSelectionOverlayBar(GalleryType.homepage, selectedFiles), + FileSelectionOverlayBar(GalleryType.homepage, widget.selectedFiles), ], ), ), diff --git a/mobile/lib/ui/settings/advanced_settings_screen.dart b/mobile/lib/ui/settings/advanced_settings_screen.dart index c384bfd7f5..dd767426d1 100644 --- a/mobile/lib/ui/settings/advanced_settings_screen.dart +++ b/mobile/lib/ui/settings/advanced_settings_screen.dart @@ -2,6 +2,8 @@ import "dart:async"; import 'package:flutter/material.dart'; import "package:photos/core/error-reporting/super_logging.dart"; +import "package:photos/core/event_bus.dart"; +import "package:photos/events/hide_shared_items_from_home_gallery_event.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/service_locator.dart"; import "package:photos/services/memories_service.dart"; @@ -189,6 +191,35 @@ class _AdvancedSettingsScreenState extends State { }, ), ), + const SizedBox( + height: 24, + ), + MenuItemWidget( + captionedTextWidget: const CaptionedTextWidget( + title: "Hide shared items from home gallery", + ), + menuItemColor: colorScheme.fillFaint, + singleBorderRadius: 8, + alignCaptionedTextToLeft: true, + trailingWidget: ToggleSwitchWidget( + value: () => localSettings + .hideSharedItemsFromHomeGallery, + onChanged: () async { + final prevSetting = localSettings + .hideSharedItemsFromHomeGallery; + await localSettings + .setHideSharedItemsFromHomeGallery( + !prevSetting, + ); + + Bus.instance.fire( + HideSharedItemsFromHomeGalleryEvent( + !prevSetting, + ), + ); + }, + ), + ), ], ), ], diff --git a/mobile/lib/utils/local_settings.dart b/mobile/lib/utils/local_settings.dart index 1375d1d214..204db7d3ca 100644 --- a/mobile/lib/utils/local_settings.dart +++ b/mobile/lib/utils/local_settings.dart @@ -20,6 +20,8 @@ class LocalSettings { static const onGuestViewKey = "on_guest_view"; static const _hasConfiguredLinksInAppPermissionKey = "has_configured_links_in_app_permission"; + static const _hideSharedItemsFromHomeGalleryTag = + "hide_shared_items_from_home_gallery"; final SharedPreferences _prefs; @@ -118,4 +120,11 @@ class LocalSettings { final result = _prefs.getBool(_hasConfiguredLinksInAppPermissionKey); return result ?? false; } + + Future setHideSharedItemsFromHomeGallery(bool value) async { + await _prefs.setBool(_hideSharedItemsFromHomeGalleryTag, value); + } + + bool get hideSharedItemsFromHomeGallery => + _prefs.getBool(_hideSharedItemsFromHomeGalleryTag) ?? false; }