aves/lib/widgets/common/behaviour/pop/tv_navigation.dart
2023-05-01 11:45:33 +02:00

58 lines
2 KiB
Dart

import 'package:aves/model/settings/enums/home_page.dart';
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/widgets/collection/collection_page.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/filter_grids/albums_page.dart';
import 'package:aves/widgets/filter_grids/tags_page.dart';
import 'package:aves_model/aves_model.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
// address `TV-DB` requirement from https://developer.android.com/docs/quality-guidelines/tv-app-quality
class TvNavigationPopHandler {
static bool pop(BuildContext context) {
if (!settings.useTvLayout || _isHome(context)) {
return true;
}
Navigator.maybeOf(context)?.pushAndRemoveUntil(
_getHomeRoute(),
(route) => false,
);
return false;
}
static bool _isHome(BuildContext context) {
final homePage = settings.homePage;
final currentRoute = context.currentRouteName;
if (currentRoute != homePage.routeName) return false;
switch (homePage) {
case HomePageSetting.collection:
return context.read<CollectionLens>().filters.isEmpty;
case HomePageSetting.albums:
case HomePageSetting.tags:
return true;
}
}
static Route _getHomeRoute() {
final homePage = settings.homePage;
Route buildRoute(WidgetBuilder builder) => MaterialPageRoute(
settings: RouteSettings(name: homePage.routeName),
builder: builder,
);
switch (homePage) {
case HomePageSetting.collection:
return buildRoute((context) => CollectionPage(source: context.read<CollectionSource>(), filters: null));
case HomePageSetting.albums:
return buildRoute((context) => const AlbumListPage());
case HomePageSetting.tags:
return buildRoute((context) => const TagListPage());
}
}
}