Skip to content

Commit b9087f3

Browse files
committed
Merge remote-tracking branch 'origin/develop' into develop
2 parents ca67a41 + 021aba7 commit b9087f3

25 files changed

+370
-295
lines changed

lib/l10n/app_en.arb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -880,6 +880,10 @@
880880
"settingsNavigationDrawerTabPages": "Pages",
881881
"settingsNavigationDrawerAddAlbum": "Add album",
882882

883+
"settingsNavigationBottomActionsTile": "Bottom navigation",
884+
"settingsNavigationBottomActionEditorPageTitle": "Bottom Navigation",
885+
"settingsNavigationBottomActionEditorBanner": "Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.",
886+
883887
"settingsThumbnailSectionTitle": "Thumbnails",
884888
"settingsThumbnailOverlayTile": "Overlay",
885889
"settingsThumbnailOverlayPageTitle": "Overlay",

lib/model/settings/defaults.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1+
import 'package:aves/model/filters/favourite.dart';
2+
import 'package:aves/model/filters/mime.dart';
13
import 'package:aves/model/filters/recent.dart';
24
import 'package:aves/model/naming_pattern.dart';
35
import 'package:aves/ref/mime_types.dart';
6+
import 'package:aves/widgets/collection/collection_page.dart';
47
import 'package:aves/widgets/explorer/explorer_page.dart';
58
import 'package:aves/widgets/filter_grids/albums_page.dart';
69
import 'package:aves/widgets/filter_grids/countries_page.dart';
710
import 'package:aves/widgets/filter_grids/tags_page.dart';
11+
import 'package:aves/widgets/navigation/nav_item.dart';
812
import 'package:aves_model/aves_model.dart';
913

1014
class SettingsDefaults {
@@ -29,7 +33,6 @@ class SettingsDefaults {
2933
static const mustBackTwiceToExit = true;
3034
static const keepScreenOn = KeepScreenOn.viewerOnly;
3135
static const homePage = HomePageSetting.collection;
32-
static const enableBottomNavigationBar = true;
3336
static const confirm = true;
3437
static const setMetadataDateBeforeFileOp = false;
3538
static final drawerTypeBookmarks = [
@@ -42,6 +45,12 @@ class SettingsDefaults {
4245
TagListPage.routeName,
4346
ExplorerPage.routeName,
4447
];
48+
static final bottomNavigationActions = [
49+
const AvesNavItem(route: CollectionPage.routeName),
50+
AvesNavItem(route: CollectionPage.routeName, filters: {MimeFilter.video}),
51+
AvesNavItem(route: CollectionPage.routeName, filters: {FavouriteFilter.instance}),
52+
const AvesNavItem(route: AlbumListPage.routeName),
53+
];
4554

4655
// collection
4756
static const collectionSectionFactor = EntrySectionFactor.month;

lib/model/settings/enums/home_page.dart

Lines changed: 0 additions & 20 deletions
This file was deleted.

lib/model/settings/modules/filter_grids.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ mixin FilterGridsSettings on SettingsAccess {
5959

6060
void setShowTitleQuery(String routeName, bool newValue) => set(SettingKeys.showTitleQueryPrefixKey + routeName, newValue);
6161

62+
void resetShowTitleQuery() {
63+
final configuredKeys = store.getKeys().where((v) => v.startsWith(SettingKeys.showTitleQueryPrefixKey)).toSet();
64+
configuredKeys.forEach((key) => set(key, false));
65+
}
66+
6267
Map<Uri, Set<Uri>> get albumGroups => FilterGrouping.fromJson(getString(SettingKeys.albumGroupsKey)) ?? {};
6368

6469
set albumGroups(Map<Uri, Set<Uri>> groups) => set(SettingKeys.albumGroupsKey, FilterGrouping.toJson(groups));

lib/model/settings/modules/navigation.dart

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ import 'package:aves/model/filters/filters.dart';
44
import 'package:aves/model/grouping/common.dart';
55
import 'package:aves/model/settings/defaults.dart';
66
import 'package:aves/utils/collection_utils.dart';
7+
import 'package:aves/widgets/collection/collection_page.dart';
8+
import 'package:aves/widgets/explorer/explorer_page.dart';
9+
import 'package:aves/widgets/filter_grids/albums_page.dart';
10+
import 'package:aves/widgets/filter_grids/tags_page.dart';
11+
import 'package:aves/widgets/navigation/nav_item.dart';
712
import 'package:aves_model/aves_model.dart';
813
import 'package:synchronized/synchronized.dart';
914

@@ -22,6 +27,19 @@ mixin NavigationSettings on SettingsAccess {
2227

2328
String? get homeCustomExplorerPath => getString(SettingKeys.homeCustomExplorerPathKey);
2429

30+
AvesNavItem get homeNavItem {
31+
switch (homePage) {
32+
case HomePageSetting.collection:
33+
return AvesNavItem(route: CollectionPage.routeName, filters: homeCustomCollection);
34+
case HomePageSetting.albums:
35+
return const AvesNavItem(route: AlbumListPage.routeName);
36+
case HomePageSetting.tags:
37+
return const AvesNavItem(route: TagListPage.routeName);
38+
case HomePageSetting.explorer:
39+
return AvesNavItem(route: ExplorerPage.routeName, path: homeCustomExplorerPath);
40+
}
41+
}
42+
2543
void setHome(
2644
HomePageSetting homePage, {
2745
Set<CollectionFilter> customCollection = const {},
@@ -32,10 +50,6 @@ mixin NavigationSettings on SettingsAccess {
3250
set(SettingKeys.homeCustomExplorerPathKey, customExplorerPath);
3351
}
3452

35-
bool get enableBottomNavigationBar => getBool(SettingKeys.enableBottomNavigationBarKey) ?? SettingsDefaults.enableBottomNavigationBar;
36-
37-
set enableBottomNavigationBar(bool newValue) => set(SettingKeys.enableBottomNavigationBarKey, newValue);
38-
3953
bool get confirmCreateVault => getBool(SettingKeys.confirmCreateVaultKey) ?? SettingsDefaults.confirm;
4054

4155
set confirmCreateVault(bool newValue) => set(SettingKeys.confirmCreateVaultKey, newValue);
@@ -77,6 +91,12 @@ mixin NavigationSettings on SettingsAccess {
7791

7892
set drawerPageBookmarks(List<String> newValue) => set(SettingKeys.drawerPageBookmarksKey, newValue);
7993

94+
List<AvesNavItem> get bottomNavigationActions => getStringList(SettingKeys.bottomNavigationActionsKey)?.map(AvesNavItem.fromJson).nonNulls.toList() ?? SettingsDefaults.bottomNavigationActions;
95+
96+
set bottomNavigationActions(List<AvesNavItem>? newValue) => set(SettingKeys.bottomNavigationActionsKey, newValue?.map((v) => v.toJson()).toList());
97+
98+
bool get enableBottomNavigationBar => bottomNavigationActions.length >= 2;
99+
80100
// listening
81101

82102
final _lockForBookmarks = Lock();

lib/model/settings/settings.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,6 @@ class Settings with ChangeNotifier, SettingsAccess, SearchSettings, AppSettings,
140140
mustBackTwiceToExit = false;
141141
// address `TV-BU` / `TV-BY` requirements from https://developer.android.com/docs/quality-guidelines/tv-app-quality
142142
keepScreenOn = KeepScreenOn.videoPlayback;
143-
enableBottomNavigationBar = false;
144143
drawerTypeBookmarks = [
145144
null,
146145
MimeFilter.video,
@@ -153,6 +152,7 @@ class Settings with ChangeNotifier, SettingsAccess, SearchSettings, AppSettings,
153152
TagListPage.routeName,
154153
SearchPage.routeName,
155154
];
155+
bottomNavigationActions = [];
156156
showOverlayOnOpening = false;
157157
showOverlayMinimap = false;
158158
showOverlayThumbnailPreview = false;
@@ -164,6 +164,7 @@ class Settings with ChangeNotifier, SettingsAccess, SearchSettings, AppSettings,
164164
videoGestureSideDoubleTapSeek = false;
165165
enableBin = false;
166166
showPinchGestureAlternatives = true;
167+
resetShowTitleQuery();
167168
}
168169

169170
Future<void> sanitize() async {
@@ -346,7 +347,6 @@ class Settings with ChangeNotifier, SettingsAccess, SearchSettings, AppSettings,
346347
case SettingKeys.forceWesternArabicNumeralsKey:
347348
case SettingKeys.enableDynamicColorKey:
348349
case SettingKeys.enableBlurEffectKey:
349-
case SettingKeys.enableBottomNavigationBarKey:
350350
case SettingKeys.mustBackTwiceToExitKey:
351351
case SettingKeys.confirmCreateVaultKey:
352352
case SettingKeys.confirmDeleteForeverKey:
@@ -446,6 +446,7 @@ class Settings with ChangeNotifier, SettingsAccess, SearchSettings, AppSettings,
446446
case SettingKeys.drawerTypeBookmarksKey:
447447
case SettingKeys.drawerAlbumBookmarksKey:
448448
case SettingKeys.drawerPageBookmarksKey:
449+
case SettingKeys.bottomNavigationActionsKey:
449450
case SettingKeys.collectionBurstPatternsKey:
450451
case SettingKeys.pinnedFiltersKey:
451452
case SettingKeys.hiddenFiltersKey:
Lines changed: 9 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
1-
import 'package:aves/model/settings/enums/home_page.dart';
21
import 'package:aves/model/settings/settings.dart';
32
import 'package:aves/model/source/collection_lens.dart';
4-
import 'package:aves/model/source/collection_source.dart';
53
import 'package:aves/widgets/collection/collection_page.dart';
64
import 'package:aves/widgets/common/behaviour/pop/scope.dart';
75
import 'package:aves/widgets/common/extensions/build_context.dart';
8-
import 'package:aves/widgets/explorer/explorer_page.dart';
9-
import 'package:aves/widgets/filter_grids/albums_page.dart';
10-
import 'package:aves/widgets/filter_grids/tags_page.dart';
11-
import 'package:aves_model/aves_model.dart';
126
import 'package:flutter/material.dart';
137
import 'package:provider/provider.dart';
148

@@ -28,35 +22,22 @@ class TvNavigationPopHandler implements PopHandler {
2822
@override
2923
void onPopBlocked(BuildContext context) {
3024
Navigator.maybeOf(context)?.pushAndRemoveUntil(
31-
_getHomeRoute(),
25+
settings.homeNavItem.routeBuilder(context, topLevel: true),
3226
(route) => false,
3327
);
3428
}
3529

3630
static bool _isHome(BuildContext context) {
37-
final homePage = settings.homePage;
31+
final home = settings.homeNavItem;
3832
final currentRoute = context.currentRouteName;
3933

40-
if (currentRoute != homePage.routeName) return false;
34+
if (currentRoute != home.route) return false;
4135

42-
return switch (homePage) {
43-
HomePageSetting.collection => context.read<CollectionLens>().filters.isEmpty,
44-
HomePageSetting.albums || HomePageSetting.tags || HomePageSetting.explorer => true,
45-
};
46-
}
47-
48-
static Route _getHomeRoute() {
49-
final homePage = settings.homePage;
50-
Route buildRoute(WidgetBuilder builder) => MaterialPageRoute(
51-
settings: RouteSettings(name: homePage.routeName),
52-
builder: builder,
53-
);
54-
55-
return switch (homePage) {
56-
HomePageSetting.collection => buildRoute((context) => CollectionPage(source: context.read<CollectionSource>(), filters: null)),
57-
HomePageSetting.albums => buildRoute((context) => const AlbumListPage(initialGroup: null)),
58-
HomePageSetting.tags => buildRoute((context) => const TagListPage()),
59-
HomePageSetting.explorer => buildRoute((context) => const ExplorerPage()),
60-
};
36+
switch (home.route) {
37+
case CollectionPage.routeName:
38+
return context.read<CollectionLens>().filters.isEmpty;
39+
default:
40+
return true;
41+
}
6142
}
6243
}

lib/widgets/home/home_page.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import 'package:aves/model/entry/extensions/catalog.dart';
1010
import 'package:aves/model/filters/covered/location.dart';
1111
import 'package:aves/model/filters/covered/stored_album.dart';
1212
import 'package:aves/model/filters/filters.dart';
13-
import 'package:aves/model/settings/enums/home_page.dart';
1413
import 'package:aves/model/settings/settings.dart';
1514
import 'package:aves/model/source/collection_lens.dart';
1615
import 'package:aves/model/source/collection_source.dart';
@@ -234,7 +233,7 @@ class _HomePageState extends State<HomePage> {
234233
final source = context.read<CollectionSource>();
235234
if (source.loadedScope != CollectionSource.fullScope) {
236235
await reportService.log('Initialize source to start app with mode=$appMode, loaded scope=${source.loadedScope}');
237-
final loadTopEntriesFirst = settings.homePage == HomePageSetting.collection && settings.homeCustomCollection.isEmpty;
236+
final loadTopEntriesFirst = settings.homeNavItem.route == CollectionPage.routeName && settings.homeCustomCollection.isEmpty;
238237
source.canAnalyze = true;
239238
await source.init(scope: CollectionSource.fullScope, loadTopEntriesFirst: loadTopEntriesFirst);
240239
}
@@ -382,8 +381,8 @@ class _HomePageState extends State<HomePage> {
382381
case AppMode.previewMap:
383382
case AppMode.screenSaver:
384383
case AppMode.slideshow:
385-
routeName = _initialRouteName ?? settings.homePage.routeName;
386-
filters = _initialFilters ?? (settings.homePage == HomePageSetting.collection ? settings.homeCustomCollection : {});
384+
routeName = _initialRouteName ?? settings.homeNavItem.route;
385+
filters = _initialFilters ?? (settings.homeNavItem.route == CollectionPage.routeName ? settings.homeCustomCollection : {});
387386
}
388387
Route buildRoute(WidgetBuilder builder) => DirectMaterialPageRoute(
389388
settings: RouteSettings(name: routeName),

lib/widgets/navigation/drawer/app_drawer.dart

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ import 'package:aves/theme/icons.dart';
1616
import 'package:aves/utils/android_file_utils.dart';
1717
import 'package:aves/utils/file_utils.dart';
1818
import 'package:aves/widgets/about/about_page.dart';
19+
import 'package:aves/widgets/collection/collection_page.dart';
1920
import 'package:aves/widgets/common/basic/text/outlined.dart';
2021
import 'package:aves/widgets/common/extensions/build_context.dart';
2122
import 'package:aves/widgets/common/extensions/media_query.dart';
2223
import 'package:aves/widgets/common/identity/aves_logo.dart';
23-
import 'package:aves/widgets/common/search/page.dart';
2424
import 'package:aves/widgets/debug/app_debug_page.dart';
2525
import 'package:aves/widgets/explorer/explorer_page.dart';
2626
import 'package:aves/widgets/filter_grids/albums_page.dart';
@@ -31,6 +31,7 @@ import 'package:aves/widgets/home/home_page.dart';
3131
import 'package:aves/widgets/navigation/drawer/collection_nav_tile.dart';
3232
import 'package:aves/widgets/navigation/drawer/page_nav_tile.dart';
3333
import 'package:aves/widgets/navigation/drawer/tile.dart';
34+
import 'package:aves/widgets/navigation/nav_item.dart';
3435
import 'package:aves/widgets/settings/settings_page.dart';
3536
import 'package:aves_model/aves_model.dart';
3637
import 'package:collection/collection.dart';
@@ -293,8 +294,8 @@ class _AppDrawerState extends State<AppDrawer> with WidgetsBindingObserver {
293294
const leading = DrawerPageIcon(route: displayRoute);
294295
const title = DrawerPageTitle(route: displayRoute);
295296

296-
switch (settings.homePage) {
297-
case HomePageSetting.collection:
297+
switch (settings.homeNavItem.route) {
298+
case CollectionPage.routeName:
298299
final filters = settings.homeCustomCollection;
299300
if (filters.isNotEmpty) {
300301
return CollectionNavTile(
@@ -304,25 +305,16 @@ class _AppDrawerState extends State<AppDrawer> with WidgetsBindingObserver {
304305
isSelected: () => setEquals(currentCollection?.filters, filters),
305306
);
306307
}
307-
case HomePageSetting.explorer:
308+
case ExplorerPage.routeName:
308309
final path = settings.homeCustomExplorerPath;
309310
if (path != null) {
310311
return PageNavTile(
311312
leading: leading,
312313
title: title,
313-
routeName: ExplorerPage.routeName,
314+
navItem: AvesNavItem(route: ExplorerPage.routeName, path: path),
314315
isSelected: () => widget.currentExplorerPath == path,
315-
routeBuilder: (context, routeName, _) {
316-
return MaterialPageRoute(
317-
settings: RouteSettings(name: routeName),
318-
builder: (_) => ExplorerPage(path: path),
319-
);
320-
},
321316
);
322317
}
323-
case HomePageSetting.albums:
324-
case HomePageSetting.tags:
325-
break;
326318
}
327319
return const SizedBox();
328320
}
@@ -412,8 +404,7 @@ class _AppDrawerState extends State<AppDrawer> with WidgetsBindingObserver {
412404
// key is expected by test driver
413405
key: Key('drawer-page-$route'),
414406
trailing: trailing,
415-
topLevel: route != SearchPage.routeName,
416-
routeName: route,
407+
navItem: AvesNavItem(route: route),
417408
);
418409
}),
419410
];
@@ -436,7 +427,6 @@ class _AppDrawerState extends State<AppDrawer> with WidgetsBindingObserver {
436427
Widget get debugTile => const PageNavTile(
437428
// key is expected by test driver
438429
key: Key('drawer-debug'),
439-
topLevel: false,
440-
routeName: AppDebugPage.routeName,
430+
navItem: AvesNavItem(route: AppDebugPage.routeName),
441431
);
442432
}

0 commit comments

Comments
 (0)