From ca006789154d470a0938dc66b4071df0c5460576 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sun, 20 Sep 2020 11:19:27 +0900 Subject: [PATCH] settings: keep screen on --- lib/model/settings/screen_on.dart | 22 +++++++++++++++++++++ lib/model/settings/settings.dart | 9 +++++++++ lib/widgets/fullscreen/fullscreen_body.dart | 10 +++++++++- lib/widgets/home_page.dart | 4 ++-- lib/widgets/settings/settings_page.dart | 18 +++++++++++++++++ 5 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 lib/model/settings/screen_on.dart diff --git a/lib/model/settings/screen_on.dart b/lib/model/settings/screen_on.dart new file mode 100644 index 000000000..c07924d73 --- /dev/null +++ b/lib/model/settings/screen_on.dart @@ -0,0 +1,22 @@ +import 'package:screen/screen.dart'; + +enum KeepScreenOn { never, fullscreenOnly, always } + +extension ExtraKeepScreenOn on KeepScreenOn { + String get name { + switch (this) { + case KeepScreenOn.never: + return 'Never'; + case KeepScreenOn.fullscreenOnly: + return 'Viewer page only'; + case KeepScreenOn.always: + return 'Always'; + default: + return toString(); + } + } + + void apply() { + Screen.keepOn(this == KeepScreenOn.always); + } +} diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index 93d54b742..d6766c0bc 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -1,5 +1,6 @@ import 'package:aves/model/settings/coordinate_format.dart'; import 'package:aves/model/settings/home_page.dart'; +import 'package:aves/model/settings/screen_on.dart'; import 'package:aves/widgets/fullscreen/info/location_section.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; @@ -23,6 +24,7 @@ class Settings extends ChangeNotifier { static const hasAcceptedTermsKey = 'has_accepted_terms'; static const isCrashlyticsEnabledKey = 'is_crashlytics_enabled'; static const mustBackTwiceToExitKey = 'must_back_twice_to_exit'; + static const keepScreenOnKey = 'keep_screen_on'; static const homePageKey = 'home_page'; static const catalogTimeZoneKey = 'catalog_time_zone'; @@ -75,6 +77,13 @@ class Settings extends ChangeNotifier { set mustBackTwiceToExit(bool newValue) => setAndNotify(mustBackTwiceToExitKey, newValue); + KeepScreenOn get keepScreenOn => getEnumOrDefault(keepScreenOnKey, KeepScreenOn.fullscreenOnly, KeepScreenOn.values); + + set keepScreenOn(KeepScreenOn newValue) { + setAndNotify(keepScreenOnKey, newValue.toString()); + newValue.apply(); + } + HomePageSetting get homePage => getEnumOrDefault(homePageKey, HomePageSetting.collection, HomePageSetting.values); set homePage(HomePageSetting newValue) => setAndNotify(homePageKey, newValue.toString()); diff --git a/lib/widgets/fullscreen/fullscreen_body.dart b/lib/widgets/fullscreen/fullscreen_body.dart index 8e3515585..554e48e31 100644 --- a/lib/widgets/fullscreen/fullscreen_body.dart +++ b/lib/widgets/fullscreen/fullscreen_body.dart @@ -3,6 +3,7 @@ import 'dart:math'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/settings/screen_on.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/utils/change_notifier.dart'; @@ -23,6 +24,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_ijkplayer/flutter_ijkplayer.dart'; import 'package:photo_view/photo_view.dart'; import 'package:provider/provider.dart'; +import 'package:screen/screen.dart'; import 'package:tuple/tuple.dart'; class FullscreenBody extends StatefulWidget { @@ -97,10 +99,13 @@ class FullscreenBodyState extends State with SingleTickerProvide collection: collection, showInfo: () => _goToVerticalPage(infoPage), ); - WidgetsBinding.instance.addObserver(this); _initVideoController(); _registerWidget(widget); + WidgetsBinding.instance.addObserver(this); WidgetsBinding.instance.addPostFrameCallback((_) => _initOverlay()); + if (settings.keepScreenOn == KeepScreenOn.fullscreenOnly) { + Screen.keepOn(true); + } } @override @@ -327,6 +332,9 @@ class FullscreenBodyState extends State with SingleTickerProvide void _onLeave() { if (Navigator.canPop(context)) { _showSystemUI(); + if (settings.keepScreenOn == KeepScreenOn.fullscreenOnly) { + Screen.keepOn(false); + } } else { // exit app when trying to pop a fullscreen page that is a viewer for a single entry SystemNavigator.pop(); diff --git a/lib/widgets/home_page.dart b/lib/widgets/home_page.dart index 5dd7eaf71..cb5fe69be 100644 --- a/lib/widgets/home_page.dart +++ b/lib/widgets/home_page.dart @@ -2,6 +2,7 @@ import 'package:aves/main.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/image_entry.dart'; import 'package:aves/model/settings/home_page.dart'; +import 'package:aves/model/settings/screen_on.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/services/image_file_service.dart'; @@ -19,7 +20,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:pedantic/pedantic.dart'; import 'package:permission_handler/permission_handler.dart'; -import 'package:screen/screen.dart'; class HomePage extends StatefulWidget { static const routeName = '/'; @@ -43,7 +43,7 @@ class _HomePageState extends State { super.initState(); _setup(); imageCache.maximumSizeBytes = 512 * (1 << 20); - Screen.keepOn(true); + settings.keepScreenOn.apply(); } @override diff --git a/lib/widgets/settings/settings_page.dart b/lib/widgets/settings/settings_page.dart index c57913b10..15f7bdbc0 100644 --- a/lib/widgets/settings/settings_page.dart +++ b/lib/widgets/settings/settings_page.dart @@ -1,5 +1,6 @@ import 'package:aves/model/settings/coordinate_format.dart'; import 'package:aves/model/settings/home_page.dart'; +import 'package:aves/model/settings/screen_on.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/widgets/common/aves_selection_dialog.dart'; import 'package:aves/widgets/common/data_providers/media_query_data_provider.dart'; @@ -49,6 +50,23 @@ class SettingsPage extends StatelessWidget { title: Text('Tap “back” twice to exit'), ), SectionTitle('Display'), + ListTile( + title: Text('Keep screen on'), + subtitle: Text(settings.keepScreenOn.name), + onTap: () async { + final value = await showDialog( + context: context, + builder: (context) => AvesSelectionDialog( + initialValue: settings.keepScreenOn, + options: Map.fromEntries(KeepScreenOn.values.map((v) => MapEntry(v, v.name))), + title: 'Keep Screen On', + ), + ); + if (value != null) { + settings.keepScreenOn = value; + } + }, + ), ListTile( title: Text('SVG background'), trailing: SvgBackgroundSelector(),