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/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());

View file

@ -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<FullscreenBody> 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<FullscreenBody> 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();

View file

@ -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<HomePage> {
super.initState();
_setup();
imageCache.maximumSizeBytes = 512 * (1 << 20);
Screen.keepOn(true);
settings.keepScreenOn.apply();
}
@override

View file

@ -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<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(
title: Text('SVG background'),
trailing: SvgBackgroundSelector(),