settings: display refresh rate hint

This commit is contained in:
Thibault Deckers 2022-03-25 10:08:22 +09:00
parent b183f9ddbb
commit 531f70b503
13 changed files with 117 additions and 12 deletions

View file

@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file.
- Info: option to set date from other item - Info: option to set date from other item
- Info: improved DNG tags display - Info: improved DNG tags display
- warn and optionally set metadata date before moving undated items - warn and optionally set metadata date before moving undated items
- Settings: display refresh rate hint
### Changed ### Changed

View file

@ -177,6 +177,9 @@
"accessibilityAnimationsRemove": "Prevent screen effects", "accessibilityAnimationsRemove": "Prevent screen effects",
"accessibilityAnimationsKeep": "Keep screen effects", "accessibilityAnimationsKeep": "Keep screen effects",
"displayRefreshRatePreferHighest": "Prefer highest rate",
"displayRefreshRatePreferLowest": "Prefer lowest rate",
"themeBrightnessLight": "Light", "themeBrightnessLight": "Light",
"themeBrightnessDark": "Dark", "themeBrightnessDark": "Dark",
"themeBrightnessBlack": "Black", "themeBrightnessBlack": "Black",
@ -703,6 +706,8 @@
"settingsSectionDisplay": "Display", "settingsSectionDisplay": "Display",
"settingsThemeBrightness": "Theme", "settingsThemeBrightness": "Theme",
"settingsThemeColorful": "Colorful", "settingsThemeColorful": "Colorful",
"settingsDisplayRefreshRateModeTile": "Display refresh rate",
"settingsDisplayRefreshRateModeTitle": "Display Refresh Rate",
"settingsSectionLanguage": "Language & Formats", "settingsSectionLanguage": "Language & Formats",
"settingsLanguage": "Language", "settingsLanguage": "Language",

View file

@ -16,6 +16,7 @@ class SettingsDefaults {
static const canUseAnalysisService = true; static const canUseAnalysisService = true;
static const isInstalledAppAccessAllowed = false; static const isInstalledAppAccessAllowed = false;
static const isErrorReportingAllowed = false; static const isErrorReportingAllowed = false;
static const displayRefreshRateMode = DisplayRefreshRateMode.auto;
static const themeBrightness = AvesThemeBrightness.system; static const themeBrightness = AvesThemeBrightness.system;
static const themeColorMode = AvesThemeColorMode.polychrome; static const themeColorMode = AvesThemeColorMode.polychrome;
static const tileLayout = TileLayout.grid; static const tileLayout = TileLayout.grid;

View file

@ -0,0 +1,33 @@
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:flutter/material.dart';
import 'package:flutter_displaymode/flutter_displaymode.dart';
import 'enums.dart';
extension ExtraDisplayRefreshRateMode on DisplayRefreshRateMode {
String getName(BuildContext context) {
switch (this) {
case DisplayRefreshRateMode.auto:
return context.l10n.settingsSystemDefault;
case DisplayRefreshRateMode.highest:
return context.l10n.displayRefreshRatePreferHighest;
case DisplayRefreshRateMode.lowest:
return context.l10n.displayRefreshRatePreferLowest;
}
}
void apply() {
debugPrint('Apply display refresh rate: $name');
switch (this) {
case DisplayRefreshRateMode.auto:
FlutterDisplayMode.setPreferredMode(DisplayMode.auto);
break;
case DisplayRefreshRateMode.highest:
FlutterDisplayMode.setHighRefreshRate();
break;
case DisplayRefreshRateMode.lowest:
FlutterDisplayMode.setLowRefreshRate();
break;
}
}
}

View file

@ -19,6 +19,8 @@ enum HomePageSetting { collection, albums }
enum KeepScreenOn { never, viewerOnly, always } enum KeepScreenOn { never, viewerOnly, always }
enum DisplayRefreshRateMode { auto, highest, lowest }
enum UnitSystem { metric, imperial } enum UnitSystem { metric, imperial }
enum VideoLoopMode { never, shortOnly, always } enum VideoLoopMode { never, shortOnly, always }

View file

@ -1,7 +1,7 @@
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'enums.dart'; import 'enums.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
extension ExtraAvesThemeBrightness on AvesThemeBrightness { extension ExtraAvesThemeBrightness on AvesThemeBrightness {
String getName(BuildContext context) { String getName(BuildContext context) {
@ -16,6 +16,7 @@ extension ExtraAvesThemeBrightness on AvesThemeBrightness {
return context.l10n.themeBrightnessBlack; return context.l10n.themeBrightnessBlack;
} }
} }
ThemeMode get appThemeMode { ThemeMode get appThemeMode {
switch (this) { switch (this) {
case AvesThemeBrightness.system: case AvesThemeBrightness.system:

View file

@ -41,6 +41,7 @@ class Settings extends ChangeNotifier {
static const isInstalledAppAccessAllowedKey = 'is_installed_app_access_allowed'; static const isInstalledAppAccessAllowedKey = 'is_installed_app_access_allowed';
static const isErrorReportingAllowedKey = 'is_crashlytics_enabled'; static const isErrorReportingAllowedKey = 'is_crashlytics_enabled';
static const localeKey = 'locale'; static const localeKey = 'locale';
static const displayRefreshRateModeKey = 'display_refresh_rate_mode';
static const themeBrightnessKey = 'theme_brightness'; static const themeBrightnessKey = 'theme_brightness';
static const themeColorModeKey = 'theme_color_mode'; static const themeColorModeKey = 'theme_color_mode';
static const catalogTimeZoneKey = 'catalog_time_zone'; static const catalogTimeZoneKey = 'catalog_time_zone';
@ -245,6 +246,10 @@ class Settings extends ChangeNotifier {
return _appliedLocale!; return _appliedLocale!;
} }
DisplayRefreshRateMode get displayRefreshRateMode => getEnumOrDefault(displayRefreshRateModeKey, SettingsDefaults.displayRefreshRateMode, DisplayRefreshRateMode.values);
set displayRefreshRateMode(DisplayRefreshRateMode newValue) => setAndNotify(displayRefreshRateModeKey, newValue.toString());
AvesThemeBrightness get themeBrightness => getEnumOrDefault(themeBrightnessKey, SettingsDefaults.themeBrightness, AvesThemeBrightness.values); AvesThemeBrightness get themeBrightness => getEnumOrDefault(themeBrightnessKey, SettingsDefaults.themeBrightness, AvesThemeBrightness.values);
set themeBrightness(AvesThemeBrightness newValue) => setAndNotify(themeBrightnessKey, newValue.toString()); set themeBrightness(AvesThemeBrightness newValue) => setAndNotify(themeBrightnessKey, newValue.toString());
@ -709,6 +714,7 @@ class Settings extends ChangeNotifier {
} }
break; break;
case localeKey: case localeKey:
case displayRefreshRateModeKey:
case themeBrightnessKey: case themeBrightnessKey:
case themeColorModeKey: case themeColorModeKey:
case keepScreenOnKey: case keepScreenOnKey:

View file

@ -111,6 +111,11 @@ class Constants {
license: 'MIT', license: 'MIT',
sourceUrl: 'https://github.com/deckerst/fijkplayer', sourceUrl: 'https://github.com/deckerst/fijkplayer',
), ),
Dependency(
name: 'Flutter Display Mode',
license: 'MIT',
sourceUrl: 'https://github.com/ajinasokan/flutter_displaymode',
),
Dependency( Dependency(
name: 'Google API Availability', name: 'Google API Availability',
license: 'MIT', license: 'MIT',

View file

@ -6,6 +6,7 @@ import 'package:aves/app_mode.dart';
import 'package:aves/l10n/l10n.dart'; import 'package:aves/l10n/l10n.dart';
import 'package:aves/model/device.dart'; import 'package:aves/model/device.dart';
import 'package:aves/model/settings/enums/accessibility_animations.dart'; import 'package:aves/model/settings/enums/accessibility_animations.dart';
import 'package:aves/model/settings/enums/display_refresh_rate_mode.dart';
import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/enums/enums.dart';
import 'package:aves/model/settings/enums/screen_on.dart'; import 'package:aves/model/settings/enums/screen_on.dart';
import 'package:aves/model/settings/enums/theme_brightness.dart'; import 'package:aves/model/settings/enums/theme_brightness.dart';
@ -242,9 +243,8 @@ class _AvesAppState extends State<AvesApp> with WidgetsBindingObserver {
} }
} }
void applyKeepScreenOn() { void applyDisplayRefreshRateMode() => settings.displayRefreshRateMode.apply();
settings.keepScreenOn.apply(); void applyKeepScreenOn() => settings.keepScreenOn.apply();
}
void applyIsRotationLocked() { void applyIsRotationLocked() {
if (!settings.isRotationLocked) { if (!settings.isRotationLocked) {
@ -253,9 +253,11 @@ class _AvesAppState extends State<AvesApp> with WidgetsBindingObserver {
} }
settings.updateStream.where((event) => event.key == Settings.isInstalledAppAccessAllowedKey).listen((_) => applyIsInstalledAppAccessAllowed()); settings.updateStream.where((event) => event.key == Settings.isInstalledAppAccessAllowedKey).listen((_) => applyIsInstalledAppAccessAllowed());
settings.updateStream.where((event) => event.key == Settings.displayRefreshRateModeKey).listen((_) => applyDisplayRefreshRateMode());
settings.updateStream.where((event) => event.key == Settings.keepScreenOnKey).listen((_) => applyKeepScreenOn()); settings.updateStream.where((event) => event.key == Settings.keepScreenOnKey).listen((_) => applyKeepScreenOn());
settings.updateStream.where((event) => event.key == Settings.platformAccelerometerRotationKey).listen((_) => applyIsRotationLocked()); settings.updateStream.where((event) => event.key == Settings.platformAccelerometerRotationKey).listen((_) => applyIsRotationLocked());
applyDisplayRefreshRateMode();
applyKeepScreenOn(); applyKeepScreenOn();
applyIsRotationLocked(); applyIsRotationLocked();
} }

View file

@ -1,3 +1,4 @@
import 'package:aves/model/settings/enums/display_refresh_rate_mode.dart';
import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/enums/enums.dart';
import 'package:aves/model/settings/enums/theme_brightness.dart'; import 'package:aves/model/settings/enums/theme_brightness.dart';
import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/settings/settings.dart';
@ -42,6 +43,14 @@ class DisplaySection extends StatelessWidget {
onChanged: (v) => settings.themeColorMode = v ? AvesThemeColorMode.polychrome : AvesThemeColorMode.monochrome, onChanged: (v) => settings.themeColorMode = v ? AvesThemeColorMode.polychrome : AvesThemeColorMode.monochrome,
title: context.l10n.settingsThemeColorful, title: context.l10n.settingsThemeColorful,
), ),
SettingsSelectionListTile<DisplayRefreshRateMode>(
values: DisplayRefreshRateMode.values,
getName: (context, v) => v.getName(context),
selector: (context, s) => s.displayRefreshRateMode,
onSelection: (v) => settings.displayRefreshRateMode = v,
tileTitle: context.l10n.settingsDisplayRefreshRateModeTile,
dialogTitle: context.l10n.settingsDisplayRefreshRateModeTitle,
),
], ],
); );
} }

View file

@ -360,6 +360,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.1" version: "0.1.1"
flutter_displaymode:
dependency: "direct main"
description:
name: flutter_displaymode
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.2"
flutter_driver: flutter_driver:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter

View file

@ -44,6 +44,7 @@ dependencies:
ref: aves ref: aves
flex_color_picker: flex_color_picker:
fluster: fluster:
flutter_displaymode:
flutter_highlight: flutter_highlight:
flutter_map: flutter_map:
flutter_markdown: flutter_markdown:

View file

@ -1,5 +1,7 @@
{ {
"de": [ "de": [
"displayRefreshRatePreferHighest",
"displayRefreshRatePreferLowest",
"themeBrightnessLight", "themeBrightnessLight",
"themeBrightnessDark", "themeBrightnessDark",
"themeBrightnessBlack", "themeBrightnessBlack",
@ -18,10 +20,14 @@
"settingsConfirmationDialogMoveUndatedItems", "settingsConfirmationDialogMoveUndatedItems",
"settingsSectionDisplay", "settingsSectionDisplay",
"settingsThemeBrightness", "settingsThemeBrightness",
"settingsThemeColorful" "settingsThemeColorful",
"settingsDisplayRefreshRateModeTile",
"settingsDisplayRefreshRateModeTitle"
], ],
"es": [ "es": [
"displayRefreshRatePreferHighest",
"displayRefreshRatePreferLowest",
"themeBrightnessLight", "themeBrightnessLight",
"themeBrightnessDark", "themeBrightnessDark",
"themeBrightnessBlack", "themeBrightnessBlack",
@ -40,10 +46,14 @@
"settingsConfirmationDialogMoveUndatedItems", "settingsConfirmationDialogMoveUndatedItems",
"settingsSectionDisplay", "settingsSectionDisplay",
"settingsThemeBrightness", "settingsThemeBrightness",
"settingsThemeColorful" "settingsThemeColorful",
"settingsDisplayRefreshRateModeTile",
"settingsDisplayRefreshRateModeTitle"
], ],
"fr": [ "fr": [
"displayRefreshRatePreferHighest",
"displayRefreshRatePreferLowest",
"themeBrightnessLight", "themeBrightnessLight",
"themeBrightnessDark", "themeBrightnessDark",
"themeBrightnessBlack", "themeBrightnessBlack",
@ -62,7 +72,9 @@
"settingsConfirmationDialogMoveUndatedItems", "settingsConfirmationDialogMoveUndatedItems",
"settingsSectionDisplay", "settingsSectionDisplay",
"settingsThemeBrightness", "settingsThemeBrightness",
"settingsThemeColorful" "settingsThemeColorful",
"settingsDisplayRefreshRateModeTile",
"settingsDisplayRefreshRateModeTitle"
], ],
"id": [ "id": [
@ -72,6 +84,8 @@
"videoControlsPlaySeek", "videoControlsPlaySeek",
"videoControlsPlayOutside", "videoControlsPlayOutside",
"videoControlsNone", "videoControlsNone",
"displayRefreshRatePreferHighest",
"displayRefreshRatePreferLowest",
"themeBrightnessLight", "themeBrightnessLight",
"themeBrightnessDark", "themeBrightnessDark",
"themeBrightnessBlack", "themeBrightnessBlack",
@ -97,10 +111,14 @@
"settingsVideoGestureSideDoubleTapSeek", "settingsVideoGestureSideDoubleTapSeek",
"settingsSectionDisplay", "settingsSectionDisplay",
"settingsThemeBrightness", "settingsThemeBrightness",
"settingsThemeColorful" "settingsThemeColorful",
"settingsDisplayRefreshRateModeTile",
"settingsDisplayRefreshRateModeTitle"
], ],
"ja": [ "ja": [
"displayRefreshRatePreferHighest",
"displayRefreshRatePreferLowest",
"themeBrightnessLight", "themeBrightnessLight",
"themeBrightnessDark", "themeBrightnessDark",
"themeBrightnessBlack", "themeBrightnessBlack",
@ -119,10 +137,14 @@
"settingsConfirmationDialogMoveUndatedItems", "settingsConfirmationDialogMoveUndatedItems",
"settingsSectionDisplay", "settingsSectionDisplay",
"settingsThemeBrightness", "settingsThemeBrightness",
"settingsThemeColorful" "settingsThemeColorful",
"settingsDisplayRefreshRateModeTile",
"settingsDisplayRefreshRateModeTitle"
], ],
"ko": [ "ko": [
"displayRefreshRatePreferHighest",
"displayRefreshRatePreferLowest",
"themeBrightnessLight", "themeBrightnessLight",
"themeBrightnessDark", "themeBrightnessDark",
"themeBrightnessBlack", "themeBrightnessBlack",
@ -141,10 +163,14 @@
"settingsConfirmationDialogMoveUndatedItems", "settingsConfirmationDialogMoveUndatedItems",
"settingsSectionDisplay", "settingsSectionDisplay",
"settingsThemeBrightness", "settingsThemeBrightness",
"settingsThemeColorful" "settingsThemeColorful",
"settingsDisplayRefreshRateModeTile",
"settingsDisplayRefreshRateModeTitle"
], ],
"pt": [ "pt": [
"displayRefreshRatePreferHighest",
"displayRefreshRatePreferLowest",
"themeBrightnessLight", "themeBrightnessLight",
"themeBrightnessDark", "themeBrightnessDark",
"themeBrightnessBlack", "themeBrightnessBlack",
@ -163,10 +189,14 @@
"settingsConfirmationDialogMoveUndatedItems", "settingsConfirmationDialogMoveUndatedItems",
"settingsSectionDisplay", "settingsSectionDisplay",
"settingsThemeBrightness", "settingsThemeBrightness",
"settingsThemeColorful" "settingsThemeColorful",
"settingsDisplayRefreshRateModeTile",
"settingsDisplayRefreshRateModeTitle"
], ],
"ru": [ "ru": [
"displayRefreshRatePreferHighest",
"displayRefreshRatePreferLowest",
"themeBrightnessLight", "themeBrightnessLight",
"themeBrightnessDark", "themeBrightnessDark",
"themeBrightnessBlack", "themeBrightnessBlack",
@ -185,6 +215,8 @@
"settingsConfirmationDialogMoveUndatedItems", "settingsConfirmationDialogMoveUndatedItems",
"settingsSectionDisplay", "settingsSectionDisplay",
"settingsThemeBrightness", "settingsThemeBrightness",
"settingsThemeColorful" "settingsThemeColorful",
"settingsDisplayRefreshRateModeTile",
"settingsDisplayRefreshRateModeTitle"
] ]
} }