diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 455fd7484..44cf8fd6d 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -797,20 +797,10 @@ "settingsSectionViewer": "Viewer", "@settingsSectionViewer": {}, - "settingsViewerShowOverlayOnOpening": "Show overlay on opening", - "@settingsViewerShowOverlayOnOpening": {}, - "settingsViewerShowMinimap": "Show minimap", - "@settingsViewerShowMinimap": {}, - "settingsViewerShowInformation": "Show information", - "@settingsViewerShowInformation": {}, - "settingsViewerShowInformationSubtitle": "Show title, date, location, etc.", - "@settingsViewerShowInformationSubtitle": {}, - "settingsViewerShowShootingDetails": "Show shooting details", - "@settingsViewerShowShootingDetails": {}, - "settingsViewerEnableOverlayBlurEffect": "Overlay blur effect", - "@settingsViewerEnableOverlayBlurEffect": {}, "settingsViewerUseCutout": "Use cutout area", "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "Maximum brightness", + "@settingsViewerMaximumBrightness": {}, "settingsImageBackground": "Image background", "@settingsImageBackground": {}, @@ -827,6 +817,23 @@ "settingsViewerQuickActionEmpty": "No buttons", "@settingsViewerQuickActionEmpty": {}, + "settingsViewerOverlayTile": "Overlay", + "@settingsViewerOverlayTile": {}, + "settingsViewerOverlayTitle": "Overlay", + "@settingsViewerOverlayTitle": {}, + "settingsViewerShowOverlayOnOpening": "Show on opening", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowMinimap": "Show minimap", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "Show information", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "Show title, date, location, etc.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowShootingDetails": "Show shooting details", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerEnableOverlayBlurEffect": "Blur effect", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsVideoPageTitle": "Video Settings", "@settingsVideoPageTitle": {}, "settingsSectionVideo": "Video", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index d853aefb4..957d57c04 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -375,13 +375,8 @@ "settingsCollectionSelectionQuickActionEditorBanner": "Maintenez votre doigt appuyé pour déplacer les boutons et choisir les actions affichées lors de la sélection d’éléments.", "settingsSectionViewer": "Visionneuse", - "settingsViewerShowOverlayOnOpening": "Afficher les incrustations à l’ouverture", - "settingsViewerShowMinimap": "Afficher la mini-carte", - "settingsViewerShowInformation": "Afficher les détails", - "settingsViewerShowInformationSubtitle": "Afficher les titre, date, lieu, etc.", - "settingsViewerShowShootingDetails": "Afficher les détails de prise de vue", - "settingsViewerEnableOverlayBlurEffect": "Effets de flou des incrustations", "settingsViewerUseCutout": "Utiliser la zone d’encoche", + "settingsViewerMaximumBrightness": "Luminosité maximale", "settingsImageBackground": "Arrière-plan de l’image", "settingsViewerQuickActionsTile": "Actions rapides", @@ -391,6 +386,15 @@ "settingsViewerQuickActionEditorAvailableButtons": "Boutons disponibles", "settingsViewerQuickActionEmpty": "Aucun bouton", + "settingsViewerOverlayTile": "Incrustations", + "settingsViewerOverlayTitle": "Incrustations", + "settingsViewerShowOverlayOnOpening": "Afficher à l’ouverture", + "settingsViewerShowMinimap": "Afficher la mini-carte", + "settingsViewerShowInformation": "Afficher les détails", + "settingsViewerShowInformationSubtitle": "Afficher les titre, date, lieu, etc.", + "settingsViewerShowShootingDetails": "Afficher les détails de prise de vue", + "settingsViewerEnableOverlayBlurEffect": "Effets de flou", + "settingsVideoPageTitle": "Réglages vidéo", "settingsSectionVideo": "Vidéo", "settingsVideoShowVideos": "Afficher les vidéos", diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index b39d70a9d..060cb2ad6 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -22,6 +22,7 @@ "showTooltip": "보기", "hideTooltip": "숨기기", "removeTooltip": "제거", + "resetButtonTooltip": "복원", "doubleBackExitMessage": "종료하려면 한번 더 누르세요.", @@ -373,13 +374,8 @@ "settingsCollectionSelectionQuickActionEditorBanner": "버튼을 길게 누른 후 이동하여 항목 선택할 때 표시될 버튼을 선택하세요.", "settingsSectionViewer": "뷰어", - "settingsViewerShowOverlayOnOpening": "열릴 때 오버레이 표시", - "settingsViewerShowMinimap": "미니맵 표시", - "settingsViewerShowInformation": "상세 정보 표시", - "settingsViewerShowInformationSubtitle": "제목, 날짜, 장소 등 표시", - "settingsViewerShowShootingDetails": "촬영 정보 표시", - "settingsViewerEnableOverlayBlurEffect": "오버레이 흐림 효과", "settingsViewerUseCutout": "컷아웃 영역 사용", + "settingsViewerMaximumBrightness": "최대 밝기", "settingsImageBackground": "이미지 배경", "settingsViewerQuickActionsTile": "빠른 작업", @@ -389,6 +385,15 @@ "settingsViewerQuickActionEditorAvailableButtons": "추가 가능한 버튼", "settingsViewerQuickActionEmpty": "버튼이 없습니다", + "settingsViewerOverlayTile": "오버레이", + "settingsViewerOverlayTitle": "오버레이", + "settingsViewerShowOverlayOnOpening": "열릴 때 표시", + "settingsViewerShowMinimap": "미니맵 표시", + "settingsViewerShowInformation": "상세 정보 표시", + "settingsViewerShowInformationSubtitle": "제목, 날짜, 장소 등 표시", + "settingsViewerShowShootingDetails": "촬영 정보 표시", + "settingsViewerEnableOverlayBlurEffect": "흐림 효과", + "settingsVideoPageTitle": "동영상 설정", "settingsSectionVideo": "동영상", "settingsVideoShowVideos": "미디어에 동영상 표시", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index aee4bd4c0..757d0ffbc 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -373,12 +373,6 @@ "settingsCollectionSelectionQuickActionEditorBanner": "Нажмите и удерживайте, чтобы переместить кнопки и выбрать, какие действия будут отображаться при выборе элементов.", "settingsSectionViewer": "Просмотрщик", - "settingsViewerShowOverlayOnOpening": "Показывать наложение при открытии", - "settingsViewerShowMinimap": "Показать миникарту", - "settingsViewerShowInformation": "Показывать информацию", - "settingsViewerShowInformationSubtitle": "Показать название, дату, местоположение и т.д.", - "settingsViewerShowShootingDetails": "Показать детали съёмки", - "settingsViewerEnableOverlayBlurEffect": "Наложение эффекта размытия", "settingsViewerUseCutout": "Использовать область выреза", "settingsImageBackground": "Фон изображения", @@ -389,6 +383,15 @@ "settingsViewerQuickActionEditorAvailableButtons": "Доступные кнопки", "settingsViewerQuickActionEmpty": "Нет кнопок", + "settingsViewerOverlayTile": "Наложение", + "settingsViewerOverlayTitle": "Наложение", + "settingsViewerShowOverlayOnOpening": "Показывать наложение при открытии", + "settingsViewerShowMinimap": "Показать миникарту", + "settingsViewerShowInformation": "Показывать информацию", + "settingsViewerShowInformationSubtitle": "Показать название, дату, местоположение и т.д.", + "settingsViewerShowShootingDetails": "Показать детали съёмки", + "settingsViewerEnableOverlayBlurEffect": "Наложение эффекта размытия", + "settingsVideoPageTitle": "Настройки видео", "settingsSectionVideo": "Видео", "settingsVideoShowVideos": "Показывать видео", diff --git a/lib/model/settings/defaults.dart b/lib/model/settings/defaults.dart index 47db03e03..7f138b165 100644 --- a/lib/model/settings/defaults.dart +++ b/lib/model/settings/defaults.dart @@ -65,6 +65,7 @@ class SettingsDefaults { static const showOverlayShootingDetails = false; static const enableOverlayBlurEffect = true; // `enableOverlayBlurEffect` has a contextual default value static const viewerUseCutout = true; + static const viewerMaxBrightness = false; // video static const videoQuickActions = [ diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index 25522d64f..19f19585e 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -81,6 +81,7 @@ class Settings extends ChangeNotifier { static const showOverlayShootingDetailsKey = 'show_overlay_shooting_details'; static const enableOverlayBlurEffectKey = 'enable_overlay_blur_effect'; static const viewerUseCutoutKey = 'viewer_use_cutout'; + static const viewerMaxBrightnessKey = 'viewer_max_brightness'; // video static const videoQuickActionsKey = 'video_quick_actions'; @@ -352,6 +353,10 @@ class Settings extends ChangeNotifier { set viewerUseCutout(bool newValue) => setAndNotify(viewerUseCutoutKey, newValue); + bool get viewerMaxBrightness => getBoolOrDefault(viewerMaxBrightnessKey, SettingsDefaults.viewerMaxBrightness); + + set viewerMaxBrightness(bool newValue) => setAndNotify(viewerMaxBrightnessKey, newValue); + // video List get videoQuickActions => getEnumListOrDefault(videoQuickActionsKey, SettingsDefaults.videoQuickActions, VideoAction.values); @@ -587,6 +592,7 @@ class Settings extends ChangeNotifier { case showOverlayShootingDetailsKey: case enableOverlayBlurEffectKey: case viewerUseCutoutKey: + case viewerMaxBrightnessKey: case enableVideoHardwareAccelerationKey: case enableVideoAutoPlayKey: case subtitleShowOutlineKey: diff --git a/lib/utils/constants.dart b/lib/utils/constants.dart index 1a7bc6d45..70c58b324 100644 --- a/lib/utils/constants.dart +++ b/lib/utils/constants.dart @@ -132,6 +132,11 @@ class Constants { license: 'Apache 2.0', sourceUrl: 'https://github.com/DavBfr/dart_pdf', ), + Dependency( + name: 'Screen Brightness', + license: 'MIT', + sourceUrl: 'https://github.com/aaassseee/screen_brightness', + ), Dependency( name: 'Shared Preferences', license: 'BSD 3-Clause', diff --git a/lib/widgets/settings/viewer/overlay.dart b/lib/widgets/settings/viewer/overlay.dart new file mode 100644 index 000000000..38c85808f --- /dev/null +++ b/lib/widgets/settings/viewer/overlay.dart @@ -0,0 +1,91 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:tuple/tuple.dart'; + +class ViewerOverlayTile extends StatelessWidget { + const ViewerOverlayTile({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ListTile( + title: Text(context.l10n.settingsViewerOverlayTile), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + settings: const RouteSettings(name: ViewerOverlayPage.routeName), + builder: (context) => const ViewerOverlayPage(), + ), + ); + }, + ); + } +} + +class ViewerOverlayPage extends StatelessWidget { + static const routeName = '/settings/viewer_overlay'; + + const ViewerOverlayPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(context.l10n.settingsViewerOverlayTitle), + ), + body: SafeArea( + child: ListView( + children: [ + Selector( + selector: (context, s) => s.showOverlayOnOpening, + builder: (context, current, child) => SwitchListTile( + value: current, + onChanged: (v) => settings.showOverlayOnOpening = v, + title: Text(context.l10n.settingsViewerShowOverlayOnOpening), + ), + ), + Selector( + selector: (context, s) => s.showOverlayMinimap, + builder: (context, current, child) => SwitchListTile( + value: current, + onChanged: (v) => settings.showOverlayMinimap = v, + title: Text(context.l10n.settingsViewerShowMinimap), + ), + ), + Selector( + selector: (context, s) => s.showOverlayInfo, + builder: (context, current, child) => SwitchListTile( + value: current, + onChanged: (v) => settings.showOverlayInfo = v, + title: Text(context.l10n.settingsViewerShowInformation), + subtitle: Text(context.l10n.settingsViewerShowInformationSubtitle), + ), + ), + Selector>( + selector: (context, s) => Tuple2(s.showOverlayInfo, s.showOverlayShootingDetails), + builder: (context, s, child) { + final showInfo = s.item1; + final current = s.item2; + return SwitchListTile( + value: current, + onChanged: showInfo ? (v) => settings.showOverlayShootingDetails = v : null, + title: Text(context.l10n.settingsViewerShowShootingDetails), + ); + }, + ), + Selector( + selector: (context, s) => s.enableOverlayBlurEffect, + builder: (context, current, child) => SwitchListTile( + value: current, + onChanged: (v) => settings.enableOverlayBlurEffect = v, + title: Text(context.l10n.settingsViewerEnableOverlayBlurEffect), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/settings/viewer/viewer.dart b/lib/widgets/settings/viewer/viewer.dart index e06bb572b..ec62009e8 100644 --- a/lib/widgets/settings/viewer/viewer.dart +++ b/lib/widgets/settings/viewer/viewer.dart @@ -7,10 +7,10 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; import 'package:aves/widgets/settings/common/tile_leading.dart'; import 'package:aves/widgets/settings/viewer/entry_background.dart'; +import 'package:aves/widgets/settings/viewer/overlay.dart'; import 'package:aves/widgets/settings/viewer/viewer_actions_editor.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tuple/tuple.dart'; class ViewerSection extends StatelessWidget { final ValueNotifier expandedNotifier; @@ -32,52 +32,16 @@ class ViewerSection extends StatelessWidget { showHighlight: false, children: [ const ViewerActionsTile(), - Selector( - selector: (context, s) => s.showOverlayOnOpening, - builder: (context, current, child) => SwitchListTile( - value: current, - onChanged: (v) => settings.showOverlayOnOpening = v, - title: Text(context.l10n.settingsViewerShowOverlayOnOpening), - ), - ), - Selector( - selector: (context, s) => s.showOverlayMinimap, - builder: (context, current, child) => SwitchListTile( - value: current, - onChanged: (v) => settings.showOverlayMinimap = v, - title: Text(context.l10n.settingsViewerShowMinimap), - ), - ), - Selector( - selector: (context, s) => s.showOverlayInfo, - builder: (context, current, child) => SwitchListTile( - value: current, - onChanged: (v) => settings.showOverlayInfo = v, - title: Text(context.l10n.settingsViewerShowInformation), - subtitle: Text(context.l10n.settingsViewerShowInformationSubtitle), - ), - ), - Selector>( - selector: (context, s) => Tuple2(s.showOverlayInfo, s.showOverlayShootingDetails), - builder: (context, s, child) { - final showInfo = s.item1; - final current = s.item2; - return SwitchListTile( - value: current, - onChanged: showInfo ? (v) => settings.showOverlayShootingDetails = v : null, - title: Text(context.l10n.settingsViewerShowShootingDetails), - ); - }, - ), - Selector( - selector: (context, s) => s.enableOverlayBlurEffect, - builder: (context, current, child) => SwitchListTile( - value: current, - onChanged: (v) => settings.enableOverlayBlurEffect = v, - title: Text(context.l10n.settingsViewerEnableOverlayBlurEffect), - ), - ), + const ViewerOverlayTile(), const _CutoutModeSwitch(), + Selector( + selector: (context, s) => s.viewerMaxBrightness, + builder: (context, current, child) => SwitchListTile( + value: current, + onChanged: (v) => settings.viewerMaxBrightness = v, + title: Text(context.l10n.settingsViewerMaximumBrightness), + ), + ), Selector( selector: (context, s) => s.imageBackground, builder: (context, current, child) => ListTile( diff --git a/lib/widgets/viewer/entry_vertical_pager.dart b/lib/widgets/viewer/entry_vertical_pager.dart index 2c722dbe6..656cb2a53 100644 --- a/lib/widgets/viewer/entry_vertical_pager.dart +++ b/lib/widgets/viewer/entry_vertical_pager.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:math'; +import 'dart:ui'; import 'package:aves/model/entry.dart'; import 'package:aves/model/settings/settings.dart'; @@ -12,6 +13,7 @@ import 'package:aves/widgets/viewer/info/notifications.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; +import 'package:screen_brightness/screen_brightness.dart'; class ViewerVerticalPageView extends StatefulWidget { final CollectionLens? collection; @@ -42,6 +44,7 @@ class _ViewerVerticalPageViewState extends State { final ValueNotifier _isVerticallyScrollingNotifier = ValueNotifier(false); Timer? _verticalScrollMonitoringTimer; AvesEntry? _oldEntry; + Future? _systemBrightness; CollectionLens? get collection => widget.collection; @@ -49,10 +52,16 @@ class _ViewerVerticalPageViewState extends State { AvesEntry? get entry => widget.entryNotifier.value; + static const double maximumBrightness = 1.0; + @override void initState() { super.initState(); _registerWidget(widget); + + if (settings.viewerMaxBrightness) { + _systemBrightness = ScreenBrightness().system; + } } @override @@ -144,9 +153,18 @@ class _ViewerVerticalPageViewState extends State { } void _onVerticalPageControllerChanged() { - final opacity = min(1.0, widget.verticalPager.page!); + final page = widget.verticalPager.page!; + + final opacity = min(1.0, page); _backgroundColorNotifier.value = _backgroundColorNotifier.value.withOpacity(opacity * opacity); + if (page <= 1 && settings.viewerMaxBrightness) { + _systemBrightness?.then((system) { + final transition = max(system, lerpDouble(system, maximumBrightness, page / 2)!); + ScreenBrightness().setScreenBrightness(transition); + }); + } + _isVerticallyScrollingNotifier.value = true; _stopScrollMonitoringTimer(); _verticalScrollMonitoringTimer = Timer(Durations.infoScrollMonitoringTimerDelay, () { diff --git a/lib/widgets/viewer/entry_viewer_stack.dart b/lib/widgets/viewer/entry_viewer_stack.dart index ca2f7f6e6..fbac83b33 100644 --- a/lib/widgets/viewer/entry_viewer_stack.dart +++ b/lib/widgets/viewer/entry_viewer_stack.dart @@ -34,6 +34,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; +import 'package:screen_brightness/screen_brightness.dart'; class EntryViewerStack extends StatefulWidget { final CollectionLens? collection; @@ -83,6 +84,9 @@ class _EntryViewerStackState extends State with FeedbackMixin, if (!settings.viewerUseCutout) { windowService.setCutoutMode(false); } + if (settings.viewerMaxBrightness) { + ScreenBrightness().setScreenBrightness(1); + } if (settings.keepScreenOn == KeepScreenOn.viewerOnly) { windowService.keepScreenOn(true); } @@ -521,6 +525,9 @@ class _EntryViewerStackState extends State with FeedbackMixin, if (!settings.viewerUseCutout) { windowService.setCutoutMode(true); } + if (settings.viewerMaxBrightness) { + ScreenBrightness().resetScreenBrightness(); + } if (settings.keepScreenOn == KeepScreenOn.viewerOnly) { windowService.keepScreenOn(false); } diff --git a/plugins/aves_report_crashlytics/pubspec.lock b/plugins/aves_report_crashlytics/pubspec.lock index 22d18caae..fd1f873ab 100644 --- a/plugins/aves_report_crashlytics/pubspec.lock +++ b/plugins/aves_report_crashlytics/pubspec.lock @@ -115,7 +115,7 @@ packages: source: sdk version: "0.0.99" stack_trace: - dependency: transitive + dependency: "direct main" description: name: stack_trace url: "https://pub.dartlang.org" diff --git a/plugins/aves_report_crashlytics/pubspec.yaml b/plugins/aves_report_crashlytics/pubspec.yaml index c0ba30e16..6e756d446 100644 --- a/plugins/aves_report_crashlytics/pubspec.yaml +++ b/plugins/aves_report_crashlytics/pubspec.yaml @@ -13,6 +13,7 @@ dependencies: path: ../aves_report firebase_core: firebase_crashlytics: + stack_trace: dev_dependencies: flutter_lints: diff --git a/pubspec.lock b/pubspec.lock index 95ebebf7c..8129fddde 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -861,6 +861,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.1+1" + screen_brightness: + dependency: "direct main" + description: + name: screen_brightness + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.1" + screen_brightness_platform_interface: + dependency: transitive + description: + name: screen_brightness_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.2" shared_preferences: dependency: "direct main" description: @@ -986,7 +1000,7 @@ packages: source: hosted version: "2.0.1+1" stack_trace: - dependency: "direct main" + dependency: transitive description: name: stack_trace url: "https://pub.dartlang.org" diff --git a/pubspec.yaml b/pubspec.yaml index 7f51aede6..7acc7d40f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -57,9 +57,9 @@ dependencies: permission_handler: printing: provider: + screen_brightness: shared_preferences: sqflite: - stack_trace: streams_channel: git: url: git://github.com/deckerst/aves_streams_channel.git diff --git a/untranslated.json b/untranslated.json index ec2e86e7c..a8ce4fac0 100644 --- a/untranslated.json +++ b/untranslated.json @@ -1,6 +1,5 @@ { "ko": [ - "resetButtonTooltip", "entryInfoActionEditTags", "tagEditorPageTitle", "tagEditorPageNewTagFieldLabel", @@ -10,6 +9,7 @@ "ru": [ "resetButtonTooltip", "entryInfoActionEditTags", + "settingsViewerMaximumBrightness", "tagEditorPageTitle", "tagEditorPageNewTagFieldLabel", "tagEditorPageAddTagTooltip"