[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
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
import "package:photos/events/event.dart";
|
||||
|
||||
class HideSharedItemsFromHomeGalleryEvent extends Event {
|
||||
final bool shouldHide;
|
||||
|
||||
HideSharedItemsFromHomeGalleryEvent(this.shouldHide);
|
||||
}
|
||||
@@ -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<HomeGalleryWidget> createState() => _HomeGalleryWidgetState();
|
||||
}
|
||||
|
||||
class _HomeGalleryWidgetState extends State<HomeGalleryWidget> {
|
||||
late final StreamSubscription<HideSharedItemsFromHomeGalleryEvent>
|
||||
_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<HideSharedItemsFromHomeGalleryEvent>().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<ForceReloadHomeGalleryEvent>(),
|
||||
],
|
||||
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),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@@ -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<AdvancedSettingsScreen> {
|
||||
},
|
||||
),
|
||||
),
|
||||
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,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
|
||||
@@ -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<void> setHideSharedItemsFromHomeGallery(bool value) async {
|
||||
await _prefs.setBool(_hideSharedItemsFromHomeGalleryTag, value);
|
||||
}
|
||||
|
||||
bool get hideSharedItemsFromHomeGallery =>
|
||||
_prefs.getBool(_hideSharedItemsFromHomeGalleryTag) ?? false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user