From e4b0997f94afb78b5b96f86a183005eaf4fb1a27 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 28 Apr 2023 00:08:17 +0200 Subject: [PATCH] #612 option to set maximum brightness on all pages --- CHANGELOG.md | 1 + lib/model/settings/defaults.dart | 2 +- lib/model/settings/settings.dart | 14 +++++++------- lib/view/src/settings/enums.dart | 13 +++++++++++++ lib/widgets/aves_app.dart | 16 ++++++++++++++++ lib/widgets/settings/display/display.dart | 15 +++++++++++++++ lib/widgets/settings/viewer/viewer.dart | 13 ------------- lib/widgets/viewer/entry_vertical_pager.dart | 4 ++-- lib/widgets/viewer/entry_viewer_stack.dart | 12 ++++++++++-- lib/widgets/wallpaper_page.dart | 2 +- plugins/aves_model/lib/src/settings/enums.dart | 2 ++ 11 files changed, 68 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8284cfff6..e99dd80d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/lib/model/settings/defaults.dart b/lib/model/settings/defaults.dart index eeb911869..b981a7002 100644 --- a/lib/model/settings/defaults.dart +++ b/lib/model/settings/defaults.dart @@ -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 diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index 78a3a7441..d1dc04d97 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -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: diff --git a/lib/view/src/settings/enums.dart b/lib/view/src/settings/enums.dart index 15b1f5031..5dde92656 100644 --- a/lib/view/src/settings/enums.dart +++ b/lib/view/src/settings/enums.dart @@ -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) { diff --git a/lib/widgets/aves_app.dart b/lib/widgets/aves_app.dart index a9fe93396..377e8b415 100644 --- a/lib/widgets/aves_app.dart +++ b/lib/widgets/aves_app.dart @@ -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 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 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 with WidgetsBindingObserver { settingStream.where((event) => event.key == Settings.platformAccelerometerRotationKey).listen((_) => applyIsRotationLocked()); applyDisplayRefreshRateMode(); + applyMaxBrightness(); applyKeepScreenOn(); applyIsRotationLocked(); } diff --git a/lib/widgets/settings/display/display.dart b/lib/widgets/settings/display/display.dart index 87b0fc0f3..402105542 100644 --- a/lib/widgets/settings/display/display.dart +++ b/lib/widgets/settings/display/display.dart @@ -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( + 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; diff --git a/lib/widgets/settings/viewer/viewer.dart b/lib/widgets/settings/viewer/viewer.dart index a9fdb2a4b..c2e752574 100644 --- a/lib/widgets/settings/viewer/viewer.dart +++ b/lib/widgets/settings/viewer/viewer.dart @@ -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; diff --git a/lib/widgets/viewer/entry_vertical_pager.dart b/lib/widgets/viewer/entry_vertical_pager.dart index 978ab17c3..d6cb80f3f 100644 --- a/lib/widgets/viewer/entry_vertical_pager.dart +++ b/lib/widgets/viewer/entry_vertical_pager.dart @@ -77,7 +77,7 @@ class _ViewerVerticalPageViewState extends State { super.initState(); _registerWidget(widget); - if (settings.viewerMaxBrightness) { + if (settings.maxBrightness == MaxBrightness.viewerOnly) { _systemBrightness = ScreenBrightness().system; } } @@ -315,7 +315,7 @@ class _ViewerVerticalPageViewState extends State { 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); diff --git a/lib/widgets/viewer/entry_viewer_stack.dart b/lib/widgets/viewer/entry_viewer_stack.dart index 16b93149f..f4dd04983 100644 --- a/lib/widgets/viewer/entry_viewer_stack.dart +++ b/lib/widgets/viewer/entry_viewer_stack.dart @@ -104,7 +104,7 @@ class _EntryViewerStackState extends State 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 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); } diff --git a/lib/widgets/wallpaper_page.dart b/lib/widgets/wallpaper_page.dart index 2c85c7d34..0642b57e1 100644 --- a/lib/widgets/wallpaper_page.dart +++ b/lib/widgets/wallpaper_page.dart @@ -87,7 +87,7 @@ class _EntryEditorState extends State with EntryViewControllerMixin @override void initState() { super.initState(); - if (settings.viewerMaxBrightness) { + if (settings.maxBrightness == MaxBrightness.viewerOnly) { ScreenBrightness().setScreenBrightness(1); } if (settings.keepScreenOn == KeepScreenOn.viewerOnly) { diff --git a/plugins/aves_model/lib/src/settings/enums.dart b/plugins/aves_model/lib/src/settings/enums.dart index c99481fff..71ece7572 100644 --- a/plugins/aves_model/lib/src/settings/enums.dart +++ b/plugins/aves_model/lib/src/settings/enums.dart @@ -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 }