#612 option to set maximum brightness on all pages

This commit is contained in:
Thibault Deckers 2023-04-28 00:08:17 +02:00
parent e7985c5ea5
commit e4b0997f94
11 changed files with 68 additions and 26 deletions

View file

@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file.
### Added
- Collection: support for Sony predictive capture as burst
- Display: option to set maximum brightness on all pages
- Hungarian translation (thanks György Viktor, byPety)
### Changed

View file

@ -24,6 +24,7 @@ class SettingsDefaults {
static const themeColorMode = AvesThemeColorMode.polychrome;
static const enableDynamicColor = false;
static const enableBlurEffect = true; // `enableBlurEffect` has a contextual default value
static const maxBrightness = MaxBrightness.never;
static const forceTvLayout = false;
// navigation
@ -81,7 +82,6 @@ class SettingsDefaults {
static const showOverlayThumbnailPreview = false;
static const viewerGestureSideTapNext = false;
static const viewerUseCutout = true;
static const viewerMaxBrightness = false;
static const enableMotionPhotoAutoPlay = false;
// video

View file

@ -71,6 +71,7 @@ class Settings extends ChangeNotifier {
static const themeColorModeKey = 'theme_color_mode';
static const enableDynamicColorKey = 'dynamic_color';
static const enableBlurEffectKey = 'enable_overlay_blur_effect';
static const maxBrightnessKey = 'max_brightness';
static const forceTvLayoutKey = 'force_tv_layout';
// navigation
@ -129,7 +130,6 @@ class Settings extends ChangeNotifier {
static const showOverlayThumbnailPreviewKey = 'show_overlay_thumbnail_preview';
static const viewerGestureSideTapNextKey = 'viewer_gesture_side_tap_next';
static const viewerUseCutoutKey = 'viewer_use_cutout';
static const viewerMaxBrightnessKey = 'viewer_max_brightness';
static const enableMotionPhotoAutoPlayKey = 'motion_photo_auto_play';
static const imageBackgroundKey = 'image_background';
@ -269,6 +269,7 @@ class Settings extends ChangeNotifier {
void applyTvSettings() {
themeBrightness = AvesThemeBrightness.dark;
maxBrightness = MaxBrightness.never;
mustBackTwiceToExit = false;
// address `TV-BU` / `TV-BY` requirements from https://developer.android.com/docs/quality-guidelines/tv-app-quality
keepScreenOn = KeepScreenOn.videoPlayback;
@ -290,7 +291,6 @@ class Settings extends ChangeNotifier {
showOverlayThumbnailPreview = false;
viewerGestureSideTapNext = false;
viewerUseCutout = true;
viewerMaxBrightness = false;
videoBackgroundMode = VideoBackgroundMode.disabled;
videoControls = VideoControls.none;
videoGestureDoubleTapTogglePlay = false;
@ -433,6 +433,10 @@ class Settings extends ChangeNotifier {
set enableBlurEffect(bool newValue) => _set(enableBlurEffectKey, newValue);
MaxBrightness get maxBrightness => getEnumOrDefault(maxBrightnessKey, SettingsDefaults.maxBrightness, MaxBrightness.values);
set maxBrightness(MaxBrightness newValue) => _set(maxBrightnessKey, newValue.toString());
bool get forceTvLayout => getBool(forceTvLayoutKey) ?? SettingsDefaults.forceTvLayout;
set forceTvLayout(bool newValue) => _set(forceTvLayoutKey, newValue);
@ -661,10 +665,6 @@ class Settings extends ChangeNotifier {
set viewerUseCutout(bool newValue) => _set(viewerUseCutoutKey, newValue);
bool get viewerMaxBrightness => getBool(viewerMaxBrightnessKey) ?? SettingsDefaults.viewerMaxBrightness;
set viewerMaxBrightness(bool newValue) => _set(viewerMaxBrightnessKey, newValue);
bool get enableMotionPhotoAutoPlay => getBool(enableMotionPhotoAutoPlayKey) ?? SettingsDefaults.enableMotionPhotoAutoPlay;
set enableMotionPhotoAutoPlay(bool newValue) => _set(enableMotionPhotoAutoPlayKey, newValue);
@ -1105,7 +1105,6 @@ class Settings extends ChangeNotifier {
case showOverlayThumbnailPreviewKey:
case viewerGestureSideTapNextKey:
case viewerUseCutoutKey:
case viewerMaxBrightnessKey:
case enableMotionPhotoAutoPlayKey:
case enableVideoHardwareAccelerationKey:
case videoGestureDoubleTapTogglePlayKey:
@ -1133,6 +1132,7 @@ class Settings extends ChangeNotifier {
case displayRefreshRateModeKey:
case themeBrightnessKey:
case themeColorModeKey:
case maxBrightnessKey:
case keepScreenOnKey:
case homePageKey:
case collectionGroupFactorKey:

View file

@ -123,6 +123,19 @@ extension ExtraKeepScreenOnView on KeepScreenOn {
}
}
extension ExtraMaxBrightnessView on MaxBrightness {
String getName(BuildContext context) {
switch (this) {
case MaxBrightness.never:
return context.l10n.keepScreenOnNever;
case MaxBrightness.viewerOnly:
return context.l10n.keepScreenOnViewerOnly;
case MaxBrightness.always:
return context.l10n.keepScreenOnAlways;
}
}
}
extension ExtraSlideshowVideoPlaybackView on SlideshowVideoPlayback {
String getName(BuildContext context) {
switch (this) {

View file

@ -49,6 +49,7 @@ import 'package:flutter/services.dart';
import 'package:material_color_utilities/material_color_utilities.dart';
import 'package:overlay_support/overlay_support.dart';
import 'package:provider/provider.dart';
import 'package:screen_brightness/screen_brightness.dart';
import 'package:tuple/tuple.dart';
import 'package:url_launcher/url_launcher.dart' as ul;
@ -506,6 +507,19 @@ class _AvesAppState extends State<AvesApp> with WidgetsBindingObserver {
}
void applyDisplayRefreshRateMode() => settings.displayRefreshRateMode.apply();
void applyMaxBrightness() {
switch (settings.maxBrightness) {
case MaxBrightness.never:
case MaxBrightness.viewerOnly:
ScreenBrightness().resetScreenBrightness();
break;
case MaxBrightness.always:
ScreenBrightness().setScreenBrightness(1);
break;
}
}
void applyKeepScreenOn() => settings.keepScreenOn.apply();
void applyIsRotationLocked() {
@ -530,6 +544,7 @@ class _AvesAppState extends State<AvesApp> with WidgetsBindingObserver {
settingStream.where((event) => event.key == Settings.isInstalledAppAccessAllowedKey).listen((_) => applyIsInstalledAppAccessAllowed());
// display
settingStream.where((event) => event.key == Settings.displayRefreshRateModeKey).listen((_) => applyDisplayRefreshRateMode());
settingStream.where((event) => event.key == Settings.maxBrightnessKey).listen((_) => applyMaxBrightness());
settingStream.where((event) => event.key == Settings.forceTvLayoutKey).listen((_) => applyForceTvLayout());
// navigation
settingStream.where((event) => event.key == Settings.keepScreenOnKey).listen((_) => applyKeepScreenOn());
@ -537,6 +552,7 @@ class _AvesAppState extends State<AvesApp> with WidgetsBindingObserver {
settingStream.where((event) => event.key == Settings.platformAccelerometerRotationKey).listen((_) => applyIsRotationLocked());
applyDisplayRefreshRateMode();
applyMaxBrightness();
applyKeepScreenOn();
applyIsRotationLocked();
}

View file

@ -34,6 +34,7 @@ class DisplaySection extends SettingsSection {
SettingsTileDisplayThemeColorMode(),
if (device.isDynamicColorAvailable) SettingsTileDisplayEnableDynamicColor(),
SettingsTileDisplayEnableBlurEffect(),
if (!settings.useTvLayout) SettingsTileDisplayMaxBrightness(),
if (!settings.useTvLayout) SettingsTileDisplayRefreshRateMode(),
if (!device.isTelevision) SettingsTileDisplayForceTvLayout(),
];
@ -90,6 +91,20 @@ class SettingsTileDisplayEnableBlurEffect extends SettingsTile {
);
}
class SettingsTileDisplayMaxBrightness extends SettingsTile {
@override
String title(BuildContext context) => context.l10n.settingsViewerMaximumBrightness;
@override
Widget build(BuildContext context) => SettingsSelectionListTile<MaxBrightness>(
values: MaxBrightness.values,
getName: (context, v) => v.getName(context),
selector: (context, s) => s.maxBrightness,
onSelection: (v) => settings.maxBrightness = v,
tileTitle: title(context),
);
}
class SettingsTileDisplayRefreshRateMode extends SettingsTile {
@override
String title(BuildContext context) => context.l10n.settingsDisplayRefreshRateModeTile;

View file

@ -38,7 +38,6 @@ class ViewerSection extends SettingsSection {
SettingsTileViewerSlideshow(),
if (!settings.useTvLayout) SettingsTileViewerGestureSideTapNext(),
if (!settings.useTvLayout && isCutoutAware) SettingsTileViewerUseCutout(),
if (!settings.useTvLayout) SettingsTileViewerMaxBrightness(),
SettingsTileViewerMotionPhotoAutoPlay(),
SettingsTileViewerImageBackground(),
];
@ -105,18 +104,6 @@ class SettingsTileViewerUseCutout extends SettingsTile {
);
}
class SettingsTileViewerMaxBrightness extends SettingsTile {
@override
String title(BuildContext context) => context.l10n.settingsViewerMaximumBrightness;
@override
Widget build(BuildContext context) => SettingsSwitchListTile(
selector: (context, s) => s.viewerMaxBrightness,
onChanged: (v) => settings.viewerMaxBrightness = v,
title: title(context),
);
}
class SettingsTileViewerMotionPhotoAutoPlay extends SettingsTile {
@override
String title(BuildContext context) => context.l10n.settingsMotionPhotoAutoPlay;

View file

@ -77,7 +77,7 @@ class _ViewerVerticalPageViewState extends State<ViewerVerticalPageView> {
super.initState();
_registerWidget(widget);
if (settings.viewerMaxBrightness) {
if (settings.maxBrightness == MaxBrightness.viewerOnly) {
_systemBrightness = ScreenBrightness().system;
}
}
@ -315,7 +315,7 @@ class _ViewerVerticalPageViewState extends State<ViewerVerticalPageView> {
final opacity = min(1.0, page);
_backgroundOpacityNotifier.value = opacity * opacity;
if (settings.viewerMaxBrightness) {
if (settings.maxBrightness == MaxBrightness.viewerOnly) {
_systemBrightness?.then((system) {
final value = lerpDouble(maximumBrightness, system, ((1 - page).abs() * 2).clamp(0, 1))!;
ScreenBrightness().setScreenBrightness(value);

View file

@ -104,7 +104,7 @@ class _EntryViewerStackState extends State<EntryViewerStack> with EntryViewContr
@override
void initState() {
super.initState();
if (settings.viewerMaxBrightness) {
if (settings.maxBrightness == MaxBrightness.viewerOnly) {
ScreenBrightness().setScreenBrightness(1);
}
if (settings.keepScreenOn == KeepScreenOn.viewerOnly) {
@ -803,7 +803,15 @@ class _EntryViewerStackState extends State<EntryViewerStack> with EntryViewContr
// to be unmounted after the other async steps
final theme = Theme.of(context);
await ScreenBrightness().resetScreenBrightness();
switch (settings.maxBrightness) {
case MaxBrightness.never:
case MaxBrightness.viewerOnly:
await ScreenBrightness().resetScreenBrightness();
break;
case MaxBrightness.always:
await ScreenBrightness().setScreenBrightness(1);
break;
}
if (settings.keepScreenOn == KeepScreenOn.viewerOnly) {
await windowService.keepScreenOn(false);
}

View file

@ -87,7 +87,7 @@ class _EntryEditorState extends State<EntryEditor> with EntryViewControllerMixin
@override
void initState() {
super.initState();
if (settings.viewerMaxBrightness) {
if (settings.maxBrightness == MaxBrightness.viewerOnly) {
ScreenBrightness().setScreenBrightness(1);
}
if (settings.keepScreenOn == KeepScreenOn.viewerOnly) {

View file

@ -18,6 +18,8 @@ enum HomePageSetting { collection, albums }
enum KeepScreenOn { never, videoPlayback, viewerOnly, always }
enum MaxBrightness { never, viewerOnly, always }
enum SlideshowVideoPlayback { skip, playMuted, playWithSound }
enum SubtitlePosition { top, bottom }