settings: keep screen on

This commit is contained in:
Thibault Deckers 2020-09-20 11:19:27 +09:00
parent 56df75a7a6
commit ca00678915
5 changed files with 60 additions and 3 deletions

View file

@ -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);
}
}

View file

@ -1,5 +1,6 @@
import 'package:aves/model/settings/coordinate_format.dart'; import 'package:aves/model/settings/coordinate_format.dart';
import 'package:aves/model/settings/home_page.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:aves/widgets/fullscreen/info/location_section.dart';
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart';
@ -23,6 +24,7 @@ class Settings extends ChangeNotifier {
static const hasAcceptedTermsKey = 'has_accepted_terms'; static const hasAcceptedTermsKey = 'has_accepted_terms';
static const isCrashlyticsEnabledKey = 'is_crashlytics_enabled'; static const isCrashlyticsEnabledKey = 'is_crashlytics_enabled';
static const mustBackTwiceToExitKey = 'must_back_twice_to_exit'; static const mustBackTwiceToExitKey = 'must_back_twice_to_exit';
static const keepScreenOnKey = 'keep_screen_on';
static const homePageKey = 'home_page'; static const homePageKey = 'home_page';
static const catalogTimeZoneKey = 'catalog_time_zone'; static const catalogTimeZoneKey = 'catalog_time_zone';
@ -75,6 +77,13 @@ class Settings extends ChangeNotifier {
set mustBackTwiceToExit(bool newValue) => setAndNotify(mustBackTwiceToExitKey, newValue); 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); HomePageSetting get homePage => getEnumOrDefault(homePageKey, HomePageSetting.collection, HomePageSetting.values);
set homePage(HomePageSetting newValue) => setAndNotify(homePageKey, newValue.toString()); set homePage(HomePageSetting newValue) => setAndNotify(homePageKey, newValue.toString());

View file

@ -3,6 +3,7 @@ import 'dart:math';
import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/image_entry.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/settings/settings.dart';
import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_lens.dart';
import 'package:aves/utils/change_notifier.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:flutter_ijkplayer/flutter_ijkplayer.dart';
import 'package:photo_view/photo_view.dart'; import 'package:photo_view/photo_view.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:screen/screen.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
class FullscreenBody extends StatefulWidget { class FullscreenBody extends StatefulWidget {
@ -97,10 +99,13 @@ class FullscreenBodyState extends State<FullscreenBody> with SingleTickerProvide
collection: collection, collection: collection,
showInfo: () => _goToVerticalPage(infoPage), showInfo: () => _goToVerticalPage(infoPage),
); );
WidgetsBinding.instance.addObserver(this);
_initVideoController(); _initVideoController();
_registerWidget(widget); _registerWidget(widget);
WidgetsBinding.instance.addObserver(this);
WidgetsBinding.instance.addPostFrameCallback((_) => _initOverlay()); WidgetsBinding.instance.addPostFrameCallback((_) => _initOverlay());
if (settings.keepScreenOn == KeepScreenOn.fullscreenOnly) {
Screen.keepOn(true);
}
} }
@override @override
@ -327,6 +332,9 @@ class FullscreenBodyState extends State<FullscreenBody> with SingleTickerProvide
void _onLeave() { void _onLeave() {
if (Navigator.canPop(context)) { if (Navigator.canPop(context)) {
_showSystemUI(); _showSystemUI();
if (settings.keepScreenOn == KeepScreenOn.fullscreenOnly) {
Screen.keepOn(false);
}
} else { } else {
// exit app when trying to pop a fullscreen page that is a viewer for a single entry // exit app when trying to pop a fullscreen page that is a viewer for a single entry
SystemNavigator.pop(); SystemNavigator.pop();

View file

@ -2,6 +2,7 @@ import 'package:aves/main.dart';
import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/image_entry.dart'; import 'package:aves/model/image_entry.dart';
import 'package:aves/model/settings/home_page.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/settings/settings.dart';
import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_lens.dart';
import 'package:aves/services/image_file_service.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:flutter/services.dart';
import 'package:pedantic/pedantic.dart'; import 'package:pedantic/pedantic.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:screen/screen.dart';
class HomePage extends StatefulWidget { class HomePage extends StatefulWidget {
static const routeName = '/'; static const routeName = '/';
@ -43,7 +43,7 @@ class _HomePageState extends State<HomePage> {
super.initState(); super.initState();
_setup(); _setup();
imageCache.maximumSizeBytes = 512 * (1 << 20); imageCache.maximumSizeBytes = 512 * (1 << 20);
Screen.keepOn(true); settings.keepScreenOn.apply();
} }
@override @override

View file

@ -1,5 +1,6 @@
import 'package:aves/model/settings/coordinate_format.dart'; import 'package:aves/model/settings/coordinate_format.dart';
import 'package:aves/model/settings/home_page.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/settings/settings.dart';
import 'package:aves/widgets/common/aves_selection_dialog.dart'; import 'package:aves/widgets/common/aves_selection_dialog.dart';
import 'package:aves/widgets/common/data_providers/media_query_data_provider.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'), title: Text('Tap “back” twice to exit'),
), ),
SectionTitle('Display'), SectionTitle('Display'),
ListTile(
title: Text('Keep screen on'),
subtitle: Text(settings.keepScreenOn.name),
onTap: () async {
final value = await showDialog<KeepScreenOn>(
context: context,
builder: (context) => AvesSelectionDialog<KeepScreenOn>(
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( ListTile(
title: Text('SVG background'), title: Text('SVG background'),
trailing: SvgBackgroundSelector(), trailing: SvgBackgroundSelector(),