From 8ce8eb8c71b48141436232fcb1f4576a0d574e69 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Mon, 23 Jan 2023 15:59:53 +0100 Subject: [PATCH] prevent conflict between drawer drag gesture and Android navigation gestures --- lib/widgets/about/about_page.dart | 5 ++- lib/widgets/about/policy_page.dart | 3 +- lib/widgets/aves_app.dart | 3 +- lib/widgets/collection/collection_page.dart | 5 ++- lib/widgets/common/basic/scaffold.dart | 43 +++++++++++++++++++ lib/widgets/common/search/page.dart | 3 +- lib/widgets/debug/app_debug_page.dart | 3 +- .../entry_editors/rename_entry_set_page.dart | 3 +- .../entry_editors/tag_editor_page.dart | 3 +- .../dialogs/pick_dialogs/app_pick_page.dart | 3 +- .../dialogs/pick_dialogs/item_pick_page.dart | 3 +- .../pick_dialogs/location_pick_page.dart | 3 +- .../filter_grids/common/filter_grid_page.dart | 5 ++- lib/widgets/home_page.dart | 3 +- lib/widgets/map/map_page.dart | 3 +- .../common/quick_actions/editor_page.dart | 3 +- .../settings/home_widget_settings_page.dart | 3 +- .../language/locale_selection_page.dart | 3 +- .../navigation/confirmation_dialogs.dart | 3 +- lib/widgets/settings/navigation/drawer.dart | 3 +- .../settings/privacy/access_grants_page.dart | 3 +- .../privacy/file_picker/file_picker_page.dart | 3 +- .../settings/privacy/hidden_items_page.dart | 3 +- .../settings/screen_saver_settings_page.dart | 3 +- lib/widgets/settings/settings_page.dart | 5 ++- .../collection_actions_editor_page.dart | 3 +- lib/widgets/settings/thumbnails/overlay.dart | 3 +- lib/widgets/settings/video/controls.dart | 3 +- .../settings/video/subtitle_theme.dart | 3 +- .../settings/video/video_settings_page.dart | 3 +- lib/widgets/settings/viewer/overlay.dart | 3 +- lib/widgets/settings/viewer/slideshow.dart | 3 +- lib/widgets/stats/stats_page.dart | 5 ++- lib/widgets/viewer/entry_viewer_page.dart | 3 +- lib/widgets/viewer/info/info_page.dart | 3 +- lib/widgets/viewer/panorama_page.dart | 3 +- lib/widgets/viewer/screen_saver_page.dart | 3 +- lib/widgets/viewer/slideshow_page.dart | 3 +- lib/widgets/viewer/source_viewer_page.dart | 3 +- lib/widgets/wallpaper_page.dart | 3 +- lib/widgets/welcome_page.dart | 3 +- 41 files changed, 128 insertions(+), 45 deletions(-) create mode 100644 lib/widgets/common/basic/scaffold.dart diff --git a/lib/widgets/about/about_page.dart b/lib/widgets/about/about_page.dart index 4888d01bc..357607629 100644 --- a/lib/widgets/about/about_page.dart +++ b/lib/widgets/about/about_page.dart @@ -5,6 +5,7 @@ import 'package:aves/widgets/about/credits.dart'; import 'package:aves/widgets/about/licenses.dart'; import 'package:aves/widgets/about/translators.dart'; import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/basic/tv_edge_focus.dart'; import 'package:aves/widgets/common/behaviour/pop/scope.dart'; import 'package:aves/widgets/common/behaviour/pop/tv_navigation.dart'; @@ -50,7 +51,7 @@ class AboutPage extends StatelessWidget { ); if (useTvLayout) { - return Scaffold( + return AvesScaffold( body: AvesPopScope( handlers: const [TvNavigationPopHandler.pop], child: Row( @@ -69,7 +70,7 @@ class AboutPage extends StatelessWidget { ), ); } else { - return Scaffold( + return AvesScaffold( appBar: AppBar( title: appBarTitle, ), diff --git a/lib/widgets/about/policy_page.dart b/lib/widgets/about/policy_page.dart index 3803bae2f..26eb8d7b7 100644 --- a/lib/widgets/about/policy_page.dart +++ b/lib/widgets/about/policy_page.dart @@ -1,5 +1,6 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/widgets/common/basic/markdown_container.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -28,7 +29,7 @@ class _PolicyPageState extends State { @override Widget build(BuildContext context) { - return Scaffold( + return AvesScaffold( appBar: AppBar( automaticallyImplyLeading: !settings.useTvLayout, title: Text(context.l10n.policyPageTitle), diff --git a/lib/widgets/aves_app.dart b/lib/widgets/aves_app.dart index d671d862a..3a2c4fded 100644 --- a/lib/widgets/aves_app.dart +++ b/lib/widgets/aves_app.dart @@ -29,6 +29,7 @@ import 'package:aves/utils/constants.dart'; import 'package:aves/utils/debouncer.dart'; import 'package:aves/widgets/collection/collection_grid.dart'; import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/behaviour/route_tracker.dart'; import 'package:aves/widgets/common/behaviour/routes.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; @@ -210,7 +211,7 @@ class _AvesAppState extends State with WidgetsBindingObserver { } final home = initialized ? _getFirstPage() - : Scaffold( + : AvesScaffold( body: snapshot.hasError ? _buildError(snapshot.error!) : const SizedBox(), ); return Selector>( diff --git a/lib/widgets/collection/collection_page.dart b/lib/widgets/collection/collection_page.dart index 3392ad66e..37d8cdb59 100644 --- a/lib/widgets/collection/collection_page.dart +++ b/lib/widgets/collection/collection_page.dart @@ -16,6 +16,7 @@ import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/collection/collection_grid.dart'; import 'package:aves/widgets/common/basic/draggable_scrollbar.dart'; import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/behaviour/pop/double_back.dart'; import 'package:aves/widgets/common/behaviour/pop/scope.dart'; import 'package:aves/widgets/common/behaviour/pop/tv_navigation.dart'; @@ -125,7 +126,7 @@ class _CollectionPageState extends State { Widget page; if (useTvLayout) { - page = Scaffold( + page = AvesScaffold( body: Row( children: [ TvRail( @@ -150,7 +151,7 @@ class _CollectionPageState extends State { _draggableScrollBarEventStreamController.add(notification.event); return false; }, - child: Scaffold( + child: AvesScaffold( body: body, floatingActionButton: _buildFab(context, hasSelection), drawer: canNavigate ? AppDrawer(currentCollection: _collection) : null, diff --git a/lib/widgets/common/basic/scaffold.dart b/lib/widgets/common/basic/scaffold.dart new file mode 100644 index 000000000..e70c0fdda --- /dev/null +++ b/lib/widgets/common/basic/scaffold.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class AvesScaffold extends StatelessWidget { + final PreferredSizeWidget? appBar; + final Widget? body; + final Widget? floatingActionButton; + final Widget? drawer; + final Widget? bottomNavigationBar; + final Color? backgroundColor; + final bool? resizeToAvoidBottomInset; + final bool extendBody; + + const AvesScaffold({ + super.key, + this.appBar, + this.body, + this.floatingActionButton, + this.drawer, + this.bottomNavigationBar, + this.backgroundColor, + this.resizeToAvoidBottomInset, + this.extendBody = false, + }); + + @override + Widget build(BuildContext context) { + // prevent conflict between drawer drag gesture and Android navigation gestures + final drawerEnableOpenDragGesture = context.select((mq) => mq.systemGestureInsets.horizontal == 0); + + return Scaffold( + appBar: appBar, + body: body, + floatingActionButton: floatingActionButton, + drawer: drawer, + bottomNavigationBar: bottomNavigationBar, + backgroundColor: backgroundColor, + resizeToAvoidBottomInset: resizeToAvoidBottomInset, + extendBody: extendBody, + drawerEnableOpenDragGesture: drawerEnableOpenDragGesture, + ); + } +} diff --git a/lib/widgets/common/search/page.dart b/lib/widgets/common/search/page.dart index 58ebf7e9d..3ef96f5ec 100644 --- a/lib/widgets/common/search/page.dart +++ b/lib/widgets/common/search/page.dart @@ -2,6 +2,7 @@ import 'dart:ui'; import 'package:aves/theme/durations.dart'; import 'package:aves/utils/debouncer.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/behaviour/pop/double_back.dart'; import 'package:aves/widgets/common/behaviour/pop/scope.dart'; import 'package:aves/widgets/common/behaviour/pop/tv_navigation.dart'; @@ -123,7 +124,7 @@ class _SearchPageState extends State { case null: break; } - return Scaffold( + return AvesScaffold( appBar: AppBar( leading: Hero( tag: AvesAppBar.leadingHeroTag, diff --git a/lib/widgets/debug/app_debug_page.dart b/lib/widgets/debug/app_debug_page.dart index dff652019..20354ee8a 100644 --- a/lib/widgets/debug/app_debug_page.dart +++ b/lib/widgets/debug/app_debug_page.dart @@ -9,6 +9,7 @@ import 'package:aves/services/analysis_service.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/widgets/common/basic/menu.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/behaviour/pop/scope.dart'; import 'package:aves/widgets/common/behaviour/pop/tv_navigation.dart'; import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; @@ -44,7 +45,7 @@ class _AppDebugPageState extends State { Widget build(BuildContext context) { return Directionality( textDirection: TextDirection.ltr, - child: Scaffold( + child: AvesScaffold( appBar: AppBar( title: const Text('Debug'), actions: [ diff --git a/lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart b/lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart index 0ff65d35b..331772cc2 100644 --- a/lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart +++ b/lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart @@ -8,6 +8,7 @@ import 'package:aves/theme/icons.dart'; import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/collection/collection_grid.dart'; import 'package:aves/widgets/common/basic/menu.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/grid/theme.dart'; import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; @@ -58,7 +59,7 @@ class _RenameEntrySetPageState extends State { @override Widget build(BuildContext context) { final l10n = context.l10n; - return Scaffold( + return AvesScaffold( appBar: AppBar( title: Text(l10n.renameEntrySetPageTitle), ), diff --git a/lib/widgets/dialogs/entry_editors/tag_editor_page.dart b/lib/widgets/dialogs/entry_editors/tag_editor_page.dart index 9596b7a41..47ba700ef 100644 --- a/lib/widgets/dialogs/entry_editors/tag_editor_page.dart +++ b/lib/widgets/dialogs/entry_editors/tag_editor_page.dart @@ -6,6 +6,7 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/expandable_filter_row.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; @@ -61,7 +62,7 @@ class _TagEditorPageState extends State { }); List> sortedTags = _sortCurrentTags(entryCountByTag); - return Scaffold( + return AvesScaffold( appBar: AppBar( title: Text(l10n.tagEditorPageTitle), actions: [ diff --git a/lib/widgets/dialogs/pick_dialogs/app_pick_page.dart b/lib/widgets/dialogs/pick_dialogs/app_pick_page.dart index 95a1a078a..e49e7334b 100644 --- a/lib/widgets/dialogs/pick_dialogs/app_pick_page.dart +++ b/lib/widgets/dialogs/pick_dialogs/app_pick_page.dart @@ -4,6 +4,7 @@ import 'package:aves/services/common/services.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/widgets/common/basic/query_bar.dart'; import 'package:aves/widgets/common/basic/reselectable_radio_list_tile.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; @@ -39,7 +40,7 @@ class _AppPickPageState extends State { @override Widget build(BuildContext context) { final useTvLayout = settings.useTvLayout; - return Scaffold( + return AvesScaffold( appBar: AppBar( automaticallyImplyLeading: !useTvLayout, title: Text(context.l10n.appPickDialogTitle), diff --git a/lib/widgets/dialogs/pick_dialogs/item_pick_page.dart b/lib/widgets/dialogs/pick_dialogs/item_pick_page.dart index 7f84a01a8..72ad90cc0 100644 --- a/lib/widgets/dialogs/pick_dialogs/item_pick_page.dart +++ b/lib/widgets/dialogs/pick_dialogs/item_pick_page.dart @@ -5,6 +5,7 @@ import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/widgets/collection/collection_grid.dart'; import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/providers/query_provider.dart'; import 'package:aves/widgets/common/providers/selection_provider.dart'; import 'package:collection/collection.dart'; @@ -39,7 +40,7 @@ class _ItemPickPageState extends State { final liveFilter = collection.filters.firstWhereOrNull((v) => v is QueryFilter && v.live) as QueryFilter?; return ListenableProvider>.value( value: ValueNotifier(AppMode.pickMediaInternal), - child: Scaffold( + child: AvesScaffold( body: SelectionProvider( child: QueryProvider( initialQuery: liveFilter?.query, diff --git a/lib/widgets/dialogs/pick_dialogs/location_pick_page.dart b/lib/widgets/dialogs/pick_dialogs/location_pick_page.dart index c32b3e703..a14a15fad 100644 --- a/lib/widgets/dialogs/pick_dialogs/location_pick_page.dart +++ b/lib/widgets/dialogs/pick_dialogs/location_pick_page.dart @@ -10,6 +10,7 @@ import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/constants.dart'; import 'package:aves/utils/debouncer.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; import 'package:aves/widgets/common/map/geo_map.dart'; @@ -34,7 +35,7 @@ class LocationPickPage extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( + return AvesScaffold( body: SafeArea( left: false, top: false, diff --git a/lib/widgets/filter_grids/common/filter_grid_page.dart b/lib/widgets/filter_grids/common/filter_grid_page.dart index 0689fcd71..19551c323 100644 --- a/lib/widgets/filter_grids/common/filter_grid_page.dart +++ b/lib/widgets/filter_grids/common/filter_grid_page.dart @@ -13,6 +13,7 @@ import 'package:aves/theme/colors.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/common/basic/draggable_scrollbar.dart'; import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/behaviour/pop/double_back.dart'; import 'package:aves/widgets/common/behaviour/pop/scope.dart'; import 'package:aves/widgets/common/behaviour/pop/tv_navigation.dart'; @@ -117,7 +118,7 @@ class FilterGridPage extends StatelessWidget { if (useTvLayout) { final canNavigate = context.select, bool>((v) => v.value.canNavigate); - return Scaffold( + return AvesScaffold( body: canNavigate ? Row( children: [ @@ -148,7 +149,7 @@ class FilterGridPage extends StatelessWidget { _draggableScrollBarEventStreamController.add(notification.event); return false; }, - child: Scaffold( + child: AvesScaffold( body: body, drawer: canNavigate ? const AppDrawer() : null, bottomNavigationBar: showBottomNavigationBar diff --git a/lib/widgets/home_page.dart b/lib/widgets/home_page.dart index bf176e607..be46586ce 100644 --- a/lib/widgets/home_page.dart +++ b/lib/widgets/home_page.dart @@ -18,6 +18,7 @@ import 'package:aves/services/widget_service.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/behaviour/routes.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/search/page.dart'; @@ -88,7 +89,7 @@ class _HomePageState extends State { } @override - Widget build(BuildContext context) => const Scaffold(); + Widget build(BuildContext context) => const AvesScaffold(); Future _setup() async { final stopwatch = Stopwatch()..start(); diff --git a/lib/widgets/map/map_page.dart b/lib/widgets/map/map_page.dart index c9d67be3d..97d30fb9e 100644 --- a/lib/widgets/map/map_page.dart +++ b/lib/widgets/map/map_page.dart @@ -19,6 +19,7 @@ import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/collection/entry_set_action_delegate.dart'; import 'package:aves/widgets/common/basic/insets.dart'; import 'package:aves/widgets/common/basic/menu.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/behaviour/routes.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; @@ -59,7 +60,7 @@ class MapPage extends StatelessWidget { // as the map can be stacked on top of other pages // that catch highlight events and will not let it bubble up return HighlightInfoProvider( - child: Scaffold( + child: AvesScaffold( body: SafeArea( left: false, top: false, diff --git a/lib/widgets/settings/common/quick_actions/editor_page.dart b/lib/widgets/settings/common/quick_actions/editor_page.dart index c2b238d69..4736dd4d4 100644 --- a/lib/widgets/settings/common/quick_actions/editor_page.dart +++ b/lib/widgets/settings/common/quick_actions/editor_page.dart @@ -4,6 +4,7 @@ import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/change_notifier.dart'; import 'package:aves/utils/constants.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; @@ -37,7 +38,7 @@ class QuickActionEditorPage extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( + return AvesScaffold( appBar: AppBar( title: Text(title), ), diff --git a/lib/widgets/settings/home_widget_settings_page.dart b/lib/widgets/settings/home_widget_settings_page.dart index fe5f81068..a0c1341c6 100644 --- a/lib/widgets/settings/home_widget_settings_page.dart +++ b/lib/widgets/settings/home_widget_settings_page.dart @@ -8,6 +8,7 @@ import 'package:aves/services/widget_service.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/constants.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/fx/borders.dart'; import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; @@ -67,7 +68,7 @@ class _HomeWidgetSettingsPageState extends State { @override Widget build(BuildContext context) { final l10n = context.l10n; - return Scaffold( + return AvesScaffold( appBar: AppBar( title: Text(l10n.settingsWidgetPageTitle), ), diff --git a/lib/widgets/settings/language/locale_selection_page.dart b/lib/widgets/settings/language/locale_selection_page.dart index fa5e39c6f..8c95015f5 100644 --- a/lib/widgets/settings/language/locale_selection_page.dart +++ b/lib/widgets/settings/language/locale_selection_page.dart @@ -4,6 +4,7 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/widgets/aves_app.dart'; import 'package:aves/widgets/common/basic/query_bar.dart'; import 'package:aves/widgets/common/basic/reselectable_radio_list_tile.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/language/locale_tile.dart'; import 'package:collection/collection.dart'; @@ -31,7 +32,7 @@ class _LocaleSelectionPageState extends State { @override Widget build(BuildContext context) { final useTvLayout = settings.useTvLayout; - return Scaffold( + return AvesScaffold( appBar: AppBar( automaticallyImplyLeading: !useTvLayout, title: Text(context.l10n.settingsLanguagePageTitle), diff --git a/lib/widgets/settings/navigation/confirmation_dialogs.dart b/lib/widgets/settings/navigation/confirmation_dialogs.dart index 95172f23b..59c051bd1 100644 --- a/lib/widgets/settings/navigation/confirmation_dialogs.dart +++ b/lib/widgets/settings/navigation/confirmation_dialogs.dart @@ -1,4 +1,5 @@ import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/common/tiles.dart'; import 'package:flutter/material.dart'; @@ -11,7 +12,7 @@ class ConfirmationDialogPage extends StatelessWidget { @override Widget build(BuildContext context) { final l10n = context.l10n; - return Scaffold( + return AvesScaffold( appBar: AppBar( title: Text(l10n.settingsConfirmationDialogTitle), ), diff --git a/lib/widgets/settings/navigation/drawer.dart b/lib/widgets/settings/navigation/drawer.dart index e0df890b5..6cb73edfd 100644 --- a/lib/widgets/settings/navigation/drawer.dart +++ b/lib/widgets/settings/navigation/drawer.dart @@ -1,6 +1,7 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/recent.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/search/page.dart'; import 'package:aves/widgets/filter_grids/albums_page.dart'; @@ -91,7 +92,7 @@ class _NavigationDrawerEditorPageState extends State return DefaultTabController( length: tabs.length, - child: Scaffold( + child: AvesScaffold( appBar: AppBar( automaticallyImplyLeading: !settings.useTvLayout, title: Text(l10n.settingsNavigationDrawerEditorPageTitle), diff --git a/lib/widgets/settings/privacy/access_grants_page.dart b/lib/widgets/settings/privacy/access_grants_page.dart index 19612b2dd..1176a8961 100644 --- a/lib/widgets/settings/privacy/access_grants_page.dart +++ b/lib/widgets/settings/privacy/access_grants_page.dart @@ -1,5 +1,6 @@ import 'package:aves/services/common/services.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/empty.dart'; import 'package:flutter/material.dart'; @@ -27,7 +28,7 @@ class _StorageAccessPageState extends State { @override Widget build(BuildContext context) { - return Scaffold( + return AvesScaffold( appBar: AppBar( title: Text(context.l10n.settingsStorageAccessPageTitle), ), diff --git a/lib/widgets/settings/privacy/file_picker/file_picker_page.dart b/lib/widgets/settings/privacy/file_picker/file_picker_page.dart index ed718a1ce..c20b29b25 100644 --- a/lib/widgets/settings/privacy/file_picker/file_picker_page.dart +++ b/lib/widgets/settings/privacy/file_picker/file_picker_page.dart @@ -7,6 +7,7 @@ import 'package:aves/theme/icons.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/basic/menu.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; import 'package:aves/widgets/common/identity/empty.dart'; @@ -64,7 +65,7 @@ class _FilePickerPageState extends State { setState(() {}); return SynchronousFuture(false); }, - child: Scaffold( + child: AvesScaffold( appBar: AppBar( title: Text(_getTitle(context)), actions: [ diff --git a/lib/widgets/settings/privacy/hidden_items_page.dart b/lib/widgets/settings/privacy/hidden_items_page.dart index 29a3df0cf..62a63b537 100644 --- a/lib/widgets/settings/privacy/hidden_items_page.dart +++ b/lib/widgets/settings/privacy/hidden_items_page.dart @@ -3,6 +3,7 @@ import 'package:aves/model/filters/path.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; @@ -34,7 +35,7 @@ class HiddenItemsPage extends StatelessWidget { return DefaultTabController( length: tabs.length, - child: Scaffold( + child: AvesScaffold( appBar: AppBar( automaticallyImplyLeading: !settings.useTvLayout, title: Text(l10n.settingsHiddenItemsPageTitle), diff --git a/lib/widgets/settings/screen_saver_settings_page.dart b/lib/widgets/settings/screen_saver_settings_page.dart index 5e252e4c7..8d7902244 100644 --- a/lib/widgets/settings/screen_saver_settings_page.dart +++ b/lib/widgets/settings/screen_saver_settings_page.dart @@ -3,6 +3,7 @@ import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/enums/slideshow_video_playback.dart'; import 'package:aves/model/settings/enums/viewer_transition.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/common/collection_tile.dart'; import 'package:aves/widgets/settings/common/tiles.dart'; @@ -17,7 +18,7 @@ class ScreenSaverSettingsPage extends StatelessWidget { @override Widget build(BuildContext context) { final l10n = context.l10n; - return Scaffold( + return AvesScaffold( appBar: AppBar( title: Text(l10n.settingsScreenSaverPageTitle), ), diff --git a/lib/widgets/settings/settings_page.dart b/lib/widgets/settings/settings_page.dart index d2e9a4e6d..7f32fcd0c 100644 --- a/lib/widgets/settings/settings_page.dart +++ b/lib/widgets/settings/settings_page.dart @@ -13,6 +13,7 @@ import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:aves/widgets/common/app_bar/app_bar_title.dart'; import 'package:aves/widgets/common/basic/insets.dart'; import 'package:aves/widgets/common/basic/menu.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/behaviour/pop/scope.dart'; import 'package:aves/widgets/common/behaviour/pop/tv_navigation.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; @@ -74,7 +75,7 @@ class _SettingsPageState extends State with FeedbackMixin { final appBarTitle = Text(context.l10n.settingsPageTitle); if (settings.useTvLayout) { - return Scaffold( + return AvesScaffold( body: AvesPopScope( handlers: const [TvNavigationPopHandler.pop], child: Row( @@ -148,7 +149,7 @@ class _SettingsPageState extends State with FeedbackMixin { ), ); } else { - return Scaffold( + return AvesScaffold( appBar: AppBar( title: InteractiveAppBarTitle( onTap: () => _goToSearch(context), diff --git a/lib/widgets/settings/thumbnails/collection_actions_editor_page.dart b/lib/widgets/settings/thumbnails/collection_actions_editor_page.dart index 24d3e0d38..82e7495b2 100644 --- a/lib/widgets/settings/thumbnails/collection_actions_editor_page.dart +++ b/lib/widgets/settings/thumbnails/collection_actions_editor_page.dart @@ -1,5 +1,6 @@ import 'package:aves/model/actions/entry_set_actions.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/common/quick_actions/editor_page.dart'; import 'package:flutter/material.dart'; @@ -43,7 +44,7 @@ class CollectionActionEditorPage extends StatelessWidget { return DefaultTabController( length: tabs.length, - child: Scaffold( + child: AvesScaffold( appBar: AppBar( title: Text(context.l10n.settingsCollectionQuickActionEditorPageTitle), bottom: TabBar( diff --git a/lib/widgets/settings/thumbnails/overlay.dart b/lib/widgets/settings/thumbnails/overlay.dart index 56ed0d055..b8c47950e 100644 --- a/lib/widgets/settings/thumbnails/overlay.dart +++ b/lib/widgets/settings/thumbnails/overlay.dart @@ -5,6 +5,7 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/aves_icons.dart'; import 'package:aves/widgets/settings/common/tiles.dart'; @@ -22,7 +23,7 @@ class ThumbnailOverlayPage extends StatelessWidget { final iconSize = _getIconSize(context); final iconColor = _getIconColor(context); - return Scaffold( + return AvesScaffold( appBar: AppBar( automaticallyImplyLeading: !settings.useTvLayout, title: Text(context.l10n.settingsThumbnailOverlayPageTitle), diff --git a/lib/widgets/settings/video/controls.dart b/lib/widgets/settings/video/controls.dart index d7743500c..cbe4423b9 100644 --- a/lib/widgets/settings/video/controls.dart +++ b/lib/widgets/settings/video/controls.dart @@ -1,6 +1,7 @@ import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/enums/video_controls.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/common/tiles.dart'; import 'package:flutter/material.dart'; @@ -12,7 +13,7 @@ class VideoControlsPage extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( + return AvesScaffold( appBar: AppBar( title: Text(context.l10n.settingsVideoControlsPageTitle), ), diff --git a/lib/widgets/settings/video/subtitle_theme.dart b/lib/widgets/settings/video/subtitle_theme.dart index 14fb00feb..220edce07 100644 --- a/lib/widgets/settings/video/subtitle_theme.dart +++ b/lib/widgets/settings/video/subtitle_theme.dart @@ -2,6 +2,7 @@ import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/enums/subtitle_position.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/widgets/common/basic/color_list_tile.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/basic/slider_list_tile.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/common/tiles.dart'; @@ -16,7 +17,7 @@ class SubtitleThemePage extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( + return AvesScaffold( appBar: AppBar( automaticallyImplyLeading: !settings.useTvLayout, title: Text(context.l10n.settingsSubtitleThemePageTitle), diff --git a/lib/widgets/settings/video/video_settings_page.dart b/lib/widgets/settings/video/video_settings_page.dart index f01b7bf85..534396038 100644 --- a/lib/widgets/settings/video/video_settings_page.dart +++ b/lib/widgets/settings/video/video_settings_page.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/settings_definition.dart'; import 'package:aves/widgets/settings/video/video.dart'; @@ -19,7 +20,7 @@ class _VideoSettingsPageState extends State { @override Widget build(BuildContext context) { final theme = Theme.of(context); - return Scaffold( + return AvesScaffold( appBar: AppBar( automaticallyImplyLeading: !settings.useTvLayout, title: Text(context.l10n.settingsVideoPageTitle), diff --git a/lib/widgets/settings/viewer/overlay.dart b/lib/widgets/settings/viewer/overlay.dart index acfd88678..33110575e 100644 --- a/lib/widgets/settings/viewer/overlay.dart +++ b/lib/widgets/settings/viewer/overlay.dart @@ -1,4 +1,5 @@ import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/common/tiles.dart'; import 'package:flutter/material.dart'; @@ -13,7 +14,7 @@ class ViewerOverlayPage extends StatelessWidget { @override Widget build(BuildContext context) { final useTvLayout = settings.useTvLayout; - return Scaffold( + return AvesScaffold( appBar: AppBar( automaticallyImplyLeading: !useTvLayout, title: Text(context.l10n.settingsViewerOverlayPageTitle), diff --git a/lib/widgets/settings/viewer/slideshow.dart b/lib/widgets/settings/viewer/slideshow.dart index 208bca58d..b2f954c23 100644 --- a/lib/widgets/settings/viewer/slideshow.dart +++ b/lib/widgets/settings/viewer/slideshow.dart @@ -2,6 +2,7 @@ import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/enums/slideshow_video_playback.dart'; import 'package:aves/model/settings/enums/viewer_transition.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/common/tiles.dart'; import 'package:flutter/material.dart'; @@ -14,7 +15,7 @@ class ViewerSlideshowPage extends StatelessWidget { @override Widget build(BuildContext context) { final l10n = context.l10n; - return Scaffold( + return AvesScaffold( appBar: AppBar( automaticallyImplyLeading: !settings.useTvLayout, title: Text(l10n.settingsViewerSlideshowPageTitle), diff --git a/lib/widgets/stats/stats_page.dart b/lib/widgets/stats/stats_page.dart index 96a7dd85d..20c7a118d 100644 --- a/lib/widgets/stats/stats_page.dart +++ b/lib/widgets/stats/stats_page.dart @@ -15,6 +15,7 @@ import 'package:aves/theme/icons.dart'; import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/basic/tv_edge_focus.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/extensions/media_query.dart'; @@ -219,7 +220,7 @@ class _StatsPageState extends State { } } - return Scaffold( + return AvesScaffold( appBar: AppBar( automaticallyImplyLeading: !useTvLayout, title: Text(l10n.statsPageTitle), @@ -366,7 +367,7 @@ class StatsTopPage extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( + return AvesScaffold( appBar: AppBar( automaticallyImplyLeading: !settings.useTvLayout, title: Text(title), diff --git a/lib/widgets/viewer/entry_viewer_page.dart b/lib/widgets/viewer/entry_viewer_page.dart index a58dc6315..fc860189d 100644 --- a/lib/widgets/viewer/entry_viewer_page.dart +++ b/lib/widgets/viewer/entry_viewer_page.dart @@ -1,5 +1,6 @@ import 'package:aves/model/entry.dart'; import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/viewer/controller.dart'; import 'package:aves/widgets/viewer/entry_viewer_stack.dart'; import 'package:aves/widgets/viewer/multipage/conductor.dart'; @@ -40,7 +41,7 @@ class _EntryViewerPageState extends State { @override Widget build(BuildContext context) { - return Scaffold( + return AvesScaffold( body: ViewStateConductorProvider( child: VideoConductorProvider( child: MultiPageConductorProvider( diff --git a/lib/widgets/viewer/info/info_page.dart b/lib/widgets/viewer/info/info_page.dart index 58e56006f..0552f7f1e 100644 --- a/lib/widgets/viewer/info/info_page.dart +++ b/lib/widgets/viewer/info/info_page.dart @@ -7,6 +7,7 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/basic/tv_edge_focus.dart'; import 'package:aves/widgets/filter_grids/common/action_delegates/chip.dart'; import 'package:aves/widgets/viewer/action/entry_info_action_delegate.dart'; @@ -85,7 +86,7 @@ class _InfoPageState extends State { @override Widget build(BuildContext context) { - return Scaffold( + return AvesScaffold( body: GestureAreaProtectorStack( child: SafeArea( bottom: false, diff --git a/lib/widgets/viewer/panorama_page.dart b/lib/widgets/viewer/panorama_page.dart index 69a38bfd5..ea1dbcd8f 100644 --- a/lib/widgets/viewer/panorama_page.dart +++ b/lib/widgets/viewer/panorama_page.dart @@ -7,6 +7,7 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/aves_app.dart'; import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/extensions/media_query.dart'; import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; @@ -60,7 +61,7 @@ class _PanoramaPageState extends State { _onLeave(); return SynchronousFuture(true); }, - child: Scaffold( + child: AvesScaffold( body: Stack( children: [ ValueListenableBuilder( diff --git a/lib/widgets/viewer/screen_saver_page.dart b/lib/widgets/viewer/screen_saver_page.dart index 30c1064c4..61ec663e4 100644 --- a/lib/widgets/viewer/screen_saver_page.dart +++ b/lib/widgets/viewer/screen_saver_page.dart @@ -4,6 +4,7 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/empty.dart'; import 'package:aves/widgets/viewer/controller.dart'; @@ -93,7 +94,7 @@ class _ScreenSaverPageState extends State with WidgetsBindingOb } } - return Scaffold( + return AvesScaffold( body: child, ); } diff --git a/lib/widgets/viewer/slideshow_page.dart b/lib/widgets/viewer/slideshow_page.dart index e1db9de8d..1592cd69f 100644 --- a/lib/widgets/viewer/slideshow_page.dart +++ b/lib/widgets/viewer/slideshow_page.dart @@ -7,6 +7,7 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/empty.dart'; import 'package:aves/widgets/viewer/controller.dart'; @@ -59,7 +60,7 @@ class _SlideshowPageState extends State { final entries = _slideshowCollection.sortedEntries; return ListenableProvider>.value( value: ValueNotifier(AppMode.slideshow), - child: Scaffold( + child: AvesScaffold( body: entries.isEmpty ? EmptyContent( icon: AIcons.image, diff --git a/lib/widgets/viewer/source_viewer_page.dart b/lib/widgets/viewer/source_viewer_page.dart index 18e54ef94..741dc0d1c 100644 --- a/lib/widgets/viewer/source_viewer_page.dart +++ b/lib/widgets/viewer/source_viewer_page.dart @@ -1,4 +1,5 @@ import 'package:aves/widgets/common/aves_highlight.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:flutter/material.dart'; import 'package:flutter_highlight/themes/darcula.dart'; @@ -30,7 +31,7 @@ class _SourceViewerPageState extends State { @override Widget build(BuildContext context) { - return Scaffold( + return AvesScaffold( appBar: AppBar( title: Text(context.l10n.sourceViewerPageTitle), ), diff --git a/lib/widgets/wallpaper_page.dart b/lib/widgets/wallpaper_page.dart index dc2773844..59371a258 100644 --- a/lib/widgets/wallpaper_page.dart +++ b/lib/widgets/wallpaper_page.dart @@ -5,6 +5,7 @@ import 'package:aves/services/common/services.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/aves_app.dart'; import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/viewer/controller.dart'; import 'package:aves/widgets/viewer/entry_horizontal_pager.dart'; import 'package:aves/widgets/viewer/entry_viewer_page.dart'; @@ -34,7 +35,7 @@ class WallpaperPage extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( + return AvesScaffold( body: entry != null ? ViewStateConductorProvider( child: VideoConductorProvider( diff --git a/lib/widgets/welcome_page.dart b/lib/widgets/welcome_page.dart index f1bd5e30d..917a3b66d 100644 --- a/lib/widgets/welcome_page.dart +++ b/lib/widgets/welcome_page.dart @@ -7,6 +7,7 @@ import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/about/policy_page.dart'; import 'package:aves/widgets/common/basic/link_chip.dart'; import 'package:aves/widgets/common/basic/markdown_container.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/aves_logo.dart'; import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; @@ -49,7 +50,7 @@ class _WelcomePageState extends State { @override Widget build(BuildContext context) { - return Scaffold( + return AvesScaffold( body: SafeArea( child: Center( child: FutureBuilder(