From 397f648b0a414f8a7c63ae5d40eff080761042e9 Mon Sep 17 00:00:00 2001 From: 22 <60903333+nini22P@users.noreply.github.com> Date: Sat, 25 Jan 2025 16:22:04 +0800 Subject: [PATCH] move brightness and volume code to hooks. update change log --- CHANGELOG.md | 21 +++++++ lib/hooks/use_brightness.dart | 45 +++++++++++++++ lib/hooks/use_volume.dart | 34 +++++++++++ lib/pages/player/iris_player.dart | 96 ++++++++----------------------- pubspec.yaml | 2 +- 5 files changed, 126 insertions(+), 72 deletions(-) create mode 100644 lib/hooks/use_brightness.dart create mode 100644 lib/hooks/use_volume.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e608dc..726601b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ +## v1.2.0 + +### Changelog +* Support jumping to video playback from external clicks (Windows version can play by command line or dragging files to the window) +* Support adjusting brightness and volume gestures (Brightness gestures are not available on Windows version) +* Support playing online links +* Add an option to always start playback from the beginning +* On Android 11 and above, file reading is changed to using the "Manage All Files" permission +* Improved WebDAV connection test function +* Improved some visual effects + +### 更新日志 +* 支持从外部点击视频跳转播放(Windows 版本可以通过命令行或者拖拽文件到窗口播放) +* 支持调整亮度和音量手势(Windows 版本调整亮度手势不可用) +* 支持播放在线链接 +* 添加总是从头开始播放的选项 +* Android 11 以上读取文件时改为使用 `管理所有文件` 权限 +* 改进 WebDAV 测试连接功能 +* 改进了部分视觉效果 + + ## v1.1.1 ### Changelog diff --git a/lib/hooks/use_brightness.dart b/lib/hooks/use_brightness.dart new file mode 100644 index 0000000..264774d --- /dev/null +++ b/lib/hooks/use_brightness.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:iris/utils/logger.dart'; +import 'package:screen_brightness/screen_brightness.dart'; + +ValueNotifier useBrightness(bool isGesture) { + final brightness = useState(null); + + useEffect(() { + try { + () async { + if (!isGesture) return; + brightness.value = await ScreenBrightness().current; + }(); + } catch (e) { + logger('Error getting brightness: $e'); + } + return () => brightness.value = null; + }, [isGesture]); + + useEffect(() { + try { + if (brightness.value != null && isGesture) { + ScreenBrightness().setScreenBrightness(brightness.value!); + } + } catch (e) { + logger('Error setting brightness: $e'); + } + return; + }, [brightness.value]); + + // 退出时重置亮度 + useEffect( + () => () { + try { + ScreenBrightness().resetScreenBrightness(); + } catch (e) { + logger('Error resetting brightness: $e'); + } + }, + [], + ); + + return brightness; +} diff --git a/lib/hooks/use_volume.dart b/lib/hooks/use_volume.dart new file mode 100644 index 0000000..fcfa6be --- /dev/null +++ b/lib/hooks/use_volume.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_volume_controller/flutter_volume_controller.dart'; +import 'package:iris/utils/logger.dart'; + +ValueNotifier useVolume(bool isGesture) { + final volume = useState(null); + + useEffect(() { + try { + () async { + if (!isGesture) return; + await FlutterVolumeController.updateShowSystemUI(false); + volume.value = await FlutterVolumeController.getVolume(); + }(); + } catch (e) { + logger('Error getting volume: $e'); + } + return () => volume.value = null; + }, [isGesture]); + + useEffect(() { + try { + if (volume.value != null && isGesture) { + FlutterVolumeController.setVolume(volume.value!); + } + } catch (e) { + logger('Error setting volume: $e'); + } + return; + }, [volume.value]); + + return volume; +} diff --git a/lib/pages/player/iris_player.dart b/lib/pages/player/iris_player.dart index 44a765b..3827a63 100644 --- a/lib/pages/player/iris_player.dart +++ b/lib/pages/player/iris_player.dart @@ -5,10 +5,11 @@ import 'package:desktop_drop/desktop_drop.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:flutter_volume_controller/flutter_volume_controller.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; +import 'package:iris/hooks/use_brightness.dart'; import 'package:iris/hooks/use_player_controller.dart'; import 'package:iris/hooks/use_player_core.dart'; +import 'package:iris/hooks/use_volume.dart'; import 'package:iris/info.dart'; import 'package:iris/models/file.dart'; import 'package:iris/models/storages/local.dart'; @@ -36,7 +37,6 @@ import 'package:iris/pages/player/control_bar.dart'; import 'package:media_kit/media_kit.dart'; import 'package:media_kit_video/media_kit_video.dart'; import 'package:path_provider/path_provider.dart'; -import 'package:screen_brightness/screen_brightness.dart'; import 'package:window_manager/window_manager.dart'; class IrisPlayer extends HookWidget { @@ -140,67 +140,8 @@ class IrisPlayer extends HookWidget { final isShowControl = useState(true); final isShowProgress = useState(false); - final brightness = useState(null); - final volume = useState(null); - - useEffect(() { - try { - () async { - if (!isLeftGesture.value) return; - brightness.value = await ScreenBrightness().current; - }(); - } catch (e) { - logger('Error getting brightness: $e'); - } - return () => brightness.value = null; - }, [isLeftGesture.value]); - - useEffect(() { - try { - () async { - if (!isRightGesture.value) return; - await FlutterVolumeController.updateShowSystemUI(false); - volume.value = await FlutterVolumeController.getVolume(); - }(); - } catch (e) { - logger('Error getting volume: $e'); - } - return () => volume.value = null; - }, [isRightGesture.value]); - - useEffect(() { - try { - if (brightness.value != null && isLeftGesture.value) { - ScreenBrightness().setScreenBrightness(brightness.value!); - } - } catch (e) { - logger('Error setting brightness: $e'); - } - return; - }, [brightness.value]); - - // 退出时重置亮度 - useEffect( - () => () { - try { - ScreenBrightness().resetScreenBrightness(); - } catch (e) { - logger('Error resetting brightness: $e'); - } - }, - [], - ); - - useEffect(() { - try { - if (volume.value != null && isRightGesture.value) { - FlutterVolumeController.setVolume(volume.value!); - } - } catch (e) { - logger('Error setting volume: $e'); - } - return; - }, [volume.value]); + final brightness = useBrightness(isLeftGesture.value); + final volume = useVolume(isRightGesture.value); AppLifecycleState? appLifecycleState = useAppLifecycleState(); @@ -821,17 +762,20 @@ class IrisPlayer extends HookWidget { mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon( - Icons.speed_rounded, - color: Colors.white, - size: 24, + Transform.translate( + offset: const Offset(0, 1.5), + child: Icon( + Icons.speed_rounded, + color: Colors.white, + size: 24, + ), ), - const SizedBox(width: 12), + const SizedBox(width: 10), Text( playerCore.rate.toString(), style: const TextStyle( color: Colors.white, - fontSize: 24, + fontSize: 20, height: 1, ), ), @@ -858,7 +802,11 @@ class IrisPlayer extends HookWidget { mainAxisSize: MainAxisSize.min, children: [ Icon( - Icons.brightness_6_rounded, + brightness.value == 0 + ? Icons.brightness_low_rounded + : brightness.value! < 1 + ? Icons.brightness_medium_rounded + : Icons.brightness_high_rounded, color: Colors.white, size: 24, ), @@ -867,6 +815,7 @@ class IrisPlayer extends HookWidget { width: 100, child: LinearProgressIndicator( value: brightness.value, + borderRadius: BorderRadius.circular(4), backgroundColor: Colors.grey, valueColor: AlwaysStoppedAnimation(Colors.white), @@ -895,7 +844,11 @@ class IrisPlayer extends HookWidget { mainAxisSize: MainAxisSize.min, children: [ Icon( - Icons.volume_up_rounded, + volume.value == 0 + ? Icons.volume_mute_rounded + : volume.value! < 0.5 + ? Icons.volume_down_rounded + : Icons.volume_up_rounded, color: Colors.white, size: 24, ), @@ -904,6 +857,7 @@ class IrisPlayer extends HookWidget { width: 100, child: LinearProgressIndicator( value: volume.value, + borderRadius: BorderRadius.circular(4), backgroundColor: Colors.grey, valueColor: AlwaysStoppedAnimation( Colors.white, diff --git a/pubspec.yaml b/pubspec.yaml index e7793cb..d079616 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.1.1+2 +version: 1.2.0+3 environment: sdk: ^3.5.4