diff --git a/CHANGELOG.md b/CHANGELOG.md index ad6dcfb..481480d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +## v1.3.4 + +### Changelog + +* The Android version allows you to set the screen orientation. +* Add playback speed button. +* Add hotkeys: Step forward `+`, Step backward `-`. + +### 更新日志 + +* 安卓版本可以设置屏幕方向。 +* 添加播放速度按钮。 +* 添加快捷键:帧进 `+`,帧退 `-`。 + + ## v1.3.3 ### Changelog diff --git a/README.md b/README.md index 13e97a7..1310c3f 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,8 @@ English | [中文](./README_CN.md) | `Ctrl + C` | Close currently media file | | `Ctrl + H` | Play history | | `Ctrl + P` | Settings | +| `+` | Step forward | +| `-` | Step backward | | `Enter` | Enter full screen / Exit full screen / Select file | | `F11` | Enter full screen / Exit full screen | | `Esc` | Exit current Menu / Go back / Exit full screen | diff --git a/README_CN.md b/README_CN.md index 408e402..f1e4b9a 100644 --- a/README_CN.md +++ b/README_CN.md @@ -52,6 +52,8 @@ | `Ctrl + C` | 关闭当前媒体文件 | | `Ctrl + H` | 播放历史 | | `Ctrl + P` | 设置 | +| `+` | 帧进 | +| `-` | 帧退 | | `Enter` | 进入全屏 / 退出全屏 / 选择文件 | | `F11` | 进入全屏 / 退出全屏 | | `Esc` | 退出当前菜单 / 返回上一级 / 关闭全屏 | diff --git a/android/.gitignore b/android/.gitignore index 0b6d805..2a7ed28 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -6,6 +6,8 @@ gradle-wrapper.jar /local.properties GeneratedPluginRegistrant.java +.cxx + # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore key.properties diff --git a/lib/hooks/use_fvp_player.dart b/lib/hooks/use_fvp_player.dart index 4a43d69..af0ded4 100644 --- a/lib/hooks/use_fvp_player.dart +++ b/lib/hooks/use_fvp_player.dart @@ -18,6 +18,7 @@ import 'package:wakelock_plus/wakelock_plus.dart'; FvpPlayer useFvpPlayer(BuildContext context) { final autoPlay = useAppStore().select(context, (state) => state.autoPlay); + final rate = useAppStore().select(context, (state) => state.rate); final volume = useAppStore().select(context, (state) => state.volume); final isMuted = useAppStore().select(context, (state) => state.isMuted); final repeat = useAppStore().select(context, (state) => state.repeat); @@ -91,6 +92,7 @@ FvpPlayer useFvpPlayer(BuildContext context) { try { await controller.initialize(); await controller.setLooping(repeat == Repeat.one ? true : false); + await controller.setPlaybackSpeed(rate); await controller.setVolume(isMuted ? 0 : volume / 100); } catch (e) { logger('Error initializing player: $e'); @@ -115,8 +117,6 @@ FvpPlayer useFvpPlayer(BuildContext context) { useListenableSelector(controller, () => controller.value.position); final buffered = useListenableSelector(controller, () => controller.value.buffered); - final playbackSpeed = - useListenableSelector(controller, () => controller.value.playbackSpeed); final size = useListenableSelector(controller, () => controller.value.size); final isCompleted = useListenableSelector(controller, () => controller.value.isCompleted); @@ -187,6 +187,13 @@ FvpPlayer useFvpPlayer(BuildContext context) { return; }, [isCompleted]); + useEffect(() { + if (controller.value.isInitialized) { + controller.setPlaybackSpeed(rate); + } + return; + }, [rate]); + useEffect(() { if (controller.value.isInitialized) { controller.setVolume(isMuted ? 0 : volume / 100); @@ -257,6 +264,16 @@ FvpPlayer useFvpPlayer(BuildContext context) { : await controller.seekTo(newPosition); } + Future stepBackward() async { + await controller.step(frames: -1); + logger('Step backward'); + } + + Future stepForward() async { + await controller.step(frames: 1); + logger('Step forward'); + } + Future saveProgress() async { if (file != null && duration != Duration.zero) { if (Platform.isAndroid && file.uri.startsWith('content://')) { @@ -289,14 +306,14 @@ FvpPlayer useFvpPlayer(BuildContext context) { aspect: aspect, width: size.width, height: size.height, - rate: playbackSpeed, play: play, pause: pause, backward: (seconds) => seekTo(Duration(seconds: position.inSeconds - seconds)), forward: (seconds) => seekTo(Duration(seconds: position.inSeconds + seconds)), - updateRate: (value) => controller.setPlaybackSpeed(value), + stepBackward: stepBackward, + stepForward: stepForward, seekTo: seekTo, saveProgress: saveProgress, seeking: seeking.value, diff --git a/lib/hooks/use_media_kit_player.dart b/lib/hooks/use_media_kit_player.dart index b00ba1b..5ac1c1b 100644 --- a/lib/hooks/use_media_kit_player.dart +++ b/lib/hooks/use_media_kit_player.dart @@ -27,12 +27,14 @@ MediaKitPlayer useMediaKitPlayer(BuildContext context) { final controller = useMemoized(() => VideoController(player)); + final rate = useAppStore().select(context, (state) => state.rate); final volume = useAppStore().select(context, (state) => state.volume); final isMuted = useAppStore().select(context, (state) => state.isMuted); useEffect(() { () async { player.setSubtitleTrack(SubtitleTrack.no()); + player.setRate(rate); player.setVolume(isMuted ? 0 : volume.toDouble()); if (Platform.isAndroid) { @@ -95,7 +97,7 @@ MediaKitPlayer useMediaKitPlayer(BuildContext context) { Duration duration = useStream(player.stream.duration).data ?? Duration.zero; Duration buffer = useStream(player.stream.buffer).data ?? Duration.zero; bool completed = useStream(player.stream.completed).data ?? false; - double rate = useStream(player.stream.rate).data ?? 1.0; + // double rate = useStream(player.stream.rate).data ?? 1.0; Track? track = useStream(player.stream.track).data; AudioTrack audio = @@ -227,6 +229,11 @@ MediaKitPlayer useMediaKitPlayer(BuildContext context) { return null; }, [completed, repeat]); + useEffect(() { + player.setRate(rate); + return; + }, [rate]); + useEffect(() { player.setVolume(isMuted ? 0 : volume.toDouble()); return; @@ -293,8 +300,21 @@ MediaKitPlayer useMediaKitPlayer(BuildContext context) { await seekTo(Duration(seconds: position.value.inSeconds + seconds)); } - Future updateRate(double value) async => - player.state.rate == value ? null : await player.setRate(value); + Future stepBackward() async { + final nativePlayer = player.platform; + if (nativePlayer is NativePlayer) { + await nativePlayer.command(['frame-back-step']); + logger('Step backward'); + } + } + + Future stepForward() async { + final nativePlayer = player.platform; + if (nativePlayer is NativePlayer) { + await nativePlayer.command(['frame-step']); + logger('Step forward'); + } + } return MediaKitPlayer( player: player, @@ -310,7 +330,6 @@ MediaKitPlayer useMediaKitPlayer(BuildContext context) { duration: duration, buffer: duration == Duration.zero ? Duration.zero : buffer, seeking: seeking.value, - rate: rate, aspect: videoParams?.aspect, width: videoParams?.w?.toDouble(), height: videoParams?.h?.toDouble(), @@ -321,7 +340,8 @@ MediaKitPlayer useMediaKitPlayer(BuildContext context) { pause: pause, backward: backward, forward: forward, - updateRate: updateRate, + stepBackward: stepBackward, + stepForward: stepForward, seekTo: seekTo, ); } diff --git a/lib/hooks/use_orientation.dart b/lib/hooks/use_orientation.dart new file mode 100644 index 0000000..c1b3e62 --- /dev/null +++ b/lib/hooks/use_orientation.dart @@ -0,0 +1,46 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_zustand/flutter_zustand.dart'; +import 'package:iris/models/player.dart'; +import 'package:iris/models/store/app_state.dart'; +import 'package:iris/store/use_app_store.dart'; + +void useOrientation(BuildContext context, MediaPlayer player) { + final orientation = + useAppStore().select(context, (state) => state.orientation); + + setOrientation(ScreenOrientation orientation, double? aspect) { + if (Platform.isAndroid || Platform.isIOS) { + switch (orientation) { + case ScreenOrientation.device: + SystemChrome.setPreferredOrientations([]); + break; + case ScreenOrientation.landscape: + SystemChrome.setPreferredOrientations([ + DeviceOrientation.landscapeLeft, + DeviceOrientation.landscapeRight, + ]); + break; + case ScreenOrientation.portrait: + SystemChrome.setPreferredOrientations([ + DeviceOrientation.portraitUp, + DeviceOrientation.portraitDown, + ]); + break; + } + } + } + + useEffect(() { + setOrientation(orientation, player.aspect); + return () => SystemChrome.setPreferredOrientations([]); + }, []); + + useEffect(() { + setOrientation(orientation, player.aspect); + return; + }, [orientation, player.aspect]); +} diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index b7ee381..178086d 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -25,6 +25,7 @@ "confirmUpdate": "Confirm update", "crop": "Crop", "dark": "Datk", + "device": "Device", "download": "Download", "download_and_update": "Download and update", "download_error": "Download error", @@ -43,6 +44,7 @@ "history": "History", "home": "Home", "host": "Host", + "landscape": "Landscape", "language": "Language", "last_modified": "Last modified", "libraries": "Libraries", @@ -65,8 +67,10 @@ "pause": "Pause", "play": "Play", "play_queue": "Play queue", + "playback_speed": "Playback speed", "player_backend": "Player backend", "port": "Port", + "portrait": "Portrait", "previous": "Previous", "refresh": "Refresh", "releasePage": "Release page", @@ -77,6 +81,7 @@ "repeat_one": "Repeat: One", "retry": "Retry", "save": "Save", + "screen_orientation": "ScreenOrientation", "select_language": "Select language", "settings": "Settings", "shuffle": "Shuffle", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 5022a90..be11dc9 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -25,6 +25,7 @@ "confirmUpdate": "确认更新", "crop": "裁切", "dark": "暗色", + "device": "设备", "download": "下载", "download_and_update": "下载并更新", "download_error": "下载错误", @@ -43,6 +44,7 @@ "history": "历史", "home": "主页", "host": "主机", + "landscape": "横向", "language": "语言", "last_modified": "最后修改", "libraries": "开源库", @@ -65,8 +67,10 @@ "pause": "暂停", "play": "播放", "play_queue": "播放队列", + "playback_speed": "播放速度", "player_backend": "播放器后端", "port": "端口", + "portrait": "纵向", "previous": "上一个", "refresh": "刷新", "releasePage": "发布页面", @@ -77,6 +81,7 @@ "repeat_one": "重复: 当前文件", "retry": "重试", "save": "保存", + "screen_orientation": "屏幕方向", "select_language": "选择语言", "settings": "设置", "shuffle": "随机", diff --git a/lib/models/player.dart b/lib/models/player.dart index 380c053..5067ff5 100644 --- a/lib/models/player.dart +++ b/lib/models/player.dart @@ -12,7 +12,6 @@ class MediaPlayer { final Duration duration; final Duration buffer; final bool seeking; - final double rate; final double? aspect; final double? width; final double? height; @@ -23,7 +22,8 @@ class MediaPlayer { final Future Function() pause; final Future Function(int) backward; final Future Function(int) forward; - final Future Function(double) updateRate; + final Future Function() stepBackward; + final Future Function() stepForward; final Future Function(Duration) seekTo; MediaPlayer({ @@ -34,7 +34,6 @@ class MediaPlayer { required this.duration, required this.buffer, required this.seeking, - required this.rate, required this.aspect, required this.width, required this.height, @@ -45,7 +44,8 @@ class MediaPlayer { required this.pause, required this.backward, required this.forward, - required this.updateRate, + required this.stepBackward, + required this.stepForward, required this.seekTo, }); } @@ -72,7 +72,6 @@ class MediaKitPlayer extends MediaPlayer { required super.duration, required super.buffer, required super.seeking, - required super.rate, required super.aspect, required super.width, required super.height, @@ -83,7 +82,8 @@ class MediaKitPlayer extends MediaPlayer { required super.pause, required super.backward, required super.forward, - required super.updateRate, + required super.stepBackward, + required super.stepForward, required super.seekTo, }); } @@ -102,7 +102,6 @@ class FvpPlayer extends MediaPlayer { required super.duration, required super.buffer, required super.seeking, - required super.rate, required super.aspect, required super.width, required super.height, @@ -113,7 +112,8 @@ class FvpPlayer extends MediaPlayer { required super.pause, required super.backward, required super.forward, - required super.updateRate, + required super.stepBackward, + required super.stepForward, required super.seekTo, }); } diff --git a/lib/models/store/app_state.dart b/lib/models/store/app_state.dart index 47bf5ac..2511ff5 100644 --- a/lib/models/store/app_state.dart +++ b/lib/models/store/app_state.dart @@ -26,6 +26,12 @@ enum SortOrder { desc, } +enum ScreenOrientation { + device, + landscape, + portrait, +} + @freezed class AppState with _$AppState { const factory AppState({ @@ -33,6 +39,7 @@ class AppState with _$AppState { @Default(false) bool shuffle, @Default(Repeat.none) Repeat repeat, @Default(BoxFit.contain) BoxFit fit, + @Default(1) double rate, @Default(80) int volume, @Default(false) bool isMuted, @Default(ThemeMode.system) ThemeMode themeMode, @@ -45,6 +52,7 @@ class AppState with _$AppState { @Default(SortBy.name) SortBy sortBy, @Default(SortOrder.asc) SortOrder sortOrder, @Default(true) bool folderFirst, + @Default(ScreenOrientation.device) ScreenOrientation orientation, }) = _AppState; factory AppState.fromJson(Map json) => diff --git a/lib/oss_licenses.dart b/lib/oss_licenses.dart index 2fbddf3..f6fe016 100644 --- a/lib/oss_licenses.dart +++ b/lib/oss_licenses.dart @@ -91,7 +91,6 @@ const allDependencies = [ _leak_tracker_testing, _lints, _logging, - _macros, _markdown, _matcher, _material_color_utilities, @@ -297,13 +296,13 @@ class PackageRef { Package resolve() => allDependencies.firstWhere((d) => d.name == name); } -/// _fe_analyzer_shared 79.0.0 +/// _fe_analyzer_shared 80.0.0 const __fe_analyzer_shared = Package( name: '_fe_analyzer_shared', description: 'Logic that is shared between the front_end and analyzer packages.', repository: 'https://github.com/dart-lang/sdk/tree/main/pkg/_fe_analyzer_shared', authors: [], - version: '79.0.0', + version: '80.0.0', license: '''Copyright 2019, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -336,13 +335,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('meta')] ); -/// analyzer 7.2.0 +/// analyzer 7.3.0 const _analyzer = Package( name: 'analyzer', description: 'This package provides a library that performs static analysis of Dart code.', repository: 'https://github.com/dart-lang/sdk/tree/main/pkg/analyzer', authors: [], - version: '7.2.0', + version: '7.3.0', license: '''Copyright 2013, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -372,7 +371,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, - dependencies: [PackageRef('_fe_analyzer_shared'), PackageRef('collection'), PackageRef('convert'), PackageRef('crypto'), PackageRef('glob'), PackageRef('macros'), PackageRef('meta'), PackageRef('package_config'), PackageRef('path'), PackageRef('pub_semver'), PackageRef('source_span'), PackageRef('watcher'), PackageRef('yaml')] + dependencies: [PackageRef('_fe_analyzer_shared'), PackageRef('collection'), PackageRef('convert'), PackageRef('crypto'), PackageRef('glob'), PackageRef('meta'), PackageRef('package_config'), PackageRef('path'), PackageRef('pub_semver'), PackageRef('source_span'), PackageRef('watcher'), PackageRef('yaml')] ); /// android_x_storage 1.0.2 @@ -417,13 +416,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('flutter'), PackageRef('plugin_platform_interface')] ); -/// app_links 6.3.3 +/// app_links 6.4.0 const _app_links = Package( name: 'app_links', description: 'Android App Links, Deep Links, iOs Universal Links and Custom URL schemes handler for Flutter (desktop included).', homepage: 'https://github.com/llfbandit/app_links', authors: [], - version: '6.3.3', + version: '6.4.0', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -1269,13 +1268,13 @@ const _app_links_web = Package( dependencies: [PackageRef('flutter'), PackageRef('app_links_platform_interface'), PackageRef('web')] ); -/// archive 4.0.2 +/// archive 4.0.3 const _archive = Package( name: 'archive', description: 'Provides encoders and decoders for various archive and compression formats such as zip, tar, bzip2, gzip, and zlib.', repository: 'https://github.com/brendan-duncan/archive', authors: [], - version: '4.0.2', + version: '4.0.3', license: '''The MIT License Copyright (c) 2013-2021 Brendan Duncan. @@ -1342,13 +1341,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [] ); -/// async 2.11.0 +/// async 2.12.0 const _async = Package( name: 'async', description: "Utility functions and classes related to the 'dart:async' library.", - repository: 'https://github.com/dart-lang/async', + repository: 'https://github.com/dart-lang/core/tree/main/pkgs/async', authors: [], - version: '2.11.0', + version: '2.12.0', license: '''Copyright 2015, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -1381,13 +1380,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('collection'), PackageRef('meta')] ); -/// boolean_selector 2.1.1 +/// boolean_selector 2.1.2 const _boolean_selector = Package( name: 'boolean_selector', description: "A flexible syntax for boolean expressions, based on a simplified version of Dart's expression syntax.", - repository: 'https://github.com/dart-lang/boolean_selector', + repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/boolean_selector', authors: [], - version: '2.1.1', + version: '2.1.2', license: '''Copyright 2016, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -1498,13 +1497,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('checked_yaml'), PackageRef('json_annotation'), PackageRef('path'), PackageRef('pubspec_parse'), PackageRef('yaml')] ); -/// build_daemon 4.0.3 +/// build_daemon 4.0.4 const _build_daemon = Package( name: 'build_daemon', description: 'A daemon for running Dart builds.', repository: 'https://github.com/dart-lang/build/tree/master/build_daemon', authors: [], - version: '4.0.3', + version: '4.0.4', license: '''Copyright 2019, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -1537,13 +1536,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('built_collection'), PackageRef('built_value'), PackageRef('crypto'), PackageRef('http_multi_server'), PackageRef('logging'), PackageRef('path'), PackageRef('pool'), PackageRef('shelf'), PackageRef('shelf_web_socket'), PackageRef('stream_transform'), PackageRef('watcher'), PackageRef('web_socket_channel')] ); -/// build_resolvers 2.4.3 +/// build_resolvers 2.4.4 const _build_resolvers = Package( name: 'build_resolvers', description: 'Resolve Dart code in a Builder', repository: 'https://github.com/dart-lang/build/tree/master/build_resolvers', authors: [], - version: '2.4.3', + version: '2.4.4', license: '''Copyright 2018, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -1576,13 +1575,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('analyzer'), PackageRef('async'), PackageRef('build'), PackageRef('collection'), PackageRef('convert'), PackageRef('crypto'), PackageRef('graphs'), PackageRef('logging'), PackageRef('package_config'), PackageRef('path'), PackageRef('pool'), PackageRef('pub_semver'), PackageRef('stream_transform'), PackageRef('yaml')] ); -/// build_runner 2.4.14 +/// build_runner 2.4.15 const _build_runner = Package( name: 'build_runner', description: 'A build system for Dart code generation and modular compilation.', repository: 'https://github.com/dart-lang/build/tree/master/build_runner', authors: [], - version: '2.4.14', + version: '2.4.15', license: '''Copyright 2016, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -1612,7 +1611,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, - dependencies: [PackageRef('analyzer'), PackageRef('args'), PackageRef('async'), PackageRef('build'), PackageRef('build_config'), PackageRef('build_daemon'), PackageRef('build_resolvers'), PackageRef('build_runner_core'), PackageRef('code_builder'), PackageRef('collection'), PackageRef('crypto'), PackageRef('dart_style'), PackageRef('frontend_server_client'), PackageRef('glob'), PackageRef('graphs'), PackageRef('http_multi_server'), PackageRef('io'), PackageRef('js'), PackageRef('logging'), PackageRef('meta'), PackageRef('mime'), PackageRef('package_config'), PackageRef('path'), PackageRef('pool'), PackageRef('pub_semver'), PackageRef('pubspec_parse'), PackageRef('shelf'), PackageRef('shelf_web_socket'), PackageRef('stack_trace'), PackageRef('stream_transform'), PackageRef('timing'), PackageRef('watcher'), PackageRef('web_socket_channel'), PackageRef('yaml')] + dependencies: [PackageRef('analyzer'), PackageRef('args'), PackageRef('async'), PackageRef('build'), PackageRef('build_config'), PackageRef('build_daemon'), PackageRef('build_resolvers'), PackageRef('build_runner_core'), PackageRef('code_builder'), PackageRef('collection'), PackageRef('crypto'), PackageRef('dart_style'), PackageRef('frontend_server_client'), PackageRef('glob'), PackageRef('graphs'), PackageRef('http'), PackageRef('http_multi_server'), PackageRef('io'), PackageRef('js'), PackageRef('logging'), PackageRef('meta'), PackageRef('mime'), PackageRef('package_config'), PackageRef('path'), PackageRef('pool'), PackageRef('pub_semver'), PackageRef('pubspec_parse'), PackageRef('shelf'), PackageRef('shelf_web_socket'), PackageRef('stack_trace'), PackageRef('stream_transform'), PackageRef('timing'), PackageRef('watcher'), PackageRef('web'), PackageRef('web_socket_channel'), PackageRef('yaml')] ); /// build_runner_core 8.0.0 @@ -1736,13 +1735,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('built_collection'), PackageRef('collection'), PackageRef('fixnum'), PackageRef('meta')] ); -/// characters 1.3.0 +/// characters 1.4.0 const _characters = Package( name: 'characters', description: 'String replacement with operations that are Unicode/grapheme cluster aware.', - repository: 'https://github.com/dart-lang/characters', + repository: 'https://github.com/dart-lang/core/tree/main/pkgs/characters', authors: [], - version: '1.3.0', + version: '1.4.0', license: '''Copyright 2019, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -1813,13 +1812,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('json_annotation'), PackageRef('source_span'), PackageRef('yaml')] ); -/// clock 1.1.1 +/// clock 1.1.2 const _clock = Package( name: 'clock', description: 'A fakeable wrapper for dart:core clock APIs.', - repository: 'https://github.com/dart-lang/clock', + repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/clock', authors: [], - version: '1.1.1', + version: '1.1.2', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -2065,13 +2064,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('built_collection'), PackageRef('built_value'), PackageRef('collection'), PackageRef('matcher'), PackageRef('meta')] ); -/// collection 1.19.0 +/// collection 1.19.1 const _collection = Package( name: 'collection', description: 'Collections and utilities functions and classes related to collections.', - repository: 'https://github.com/dart-lang/collection', + repository: 'https://github.com/dart-lang/core/tree/main/pkgs/collection', authors: [], - version: '1.19.0', + version: '1.19.1', license: '''Copyright 2015, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -2363,13 +2362,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('analyzer'), PackageRef('args'), PackageRef('collection'), PackageRef('package_config'), PackageRef('path'), PackageRef('pub_semver'), PackageRef('source_span'), PackageRef('yaml')] ); -/// dbus 0.7.10 +/// dbus 0.7.11 const _dbus = Package( name: 'dbus', description: 'A native Dart implementation of the D-Bus message bus client. This package allows Dart applications to directly access services on the Linux desktop.', homepage: 'https://github.com/canonical/dbus.dart', authors: [], - version: '0.7.10', + version: '0.7.11', license: '''Mozilla Public License Version 2.0 ================================== @@ -2961,14 +2960,14 @@ const _desktop_drop = Package( dependencies: [PackageRef('flutter'), PackageRef('cross_file'), PackageRef('web')] ); -/// device_info_plus 11.2.1 +/// device_info_plus 11.3.0 const _device_info_plus = Package( name: 'device_info_plus', description: 'Flutter plugin providing detailed information about the device (make, model, etc.), and Android or iOS version the app is running on.', homepage: 'https://github.com/fluttercommunity/plus_plugins', repository: 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/device_info_plus/device_info_plus', authors: [], - version: '11.2.1', + version: '11.3.0', license: '''Copyright 2017 The Chromium Authors. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -3041,7 +3040,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('flutter'), PackageRef('meta'), PackageRef('plugin_platform_interface')] ); -/// dio 5.7.0 +/// dio 5.8.0+1 const _dio = Package( name: 'dio', description: '''A powerful HTTP networking package, @@ -3052,7 +3051,7 @@ Custom adapters, Transformers, etc. homepage: 'https://github.com/cfug/dio', repository: 'https://github.com/cfug/dio/blob/main/dio', authors: [], - version: '5.7.0', + version: '5.8.0+1', license: '''MIT License Copyright (c) 2018 Wen Du (wendux) @@ -3077,17 +3076,17 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, - dependencies: [PackageRef('async'), PackageRef('http_parser'), PackageRef('meta'), PackageRef('path'), PackageRef('dio_web_adapter')] + dependencies: [PackageRef('async'), PackageRef('collection'), PackageRef('http_parser'), PackageRef('meta'), PackageRef('path'), PackageRef('dio_web_adapter')] ); -/// dio_web_adapter 2.0.0 +/// dio_web_adapter 2.1.0 const _dio_web_adapter = Package( name: 'dio_web_adapter', description: 'An adapter that supports Dio on Web.', homepage: 'https://github.com/cfug/dio', repository: 'https://github.com/cfug/dio/blob/main/plugins/web_adapter', authors: [], - version: '2.0.0', + version: '2.1.0', license: '''MIT License Copyright (c) 2018 Wen Du (wendux) @@ -3397,13 +3396,13 @@ SOFTWARE.''', dependencies: [PackageRef('collection'), PackageRef('meta')] ); -/// fake_async 1.3.1 +/// fake_async 1.3.2 const _fake_async = Package( name: 'fake_async', description: 'Fake asynchronous events such as timers and microtasks for deterministic testing.', - repository: 'https://github.com/dart-lang/fake_async', + repository: 'https://github.com/dart-lang/test/tree/master/pkgs/fake_async', authors: [], - version: '1.3.1', + version: '1.3.2', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -3610,13 +3609,13 @@ const _fake_async = Package( dependencies: [] ); -/// ffi 2.1.3 +/// ffi 2.1.4 const _ffi = Package( name: 'ffi', description: 'Utilities for working with Foreign Function Interface (FFI) code.', repository: 'https://github.com/dart-lang/native/tree/main/pkgs/ffi', authors: [], - version: '2.1.3', + version: '2.1.4', license: '''Copyright 2019, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -3687,14 +3686,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('meta'), PackageRef('path')] ); -/// file_picker 8.1.7 +/// file_picker 8.3.7 const _file_picker = Package( name: 'file_picker', description: 'A package that allows you to use a native file explorer to pick single or multiple absolute file paths, with extension filtering support.', homepage: 'https://github.com/miguelpruivo/plugins_flutter_file_picker', repository: 'https://github.com/miguelpruivo/flutter_file_picker', authors: [], - version: '8.1.7', + version: '8.3.7', license: '''MIT License Copyright (c) 2018 Miguel Ruivo @@ -3760,13 +3759,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [] ); -/// flutter 3.27.3 +/// flutter 3.29.0 const _flutter = Package( name: 'flutter', description: 'A framework for writing Flutter applications', homepage: 'https://flutter.dev', authors: [], - version: '3.27.3', + version: '3.29.0', license: '''Copyright 2014 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -3910,13 +3909,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('lints')] ); -/// flutter_markdown 0.7.5 +/// flutter_markdown 0.7.6+2 const _flutter_markdown = Package( name: 'flutter_markdown', description: 'A Markdown renderer for Flutter. Create rich text output, including text styles, tables, links, and more, from plain text data formatted with simple Markdown tags.', repository: 'https://github.com/flutter/packages/tree/main/packages/flutter_markdown', authors: [], - version: '0.7.5', + version: '0.7.6+2', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -4474,16 +4473,16 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, - dependencies: [PackageRef('ffi'), PackageRef('flutter'), PackageRef('logging'), PackageRef('path'), PackageRef('plugin_platform_interface'), PackageRef('video_player'), PackageRef('video_player_platform_interface')] + dependencies: [PackageRef('ffi'), PackageRef('flutter'), PackageRef('logging'), PackageRef('path'), PackageRef('plugin_platform_interface'), PackageRef('video_player'), PackageRef('video_player_platform_interface'), PackageRef('path_provider'), PackageRef('http')] ); -/// glob 2.1.2 +/// glob 2.1.3 const _glob = Package( name: 'glob', description: 'A library to perform Bash-style file and directory globbing.', - repository: 'https://github.com/dart-lang/glob', + repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/glob', authors: [], - version: '2.1.2', + version: '2.1.3', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -5189,13 +5188,13 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI dependencies: [PackageRef('csslib'), PackageRef('source_span')] ); -/// http 1.2.2 +/// http 1.3.0 const _http = Package( name: 'http', description: 'A composable, multi-platform, Future-based API for HTTP requests.', repository: 'https://github.com/dart-lang/http/tree/master/pkgs/http', authors: [], - version: '1.2.2', + version: '1.3.0', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -5306,13 +5305,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('collection'), PackageRef('source_span'), PackageRef('string_scanner'), PackageRef('typed_data')] ); -/// image 4.5.2 +/// image 4.5.3 const _image = Package( name: 'image', description: 'Dart Image Library provides server and web apps the ability to load, manipulate, and save images with various image file formats.', homepage: 'https://github.com/brendan-duncan/image', authors: [], - version: '4.5.2', + version: '4.5.3', license: '''The MIT License Copyright (c) 2013-2022 Brendan Duncan. @@ -5495,13 +5494,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('meta')] ); -/// json_serializable 6.9.3 +/// json_serializable 6.9.4 const _json_serializable = Package( name: 'json_serializable', description: 'Automatically generate code for converting to and from JSON by annotating Dart classes.', repository: 'https://github.com/google/json_serializable.dart/tree/master/json_serializable', authors: [], - version: '6.9.3', + version: '6.9.4', license: '''Copyright 2017, the Dart project authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -5533,13 +5532,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('analyzer'), PackageRef('async'), PackageRef('build'), PackageRef('build_config'), PackageRef('collection'), PackageRef('dart_style'), PackageRef('json_annotation'), PackageRef('meta'), PackageRef('path'), PackageRef('pub_semver'), PackageRef('pubspec_parse'), PackageRef('source_gen'), PackageRef('source_helper')] ); -/// leak_tracker 10.0.7 +/// leak_tracker 10.0.8 const _leak_tracker = Package( name: 'leak_tracker', description: 'A framework for memory leak tracking for Dart and Flutter applications.', repository: 'https://github.com/dart-lang/leak_tracker/tree/main/pkgs/leak_tracker', authors: [], - version: '10.0.7', + version: '10.0.8', license: '''Copyright 2022, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -5572,13 +5571,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [] ); -/// leak_tracker_flutter_testing 3.0.8 +/// leak_tracker_flutter_testing 3.0.9 const _leak_tracker_flutter_testing = Package( name: 'leak_tracker_flutter_testing', description: 'An internal package to test leak tracking with Flutter.', repository: 'https://github.com/dart-lang/leak_tracker/tree/main/pkgs/leak_tracker_flutter_testing', authors: [], - version: '3.0.8', + version: '3.0.9', license: '''Copyright 2022, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -5729,45 +5728,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [] ); -/// macros 0.1.3-main.0 -const _macros = Package( - name: 'macros', - description: 'This package is for macro authors, and exposes the APIs necessary to write a macro. It exports the APIs from the private `_macros` SDK vendored package.', - repository: 'https://github.com/dart-lang/sdk/tree/main/pkg/macros', - authors: [], - version: '0.1.3-main.0', - license: '''Copyright 2024, the Dart project authors. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of Google LLC nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', - isMarkdown: false, - isSdk: false, - dependencies: [] - ); - /// markdown 7.3.0 const _markdown = Package( name: 'markdown', @@ -5807,13 +5767,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('args'), PackageRef('meta')] ); -/// matcher 0.12.16+1 +/// matcher 0.12.17 const _matcher = Package( name: 'matcher', description: 'Support for specifying test expectations via an extensible Matcher class. Also includes a number of built-in Matcher implementations for common cases.', - repository: 'https://github.com/dart-lang/matcher', + repository: 'https://github.com/dart-lang/test/tree/master/pkgs/matcher', authors: [], - version: '0.12.16+1', + version: '0.12.17', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -6365,13 +6325,13 @@ SOFTWARE.''', dependencies: [PackageRef('flutter'), PackageRef('media_kit'), PackageRef('synchronized'), PackageRef('wakelock_plus'), PackageRef('screen_brightness'), PackageRef('volume_controller'), PackageRef('universal_platform'), PackageRef('plugin_platform_interface')] ); -/// meta 1.15.0 +/// meta 1.16.0 const _meta = Package( name: 'meta', description: "Annotations used to express developer intentions that can't otherwise be deduced by statically analyzing source code.", repository: 'https://github.com/dart-lang/sdk/tree/main/pkg/meta', authors: [], - version: '1.15.0', + version: '1.16.0', license: '''Copyright 2016, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -6515,14 +6475,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('path')] ); -/// package_info_plus 8.1.3 +/// package_info_plus 8.2.1 const _package_info_plus = Package( name: 'package_info_plus', description: 'Flutter plugin for querying information about the application package, such as CFBundleVersion on iOS or versionCode on Android.', homepage: 'https://github.com/fluttercommunity/plus_plugins', repository: 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/package_info_plus/package_info_plus', authors: [], - version: '8.1.3', + version: '8.2.1', license: '''Copyright 2017 The Chromium Authors. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -6555,14 +6515,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('ffi'), PackageRef('flutter'), PackageRef('http'), PackageRef('meta'), PackageRef('path'), PackageRef('package_info_plus_platform_interface'), PackageRef('web'), PackageRef('win32'), PackageRef('clock')] ); -/// package_info_plus_platform_interface 3.0.2 +/// package_info_plus_platform_interface 3.1.0 const _package_info_plus_platform_interface = Package( name: 'package_info_plus_platform_interface', description: 'A common platform interface for the package_info_plus plugin.', homepage: 'https://github.com/fluttercommunity/plus_plugins', repository: 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/', authors: [], - version: '3.0.2', + version: '3.1.0', license: '''Copyright 2017 The Chromium Authors. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -6595,13 +6555,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('flutter'), PackageRef('meta'), PackageRef('plugin_platform_interface')] ); -/// path 1.9.0 +/// path 1.9.1 const _path = Package( name: 'path', description: 'A string-based path manipulation library. All of the path operations you know and love, with solid support for Windows, POSIX (Linux and Mac OS X), and the web.', - repository: 'https://github.com/dart-lang/path', + repository: 'https://github.com/dart-lang/core/tree/main/pkgs/path', authors: [], - version: '1.9.0', + version: '1.9.1', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -6894,13 +6854,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [] ); -/// permission_handler 11.3.1 +/// permission_handler 11.4.0 const _permission_handler = Package( name: 'permission_handler', description: 'Permission plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions.', repository: 'https://github.com/baseflow/flutter-permission-handler', authors: [], - version: '11.3.1', + version: '11.4.0', license: '''MIT License Copyright (c) 2018 Baseflow @@ -6927,13 +6887,13 @@ SOFTWARE.''', dependencies: [PackageRef('flutter'), PackageRef('meta'), PackageRef('permission_handler_android'), PackageRef('permission_handler_apple'), PackageRef('permission_handler_html'), PackageRef('permission_handler_windows'), PackageRef('permission_handler_platform_interface')] ); -/// permission_handler_android 12.0.13 +/// permission_handler_android 12.1.0 const _permission_handler_android = Package( name: 'permission_handler_android', description: 'Permission plugin for Flutter. This plugin provides the Android API to request and check permissions.', homepage: 'https://github.com/baseflow/flutter-permission-handler', authors: [], - version: '12.0.13', + version: '12.1.0', license: '''MIT License Copyright (c) 2018 Baseflow @@ -6960,13 +6920,13 @@ SOFTWARE.''', dependencies: [PackageRef('flutter'), PackageRef('permission_handler_platform_interface')] ); -/// permission_handler_apple 9.4.5 +/// permission_handler_apple 9.4.6 const _permission_handler_apple = Package( name: 'permission_handler_apple', description: 'Permission plugin for Flutter. This plugin provides the iOS API to request and check permissions.', repository: 'https://github.com/baseflow/flutter-permission-handler', authors: [], - version: '9.4.5', + version: '9.4.6', license: '''MIT License Copyright (c) 2018 Baseflow @@ -7026,13 +6986,13 @@ SOFTWARE.''', dependencies: [PackageRef('flutter'), PackageRef('permission_handler_platform_interface'), PackageRef('web')] ); -/// permission_handler_platform_interface 4.2.3 +/// permission_handler_platform_interface 4.3.0 const _permission_handler_platform_interface = Package( name: 'permission_handler_platform_interface', description: 'A common platform interface for the permission_handler plugin.', homepage: 'https://github.com/baseflow/flutter-permission-handler/tree/master/permission_handler_platform_interface', authors: [], - version: '4.2.3', + version: '4.3.0', license: '''MIT License Copyright (c) 2018 Baseflow @@ -7092,17 +7052,17 @@ SOFTWARE.''', dependencies: [PackageRef('flutter'), PackageRef('permission_handler_platform_interface')] ); -/// petitparser 6.0.2 +/// petitparser 6.1.0 const _petitparser = Package( name: 'petitparser', description: 'A dynamic parser framework to build efficient grammars and parsers quickly.', homepage: 'https://petitparser.github.io', repository: 'https://github.com/petitparser/dart-petitparser', authors: [], - version: '6.0.2', + version: '6.1.0', license: '''The MIT License -Copyright (c) 2006-2023 Lukas Renggli. +Copyright (c) 2006-2025 Lukas Renggli. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy @@ -7124,7 +7084,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, - dependencies: [PackageRef('meta')] + dependencies: [PackageRef('meta'), PackageRef('collection')] ); /// platform 3.1.6 @@ -7941,13 +7901,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('async'), PackageRef('collection'), PackageRef('http_parser'), PackageRef('path'), PackageRef('stack_trace'), PackageRef('stream_channel')] ); -/// shelf_web_socket 2.0.1 +/// shelf_web_socket 3.0.0 const _shelf_web_socket = Package( name: 'shelf_web_socket', description: 'A shelf handler that wires up a listener for every connection.', repository: 'https://github.com/dart-lang/shelf/tree/master/pkgs/shelf_web_socket', authors: [], - version: '2.0.1', + version: '3.0.0', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -8232,13 +8192,13 @@ const _source_helper = Package( dependencies: [PackageRef('analyzer'), PackageRef('collection'), PackageRef('source_gen')] ); -/// source_span 1.10.0 +/// source_span 1.10.1 const _source_span = Package( name: 'source_span', description: 'Provides a standard representation for source code locations and spans.', - repository: 'https://github.com/dart-lang/source_span', + repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/source_span', authors: [], - version: '1.10.0', + version: '1.10.1', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -8305,13 +8265,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [] ); -/// stack_trace 1.12.0 +/// stack_trace 1.12.1 const _stack_trace = Package( name: 'stack_trace', description: 'A package for manipulating stack traces and printing them readably.', - repository: 'https://github.com/dart-lang/stack_trace', + repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/stack_trace', authors: [], - version: '1.12.0', + version: '1.12.1', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -8344,13 +8304,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('path')] ); -/// stream_channel 2.1.2 +/// stream_channel 2.1.4 const _stream_channel = Package( name: 'stream_channel', description: 'An abstraction for two-way communication channels based on the Dart Stream class.', - repository: 'https://github.com/dart-lang/stream_channel', + repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/stream_channel', authors: [], - version: '2.1.2', + version: '2.1.4', license: '''Copyright 2015, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -8422,13 +8382,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [] ); -/// string_scanner 1.3.0 +/// string_scanner 1.4.1 const _string_scanner = Package( name: 'string_scanner', description: 'A class for parsing strings using a sequence of patterns.', - repository: 'https://github.com/dart-lang/string_scanner', + repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/string_scanner', authors: [], - version: '1.3.0', + version: '1.4.1', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -8461,13 +8421,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('source_span')] ); -/// synchronized 3.3.0+3 +/// synchronized 3.3.1 const _synchronized = Package( name: 'synchronized', description: 'Lock mechanism to prevent concurrent access to asynchronous code.', homepage: 'https://github.com/tekartik/synchronized.dart/tree/master/synchronized', authors: [], - version: '3.3.0+3', + version: '3.3.1', license: '''MIT License Copyright (c) 2016, Alexandre Roux Tekartik. @@ -8494,13 +8454,13 @@ SOFTWARE.''', dependencies: [] ); -/// term_glyph 1.2.1 +/// term_glyph 1.2.2 const _term_glyph = Package( name: 'term_glyph', description: 'Useful Unicode glyphs and ASCII substitutes.', - repository: 'https://github.com/dart-lang/term_glyph', + repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/term_glyph', authors: [], - version: '1.2.1', + version: '1.2.2', license: '''Copyright 2017, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -8533,13 +8493,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [] ); -/// test_api 0.7.3 +/// test_api 0.7.4 const _test_api = Package( name: 'test_api', description: 'The user facing API for structuring Dart tests and checking expectations.', repository: 'https://github.com/dart-lang/test/tree/master/pkgs/test_api', authors: [], - version: '0.7.3', + version: '0.7.4', license: '''Copyright 2018, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -9285,13 +9245,13 @@ freely, subject to the following restrictions: dependencies: [] ); -/// video_player 2.9.2 +/// video_player 2.9.3 const _video_player = Package( name: 'video_player', description: 'Flutter plugin for displaying inline video with other Flutter widgets on Android, iOS, and web.', repository: 'https://github.com/flutter/packages/tree/main/packages/video_player/video_player', authors: [], - version: '2.9.2', + version: '2.9.3', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -9359,13 +9319,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('flutter'), PackageRef('video_player_platform_interface')] ); -/// video_player_avfoundation 2.6.7 +/// video_player_avfoundation 2.7.0 const _video_player_avfoundation = Package( name: 'video_player_avfoundation', description: 'iOS and macOS implementation of the video_player plugin.', repository: 'https://github.com/flutter/packages/tree/main/packages/video_player/video_player_avfoundation', authors: [], - version: '2.6.7', + version: '2.7.0', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -9396,13 +9356,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('flutter'), PackageRef('video_player_platform_interface')] ); -/// video_player_platform_interface 6.2.3 +/// video_player_platform_interface 6.3.0 const _video_player_platform_interface = Package( name: 'video_player_platform_interface', description: 'A common platform interface for the video_player plugin.', repository: 'https://github.com/flutter/packages/tree/main/packages/video_player/video_player_platform_interface', authors: [], - version: '6.2.3', + version: '6.3.0', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -9433,13 +9393,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('flutter'), PackageRef('plugin_platform_interface')] ); -/// video_player_web 2.3.3 +/// video_player_web 2.3.4 const _video_player_web = Package( name: 'video_player_web', description: 'Web platform implementation of video_player.', repository: 'https://github.com/flutter/packages/tree/main/packages/video_player/video_player_web', authors: [], - version: '2.3.3', + version: '2.3.4', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -9470,13 +9430,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('flutter'), PackageRef('video_player_platform_interface'), PackageRef('web')] ); -/// vm_service 14.3.0 +/// vm_service 14.3.1 const _vm_service = Package( name: 'vm_service', description: 'A library to communicate with a service implementing the Dart VM service protocol.', repository: 'https://github.com/dart-lang/sdk/tree/main/pkg/vm_service', authors: [], - version: '14.3.0', + version: '14.3.1', license: '''Copyright 2015, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -9740,13 +9700,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('web')] ); -/// web_socket_channel 3.0.1 +/// web_socket_channel 3.0.2 const _web_socket_channel = Package( name: 'web_socket_channel', description: 'StreamChannel wrappers for WebSockets. Provides a cross-platform WebSocketChannel API, a cross-platform implementation of that API that communicates over an underlying StreamChannel.', - repository: 'https://github.com/dart-lang/web_socket_channel', + repository: 'https://github.com/dart-lang/http/tree/master/pkgs/web_socket_channel', authors: [], - version: '3.0.1', + version: '3.0.2', license: '''Copyright 2016, the Dart project authors. Redistribution and use in source and binary forms, with or without @@ -9820,7 +9780,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', dependencies: [PackageRef('dio'), PackageRef('xml'), PackageRef('convert')] ); -/// win32 5.10.0 +/// win32 5.11.0 const _win32 = Package( name: 'win32', description: '''Access common Win32 APIs directly from Dart using FFI — no C required! @@ -9828,7 +9788,7 @@ const _win32 = Package( homepage: 'https://win32.pub', repository: 'https://github.com/halildurmus/win32', authors: [], - version: '5.10.0', + version: '5.11.0', license: '''BSD 3-Clause License Copyright (c) 2024, Halil Durmus diff --git a/lib/pages/audio_track_list.dart b/lib/pages/audio_track_list.dart index 3b190b5..128c3e6 100644 --- a/lib/pages/audio_track_list.dart +++ b/lib/pages/audio_track_list.dart @@ -46,6 +46,9 @@ class AudioTrackList extends HookWidget { Theme.of(context).colorScheme.onSurfaceVariant, ), ), + tileColor: (player as MediaKitPlayer).audio == audio + ? Theme.of(context).hoverColor + : null, onTap: () { logger( 'Set audio track: ${audio.title ?? audio.language ?? audio.id}'); @@ -78,6 +81,8 @@ class AudioTrackList extends HookWidget { color: Theme.of(context).colorScheme.onSurfaceVariant, ), ), + tileColor: + activeAudioTracks.isEmpty ? Theme.of(context).hoverColor : null, onTap: () { logger('Set audio track: ${t.off}'); (player as FvpPlayer).controller.setAudioTracks([]); @@ -102,6 +107,9 @@ class AudioTrackList extends HookWidget { color: Theme.of(context).colorScheme.onSurfaceVariant, ), ), + tileColor: activeAudioTracks.contains(audios.indexOf(audio)) + ? Theme.of(context).hoverColor + : null, onTap: () { logger( 'Set audio track: ${audio.metadata['title'] ?? audio.metadata['language'] ?? audios.indexOf(audio).toString()}'); diff --git a/lib/pages/dialog/show_orientation_dialog.dart b/lib/pages/dialog/show_orientation_dialog.dart new file mode 100644 index 0000000..7af901d --- /dev/null +++ b/lib/pages/dialog/show_orientation_dialog.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_zustand/flutter_zustand.dart'; +import 'package:iris/models/store/app_state.dart'; +import 'package:iris/store/use_app_store.dart'; +import 'package:iris/utils/get_localizations.dart'; + +Future showOrientationDialog(BuildContext context) async => + await showDialog( + context: context, + builder: (context) => const OrientationDialog(), + ); + +class OrientationDialog extends HookWidget { + const OrientationDialog({super.key}); + + @override + Widget build(BuildContext context) { + final t = getLocalizations(context); + final orientation = + useAppStore().select(context, (state) => state.orientation); + + void updateOrientation(ScreenOrientation orientation) { + useAppStore().updateOrientation(orientation); + Navigator.pop(context); + } + + final orientationMap = { + ScreenOrientation.device: t.device, + ScreenOrientation.landscape: t.landscape, + ScreenOrientation.portrait: t.portrait, + }; + + return AlertDialog( + title: Text(t.screen_orientation), + content: SingleChildScrollView( + child: Column( + children: ScreenOrientation.values + .map( + (e) => ListTile( + title: Text(orientationMap[e] ?? e.name), + leading: Radio( + value: e, + groupValue: orientation, + onChanged: (_) => updateOrientation(e), + ), + onTap: () => updateOrientation(e), + ), + ) + .toList(), + )), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context, 'Cancel'), + child: Text(t.cancel), + ), + ], + ); + } +} diff --git a/lib/pages/dialog/show_rate_dialog.dart b/lib/pages/dialog/show_rate_dialog.dart new file mode 100644 index 0000000..aae7e7f --- /dev/null +++ b/lib/pages/dialog/show_rate_dialog.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_zustand/flutter_zustand.dart'; +import 'package:iris/store/use_app_store.dart'; +import 'package:iris/utils/get_localizations.dart'; + +Future showRateDialog(BuildContext context) async => + await showDialog( + context: context, + builder: (context) => const RateDialog(), + ); + +class RateDialog extends HookWidget { + const RateDialog({super.key}); + + @override + Widget build(BuildContext context) { + final t = getLocalizations(context); + final rate = useAppStore().select(context, (state) => state.rate); + + void updateRate(double rate) { + useAppStore().updateRate(rate); + Navigator.pop(context); + } + + return AlertDialog( + title: Text(t.playback_speed), + content: SingleChildScrollView( + child: Column( + children: [ + 0.25, + 0.5, + 0.75, + 1.0, + 1.25, + 1.5, + 1.75, + 2.0, + 3.0, + 4.0, + 5.0, + ] + .map( + (item) => ListTile( + title: Text('${item}X'), + leading: Radio( + value: item, + groupValue: rate, + onChanged: (_) => updateRate(item), + ), + onTap: () => updateRate(item), + ), + ) + .toList(), + ), + ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context, 'Cancel'), + child: Text(t.cancel), + ), + ], + ); + } +} diff --git a/lib/pages/player/control_bar.dart b/lib/pages/player/control_bar.dart index 0af74ff..489d505 100644 --- a/lib/pages/player/control_bar.dart +++ b/lib/pages/player/control_bar.dart @@ -6,6 +6,7 @@ import 'package:iris/models/player.dart'; import 'package:iris/models/storages/local.dart'; import 'package:iris/models/store/app_state.dart'; import 'package:iris/pages/dialog/show_open_link_dialog.dart'; +import 'package:iris/pages/dialog/show_rate_dialog.dart'; import 'package:iris/pages/player/control_bar_slider.dart'; import 'package:iris/pages/history.dart'; import 'package:iris/pages/show_open_link_bottom_sheet.dart'; @@ -21,6 +22,7 @@ import 'package:iris/utils/resize_window.dart'; import 'package:iris/widgets/dark_theme.dart'; import 'package:iris/widgets/popup.dart'; import 'package:iris/pages/storage/storages.dart'; +import 'package:iris/widgets/custom_menu.dart'; import 'package:window_manager/window_manager.dart'; class ControlBar extends HookWidget { @@ -39,6 +41,7 @@ class ControlBar extends HookWidget { Widget build(BuildContext context) { final t = getLocalizations(context); + final rate = useAppStore().select(context, (state) => state.rate); final volume = useAppStore().select(context, (state) => state.volume); final isMuted = useAppStore().select(context, (state) => state.isMuted); final int playQueueLength = @@ -219,6 +222,66 @@ class ControlBar extends HookWidget { }, ), ), + if (MediaQuery.of(context).size.width > 600) + Builder( + builder: (context) => DarkTheme( + child: Tooltip( + message: t.playback_speed, + child: TextButton( + child: Text( + '${rate}X', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Theme.of(context).brightness == + Brightness.dark + ? Theme.of(context).colorScheme.onSurface + : Theme.of(context).colorScheme.surface, + ), + ), + onPressed: () => showControlForHover( + showCustomMenu( + context, + items: [ + 0.25, + 0.5, + 0.75, + 1.0, + 1.25, + 1.5, + 1.75, + 2.0, + 3.0, + 4.0, + 5.0, + ] + .map( + (item) => PopupMenuItem( + child: Text( + '${item}X', + style: TextStyle( + color: item == rate + ? Theme.of(context) + .colorScheme + .primary + : null, + fontWeight: item == rate + ? FontWeight.bold + : FontWeight.w100, + ), + ), + onTap: () async { + showControl(); + useAppStore().updateRate(item); + }, + ), + ) + .toList(), + ), + ), + ), + ), + ), + ), if (MediaQuery.of(context).size.width < 600) Builder( builder: (context) => DarkTheme( @@ -520,6 +583,19 @@ class ControlBar extends HookWidget { useAppStore().toggleFit(); }, ), + if (MediaQuery.of(context).size.width <= 460) + PopupMenuItem( + child: ListTile( + mouseCursor: SystemMouseCursors.click, + leading: const Icon( + Icons.speed_rounded, + size: 20, + ), + title: Text('${t.playback_speed}: ${rate}X'), + ), + onTap: () => + showControlForHover(showRateDialog(context)), + ), if (MediaQuery.of(context).size.width < 420) PopupMenuItem( child: ListTile( diff --git a/lib/pages/player/iris_player.dart b/lib/pages/player/iris_player.dart index 261e461..9813773 100644 --- a/lib/pages/player/iris_player.dart +++ b/lib/pages/player/iris_player.dart @@ -9,6 +9,7 @@ import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/hooks/use_app_lifecycle.dart'; import 'package:iris/hooks/use_brightness.dart'; import 'package:iris/hooks/use_cover.dart'; +import 'package:iris/hooks/use_orientation.dart'; import 'package:iris/hooks/use_volume.dart'; import 'package:iris/info.dart'; import 'package:iris/models/file.dart'; @@ -56,6 +57,7 @@ class IrisPlayer extends HookWidget { final MediaPlayer player = playerHooks(context); useAppLifecycle(player); + useOrientation(context, player); final cover = useCover(context); final isHover = useState(false); @@ -77,6 +79,7 @@ class IrisPlayer extends HookWidget { final volume = useVolume(isRightGesture.value); final t = getLocalizations(context); + final rate = useAppStore().select(context, (state) => state.rate); final shuffle = useAppStore().select(context, (state) => state.shuffle); final fit = useAppStore().select(context, (state) => state.fit); final autoResize = @@ -404,6 +407,12 @@ class IrisPlayer extends HookWidget { showControl(); await useUiStore().toggleIsAlwaysOnTop(); break; + case LogicalKeyboardKey.equal: + await player.stepForward(); + break; + case LogicalKeyboardKey.minus: + await player.stepBackward(); + break; default: break; } @@ -596,29 +605,33 @@ class IrisPlayer extends HookWidget { onLongPressStart: (details) { if (isTouch.value && player.isPlaying == true) { isLongPress.value = true; - player.updateRate(2.0); + useAppStore().updateRate(2.0); } }, onLongPressMoveUpdate: (details) { int fast = (details.offsetFromOrigin.dx / 50).toInt(); if (fast >= 1) { - player + useAppStore() .updateRate(fast > 4 ? 5.0 : (1 + fast).toDouble()); } else if (fast <= -1) { - player.updateRate(fast < -3 + useAppStore().updateRate(fast < -3 ? 0.25 : (1 - 0.25 * fast.abs()).toDouble()); } }, onLongPressEnd: (details) { - player.updateRate(1.0); - isTouch.value = false; + if (isLongPress.value) { + useAppStore().updateRate(1.0); + } isLongPress.value = false; + isTouch.value = false; }, onLongPressCancel: () { - player.updateRate(1.0); - isTouch.value = false; + if (isLongPress.value) { + useAppStore().updateRate(1.0); + } isLongPress.value = false; + isTouch.value = false; }, onPanStart: (details) async { if (isDesktop && @@ -768,7 +781,7 @@ class IrisPlayer extends HookWidget { bottom: 0, child: Audio(cover: cover)), // 播放速度 - if (player.rate != 1.0) + if (rate != 1.0 && isLongPress.value) Positioned( left: 0, top: 0, @@ -795,7 +808,7 @@ class IrisPlayer extends HookWidget { ), const SizedBox(width: 10), Text( - player.rate.toString(), + rate.toString(), style: const TextStyle( color: Colors.white, fontSize: 20, diff --git a/lib/pages/player/volume_slider.dart b/lib/pages/player/volume_slider.dart index f9f25b8..a994813 100644 --- a/lib/pages/player/volume_slider.dart +++ b/lib/pages/player/volume_slider.dart @@ -13,34 +13,36 @@ class VolumeSlider extends HookWidget { final volume = useAppStore().select(context, (state) => state.volume); final isMuted = useAppStore().select(context, (state) => state.isMuted); - return SizedBox( - width: 128, - child: SliderTheme( - data: SliderTheme.of(context).copyWith( - thumbColor: Theme.of(context).colorScheme.onSurfaceVariant, - thumbShape: RoundSliderThumbShape( - enabledThumbRadius: 5.6, + return ExcludeFocus( + child: SizedBox( + width: 128, + child: SliderTheme( + data: SliderTheme.of(context).copyWith( + thumbColor: Theme.of(context).colorScheme.onSurfaceVariant, + thumbShape: RoundSliderThumbShape( + enabledThumbRadius: 5.6, + ), + disabledThumbColor: + Theme.of(context).colorScheme.onSurfaceVariant.withAlpha(222), + overlayShape: const RoundSliderOverlayShape( + overlayRadius: 4, + ), + activeTrackColor: Theme.of(context).colorScheme.onSurfaceVariant, + inactiveTrackColor: + Theme.of(context).colorScheme.onSurfaceVariant.withAlpha(99), + trackHeight: 3.6, ), - disabledThumbColor: - Theme.of(context).colorScheme.onSurfaceVariant.withAlpha(222), - overlayShape: const RoundSliderOverlayShape( - overlayRadius: 4, + child: Slider( + value: isMuted ? 0 : volume.toDouble(), + onChanged: (value) { + showControl(); + useAppStore().updateMute(false); + useAppStore().updateVolume((value).toInt()); + }, + min: 0, + max: 100, + activeColor: Theme.of(context).colorScheme.onSurfaceVariant, ), - activeTrackColor: Theme.of(context).colorScheme.onSurfaceVariant, - inactiveTrackColor: - Theme.of(context).colorScheme.onSurfaceVariant.withAlpha(99), - trackHeight: 3.6, - ), - child: Slider( - value: isMuted ? 0 : volume.toDouble(), - onChanged: (value) { - showControl(); - useAppStore().updateMute(false); - useAppStore().updateVolume((value).toInt()); - }, - min: 0, - max: 100, - activeColor: Theme.of(context).colorScheme.onSurfaceVariant, ), ), ); diff --git a/lib/pages/settings/play.dart b/lib/pages/settings/play.dart index 5a36c17..47ad7bb 100644 --- a/lib/pages/settings/play.dart +++ b/lib/pages/settings/play.dart @@ -1,7 +1,10 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/store/app_state.dart'; +import 'package:iris/pages/dialog/show_orientation_dialog.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:iris/utils/is_desktop.dart'; @@ -19,6 +22,14 @@ class Play extends HookWidget { useAppStore().select(context, (state) => state.alwaysPlayFromBeginning); final playerBackend = useAppStore().select(context, (state) => state.playerBackend); + final orientation = + useAppStore().select(context, (state) => state.orientation); + + final orientationMap = { + ScreenOrientation.device: t.device, + ScreenOrientation.landscape: t.landscape, + ScreenOrientation.portrait: t.portrait, + }; return SingleChildScrollView( child: Column( @@ -63,6 +74,13 @@ class Play extends HookWidget { onChanged: (_) => useAppStore().toggleAlwaysPlayFromBeginning(), ), ), + if (Platform.isAndroid || Platform.isIOS) + ListTile( + leading: const Icon(Icons.screen_rotation_rounded), + title: Text(t.screen_orientation), + subtitle: Text(orientationMap[orientation] ?? orientation.name), + onTap: () => showOrientationDialog(context), + ) ], ), ); diff --git a/lib/pages/subtitle_list.dart b/lib/pages/subtitle_list.dart index 44be22c..741363b 100644 --- a/lib/pages/subtitle_list.dart +++ b/lib/pages/subtitle_list.dart @@ -44,6 +44,9 @@ class SubtitleList extends HookWidget { Theme.of(context).colorScheme.onSurfaceVariant, ), ), + tileColor: (player as MediaKitPlayer).subtitle == subtitle + ? Theme.of(context).hoverColor + : null, onTap: () { logger( 'Set subtitle: ${subtitle.title ?? subtitle.language ?? subtitle.id}'); @@ -102,6 +105,10 @@ class SubtitleList extends HookWidget { color: Theme.of(context).colorScheme.onSurfaceVariant, ), ), + tileColor: (player as FvpPlayer).externalSubtitle.value == null && + activeSubtitles.isEmpty + ? Theme.of(context).hoverColor + : null, onTap: () { logger('Set subtitle: ${t.off}'); (player as FvpPlayer).externalSubtitle.value = null; @@ -129,6 +136,10 @@ class SubtitleList extends HookWidget { color: Theme.of(context).colorScheme.onSurfaceVariant, ), ), + tileColor: (player as FvpPlayer).externalSubtitle.value == null && + activeSubtitles.contains(subtitles.indexOf(subtitle)) + ? Theme.of(context).hoverColor + : null, onTap: () { logger( 'Set subtitle: ${subtitle.metadata['title'] ?? subtitle.metadata['language'] ?? subtitle.index.toString()}'); @@ -165,6 +176,12 @@ class SubtitleList extends HookWidget { Theme.of(context).colorScheme.onSurfaceVariant, ), ), + tileColor: (player as FvpPlayer).externalSubtitle.value == + (player as FvpPlayer) + .externalSubtitles + .indexOf(subtitle) + ? Theme.of(context).hoverColor + : null, onTap: () { logger('Set external subtitle: ${subtitle.name}'); (player as FvpPlayer).externalSubtitle.value = diff --git a/lib/store/use_app_store.dart b/lib/store/use_app_store.dart index 4d48f64..859ed4b 100644 --- a/lib/store/use_app_store.dart +++ b/lib/store/use_app_store.dart @@ -62,6 +62,12 @@ class AppStore extends PersistentStore { await save(state); } + Future updateRate(double value) async { + logger('updateRate: $value'); + set(state.copyWith(rate: value)); + await save(state); + } + Future updateVolume(int volume) async { set(state.copyWith( volume: volume < 0 @@ -123,6 +129,11 @@ class AppStore extends PersistentStore { await save(state); } + Future updateOrientation(ScreenOrientation orientation) async { + set(state.copyWith(orientation: orientation)); + await save(state); + } + @override Future load() async { logger('Loading AppState'); diff --git a/lib/widgets/custom_menu.dart b/lib/widgets/custom_menu.dart new file mode 100644 index 0000000..ec65a1f --- /dev/null +++ b/lib/widgets/custom_menu.dart @@ -0,0 +1,24 @@ +import 'dart:math'; +import 'package:flutter/material.dart'; +import 'package:popover/popover.dart'; + +Future showCustomMenu( + BuildContext context, { + required List items, + double? width = 128, +}) async => + showPopover( + context: context, + bodyBuilder: (context) => SingleChildScrollView( + child: Column(children: items), + ), + width: width, + height: min(MediaQuery.of(context).size.height * 0.75, + items.length * kMinInteractiveDimension), + radius: 16, + arrowHeight: 0, + arrowWidth: 0, + backgroundColor: + Theme.of(context).colorScheme.surfaceDim.withValues(alpha: 0.9), + barrierColor: Colors.transparent, + ); diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 567a35b..11e7c4e 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -10,6 +10,7 @@ import desktop_drop import device_info_plus import disks_desktop import dynamic_color +import file_picker import flutter_secure_storage_macos import flutter_volume_controller import fvp @@ -31,6 +32,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) DisksDesktopPlugin.register(with: registry.registrar(forPlugin: "DisksDesktopPlugin")) DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) + FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) FlutterVolumeControllerPlugin.register(with: registry.registrar(forPlugin: "FlutterVolumeControllerPlugin")) FvpPlugin.register(with: registry.registrar(forPlugin: "FvpPlugin")) diff --git a/pubspec.lock b/pubspec.lock index a99c607..ef29814 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,23 +5,18 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "03f6da266a27a4538a69295ec142cb5717d7d4e5727b84658b63e1e1509bac9c" + sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57 url: "https://pub.dev" source: hosted - version: "79.0.0" - _macros: - dependency: transitive - description: dart - source: sdk - version: "0.3.3" + version: "80.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: c9040fc56483c22a5e04a9f6a251313118b1a3c42423770623128fa484115643 + sha256: "192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e" url: "https://pub.dev" source: hosted - version: "7.2.0" + version: "7.3.0" android_x_storage: dependency: "direct main" description: @@ -34,10 +29,10 @@ packages: dependency: "direct main" description: name: app_links - sha256: "433df2e61b10519407475d7f69e470789d23d593f28224c38ba1068597be7950" + sha256: "85ed8fc1d25a76475914fff28cc994653bd900bc2c26e4b57a49e097febb54ba" url: "https://pub.dev" source: hosted - version: "6.3.3" + version: "6.4.0" app_links_linux: dependency: transitive description: @@ -66,10 +61,10 @@ packages: dependency: transitive description: name: archive - sha256: "6199c74e3db4fbfbd04f66d739e72fe11c8a8957d5f219f1f4482dbde6420b5a" + sha256: "528579c7e4579719f04b21eeeeddfd73a18b31dabc22766893b7d1be7f49b967" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.0.3" args: dependency: transitive description: @@ -82,18 +77,18 @@ packages: dependency: transitive description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.12.0" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" build: dependency: transitive description: @@ -114,26 +109,26 @@ packages: dependency: transitive description: name: build_daemon - sha256: "294a2edaf4814a378725bfe6358210196f5ea37af89ecd81bfa32960113d4948" + sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa" url: "https://pub.dev" source: hosted - version: "4.0.3" + version: "4.0.4" build_resolvers: dependency: transitive description: name: build_resolvers - sha256: "99d3980049739a985cf9b21f30881f46db3ebc62c5b8d5e60e27440876b1ba1e" + sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 url: "https://pub.dev" source: hosted - version: "2.4.3" + version: "2.4.4" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573" + sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99" url: "https://pub.dev" source: hosted - version: "2.4.14" + version: "2.4.15" build_runner_core: dependency: transitive description: @@ -162,10 +157,10 @@ packages: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" checked_yaml: dependency: transitive description: @@ -178,10 +173,10 @@ packages: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" code_builder: dependency: transitive description: @@ -194,10 +189,10 @@ packages: dependency: "direct main" description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.19.1" convert: dependency: transitive description: @@ -258,10 +253,10 @@ packages: dependency: transitive description: name: dbus - sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" + sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" url: "https://pub.dev" source: hosted - version: "0.7.10" + version: "0.7.11" desktop_drop: dependency: "direct main" description: @@ -274,10 +269,10 @@ packages: dependency: "direct main" description: name: device_info_plus - sha256: b37d37c2f912ad4e8ec694187de87d05de2a3cb82b465ff1f65f65a2d05de544 + sha256: "72d146c6d7098689ff5c5f66bcf593ac11efc530095385356e131070333e64da" url: "https://pub.dev" source: hosted - version: "11.2.1" + version: "11.3.0" device_info_plus_platform_interface: dependency: transitive description: @@ -290,18 +285,18 @@ packages: dependency: transitive description: name: dio - sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260" + sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" url: "https://pub.dev" source: hosted - version: "5.7.0" + version: "5.8.0+1" dio_web_adapter: dependency: transitive description: name: dio_web_adapter - sha256: "33259a9276d6cea88774a0000cfae0d861003497755969c92faa223108620dc8" + sha256: e485c7a39ff2b384fa1d7e09b4e25f755804de8384358049124830b04fc4f93a url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" disks_desktop: dependency: "direct main" description: @@ -330,18 +325,18 @@ packages: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" ffi: dependency: transitive description: name: ffi - sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" file: dependency: transitive description: @@ -354,10 +349,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: c904b4ab56d53385563c7c39d8e9fa9af086f91495dfc48717ad84a42c3cf204 + sha256: ab13ae8ef5580a411c458d6207b6774a6c237d77ac37011b13994879f68a8810 url: "https://pub.dev" source: hosted - version: "8.1.7" + version: "8.3.7" fixnum: dependency: transitive description: @@ -404,10 +399,10 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: e37f4c69a07b07bb92622ef6b131a53c9aae48f64b176340af9e8e5238718487 + sha256: e7bbc718adc9476aa14cfddc1ef048d2e21e4e8f18311aaac723266db9f9e7b5 url: "https://pub.dev" source: hosted - version: "0.7.5" + version: "0.7.6+2" flutter_oss_licenses: dependency: "direct dev" description: @@ -527,7 +522,7 @@ packages: description: path: "." ref: master - resolved-ref: "01c745657c72324f8da9941e56c61f3f35fc3bd8" + resolved-ref: cbfb02ddab90a6e2182e71b93b7d6992d965ce3c url: "https://github.com/wang-bin/fvp" source: git version: "0.29.0" @@ -535,10 +530,10 @@ packages: dependency: transitive description: name: glob - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" google_fonts: dependency: "direct main" description: @@ -575,10 +570,10 @@ packages: dependency: "direct main" description: name: http - sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 + sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "1.3.0" http_multi_server: dependency: transitive description: @@ -599,10 +594,10 @@ packages: dependency: transitive description: name: image - sha256: "8346ad4b5173924b5ddddab782fc7d8a6300178c8b1dc427775405a01701c4a6" + sha256: "13d3349ace88f12f4a0d175eb5c12dcdd39d35c4c109a8a13dfeb6d0bd9e31c3" url: "https://pub.dev" source: hosted - version: "4.5.2" + version: "4.5.3" intl: dependency: "direct main" description: @@ -639,26 +634,26 @@ packages: dependency: "direct dev" description: name: json_serializable - sha256: b0a98230538fe5d0b60a22fb6bf1b6cb03471b53e3324ff6069c591679dd59c9 + sha256: "81f04dee10969f89f604e1249382d46b97a1ccad53872875369622b5bfc9e58a" url: "https://pub.dev" source: hosted - version: "6.9.3" + version: "6.9.4" leak_tracker: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "10.0.8" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.9" leak_tracker_testing: dependency: transitive description: @@ -683,14 +678,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" - macros: - dependency: transitive - description: - name: macros - sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656" - url: "https://pub.dev" - source: hosted - version: "0.1.3-main.0" markdown: dependency: transitive description: @@ -703,10 +690,10 @@ packages: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.16+1" + version: "0.12.17" material_color_utilities: dependency: transitive description: @@ -791,10 +778,10 @@ packages: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.16.0" mime: dependency: transitive description: @@ -823,26 +810,26 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: "739e0a5c3c4055152520fa321d0645ee98e932718b4c8efeeb51451968fe0790" + sha256: "67eae327b1b0faf761964a1d2e5d323c797f3799db0e85aa232db8d9e922bc35" url: "https://pub.dev" source: hosted - version: "8.1.3" + version: "8.2.1" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: a5ef9986efc7bf772f2696183a3992615baa76c1ffb1189318dd8803778fb05b + sha256: "205ec83335c2ab9107bbba3f8997f9356d72ca3c715d2f038fc773d0366b4c76" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.1.0" path: dependency: "direct main" description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" path_provider: dependency: "direct main" description: @@ -903,26 +890,26 @@ packages: dependency: "direct main" description: name: permission_handler - sha256: "18bf33f7fefbd812f37e72091a15575e72d5318854877e0e4035a24ac1113ecb" + sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" url: "https://pub.dev" source: hosted - version: "11.3.1" + version: "11.4.0" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: "71bbecfee799e65aff7c744761a57e817e73b738fedf62ab7afd5593da21f9f1" + sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc url: "https://pub.dev" source: hosted - version: "12.0.13" + version: "12.1.0" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0 + sha256: f84a188e79a35c687c132a0a0556c254747a08561e99ab933f12f6ca71ef3c98 url: "https://pub.dev" source: hosted - version: "9.4.5" + version: "9.4.6" permission_handler_html: dependency: transitive description: @@ -935,10 +922,10 @@ packages: dependency: transitive description: name: permission_handler_platform_interface - sha256: e9c8eadee926c4532d0305dff94b85bf961f16759c3af791486613152af4b4f9 + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 url: "https://pub.dev" source: hosted - version: "4.2.3" + version: "4.3.0" permission_handler_windows: dependency: transitive description: @@ -951,10 +938,10 @@ packages: dependency: transitive description: name: petitparser - sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "6.1.0" platform: dependency: transitive description: @@ -1143,10 +1130,10 @@ packages: dependency: transitive description: name: shelf_web_socket - sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.0" sky_engine: dependency: transitive description: flutter @@ -1172,10 +1159,10 @@ packages: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.10.1" sprintf: dependency: transitive description: @@ -1188,18 +1175,18 @@ packages: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" stream_transform: dependency: transitive description: @@ -1212,34 +1199,34 @@ packages: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.1" synchronized: dependency: transitive description: name: synchronized - sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" + sha256: "0669c70faae6270521ee4f05bffd2919892d42d1276e6c495be80174b6bc0ef6" url: "https://pub.dev" source: hosted - version: "3.3.0+3" + version: "3.3.1" term_glyph: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" test_api: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.4" timing: dependency: transitive description: @@ -1356,10 +1343,10 @@ packages: dependency: "direct main" description: name: video_player - sha256: "4a8c3492d734f7c39c2588a3206707a05ee80cef52e8c7f3b2078d430c84bc17" + sha256: "48941c8b05732f9582116b1c01850b74dbee1d8520cd7e34ad4609d6df666845" url: "https://pub.dev" source: hosted - version: "2.9.2" + version: "2.9.3" video_player_android: dependency: transitive description: @@ -1372,34 +1359,34 @@ packages: dependency: transitive description: name: video_player_avfoundation - sha256: "8a4e73a3faf2b13512978a43cf1cdda66feeeb900a0527f1fbfd7b19cf3458d3" + sha256: "84b4752745eeccb6e75865c9aab39b3d28eb27ba5726d352d45db8297fbd75bc" url: "https://pub.dev" source: hosted - version: "2.6.7" + version: "2.7.0" video_player_platform_interface: dependency: transitive description: name: video_player_platform_interface - sha256: "229d7642ccd9f3dc4aba169609dd6b5f3f443bb4cc15b82f7785fcada5af9bbb" + sha256: df534476c341ab2c6a835078066fc681b8265048addd853a1e3c78740316a844 url: "https://pub.dev" source: hosted - version: "6.2.3" + version: "6.3.0" video_player_web: dependency: transitive description: name: video_player_web - sha256: "881b375a934d8ebf868c7fb1423b2bfaa393a0a265fa3f733079a86536064a10" + sha256: "3ef40ea6d72434edbfdba4624b90fd3a80a0740d260667d91e7ecd2d79e13476" url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "2.3.4" vm_service: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.3.1" volume_controller: dependency: transitive description: @@ -1452,10 +1439,10 @@ packages: dependency: transitive description: name: web_socket_channel - sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" + sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" webdav_client: dependency: "direct main" description: @@ -1468,10 +1455,10 @@ packages: dependency: transitive description: name: win32 - sha256: "154360849a56b7b67331c21f09a386562d88903f90a1099c5987afc1912e1f29" + sha256: b89e6e24d1454e149ab20fbb225af58660f0c0bf4475544650700d8e2da54aef url: "https://pub.dev" source: hosted - version: "5.10.0" + version: "5.11.0" win32_registry: dependency: transitive description: @@ -1529,5 +1516,5 @@ packages: source: hosted version: "0.0.5" sdks: - dart: ">=3.6.0 <4.0.0" + dart: ">=3.7.0 <4.0.0" flutter: ">=3.27.0" diff --git a/pubspec.yaml b/pubspec.yaml index 22b7ef6..0ace635 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: iris description: "A lightweight video player" publish_to: 'none' -version: 1.3.3+3 +version: 1.3.4+3 environment: sdk: ^3.5.4