diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7abb85ee..471d52af 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,6 +18,13 @@ jobs: with: token: ${{ secrets.GITHUB_TOKEN }} submodules: recursive + - name: Extract Build Info + run: | + echo "BUILD_NUMBER=${{ github.run_number }}" >> $GITHUB_ENV + if [[ "${{ github.ref }}" == "refs/tags/bleeding_edge" ]]; then + echo "BUILD_NAME=3.0.0-bleeding_edge+${{ github.run_number }}" >> $GITHUB_ENV + fi + # We need to enforce java 17 because newer Flutter packages are # requiring this Java Version. - name: Setup Java @@ -48,8 +55,8 @@ jobs: # - run: cp "${{ steps.create_key_properties.outputs.filePath }}" android/key.properties - run: flutter gen-l10n - run: flutter pub get - - run: flutter build apk --verbose --split-per-abi - - run: flutter build appbundle --verbose + - run: flutter build apk --verbose --split-per-abi --build-number=${{ env.BUILD_NUMBER }} ${{ env.BUILD_NAME && format('--build-name={0}', env.BUILD_NAME) }} + - run: flutter build appbundle --verbose --build-number=${{ env.BUILD_NUMBER }} ${{ env.BUILD_NAME && format('--build-name={0}', env.BUILD_NAME) }} - run: cp build/app/outputs/flutter-apk/app-arm64-v8a-release.apk bluecherry-android-arm64-v8a-release.apk - run: cp build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk bluecherry-android-armeabi-v7a-release.apk - run: cp build/app/outputs/flutter-apk/app-x86_64-release.apk bluecherry-android-x86_64-release.apk @@ -88,6 +95,12 @@ jobs: with: token: ${{ secrets.GITHUB_TOKEN }} submodules: recursive + - name: Extract Build Info + run: | + echo "BUILD_NUMBER=${{ github.run_number }}" >> $GITHUB_ENV + if [[ "${{ github.ref }}" == "refs/tags/bleeding_edge" ]]; then + echo "BUILD_NAME=3.0.0-bleeding_edge+${{ github.run_number }}" >> $GITHUB_ENV + fi - uses: subosito/flutter-action@v2.8.0 with: channel: "stable" @@ -96,8 +109,8 @@ jobs: - run: flutter gen-l10n - run: flutter pub get - - run: flutter build ios --verbose --no-codesign - - run: flutter build ipa --verbose --no-codesign + - run: flutter build ios --verbose --no-codesign --build-number=${{ env.BUILD_NUMBER }} ${{ env.BUILD_NAME && format('--build-name={0}', env.BUILD_NAME) }} + - run: flutter build ipa --verbose --no-codesign --build-number=${{ env.BUILD_NUMBER }} ${{ env.BUILD_NAME && format('--build-name={0}', env.BUILD_NAME) }} # App should be published with TestFlight # - name: Release @@ -181,6 +194,14 @@ jobs: with: token: ${{ secrets.GITHUB_TOKEN }} submodules: recursive + + - name: Extract Build Info + run: | + echo "BUILD_NUMBER=${{ github.run_number }}" >> $GITHUB_ENV + if [[ "${{ github.ref }}" == "refs/tags/bleeding_edge" ]]; then + echo "BUILD_NAME=3.0.0-bleeding_edge+${{ github.run_number }}" >> $GITHUB_ENV + fi + - uses: subosito/flutter-action@v2.8.0 with: channel: "stable" @@ -188,7 +209,9 @@ jobs: - run: git config --system core.longpaths true - run: flutter gen-l10n - run: flutter pub get - - run: flutter build windows --verbose + - name: Build Windows + run: | + flutter build windows --verbose --build-number=${{ env.BUILD_NUMBER }} ${{ env.BUILD_NAME && format('--build-name={0}', env.BUILD_NAME) }} - name: Copy VSCode redistribution libs over shell: powershell @@ -243,6 +266,13 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} submodules: recursive + - name: Extract Build Info + run: | + echo "BUILD_NUMBER=${{ github.run_number }}" >> $GITHUB_ENV + if [[ "${{ github.ref }}" == "refs/tags/bleeding_edge" ]]; then + echo "BUILD_NAME=3.0.0-bleeding_edge+${{ github.run_number }}" >> $GITHUB_ENV + fi + - name: Install dependencies # https://docs.flutter.dev/platform-integration/linux/building#prepare-linux-apps-for-distribution # https://pub.dev/packages/flutter_secure_storage#configure-linux-version @@ -263,7 +293,7 @@ jobs: - name: Build Flutter for RPM run: | - flutter build linux --verbose --dart-define-from-file=linux/env/rpm.json + flutter build linux --verbose --dart-define-from-file=linux/env/rpm.json --build-number=${{ env.BUILD_NUMBER }} ${{ env.BUILD_NAME && format('--build-name={0}', env.BUILD_NAME) }} - name: Build RPM Package continue-on-error: true @@ -284,7 +314,7 @@ jobs: flutter clean flutter gen-l10n flutter pub get - flutter build linux --verbose --dart-define-from-file=linux/env/deb.json + flutter build linux --verbose --dart-define-from-file=linux/env/deb.json --build-number=${{ env.BUILD_NUMBER }} ${{ env.BUILD_NAME && format('--build-name={0}', env.BUILD_NAME) }} rm -r linux/debian/usr/bin mkdir -p linux/debian/usr/bin @@ -302,7 +332,7 @@ jobs: flutter clean flutter gen-l10n flutter pub get - flutter build linux --verbose --dart-define-from-file=linux/env/tar.gz.json + flutter build linux --verbose --dart-define-from-file=linux/env/tar.gz.json --build-number=${{ env.BUILD_NUMBER }} ${{ env.BUILD_NAME && format('--build-name={0}', env.BUILD_NAME) }} rm -r linux/debian/usr/bin mkdir -p linux/debian/usr/bin @@ -325,7 +355,7 @@ jobs: flutter clean flutter gen-l10n flutter pub get - flutter build linux --verbose --dart-define-from-file=linux/env/appimage.json + flutter build linux --verbose --dart-define-from-file=linux/env/appimage.json --build-number=${{ env.BUILD_NUMBER }} ${{ env.BUILD_NAME && format('--build-name={0}', env.BUILD_NAME) }} - name: Build AppImage continue-on-error: true @@ -380,6 +410,13 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} submodules: recursive + - name: Extract Build Info + run: | + echo "BUILD_NUMBER=${{ github.run_number }}" >> $GITHUB_ENV + if [[ "${{ github.ref }}" == "refs/tags/bleeding_edge" ]]; then + echo "BUILD_NAME=3.0.0-bleeding_edge+${{ github.run_number }}" >> $GITHUB_ENV + fi + - name: Install Flutter uses: subosito/flutter-action@v2.8.0 with: @@ -395,7 +432,7 @@ jobs: - name: Build run: | - flutterpi_tool build --release --cpu=pi4 + flutterpi_tool build --release --cpu=pi4 --build-number=${{ env.BUILD_NUMBER }} ${{ env.BUILD_NAME && format('--build-name={0}', env.BUILD_NAME) }} build_web: name: Bluecherry Web @@ -407,6 +444,13 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} submodules: recursive + - name: Extract Build Info + run: | + echo "BUILD_NUMBER=${{ github.run_number }}" >> $GITHUB_ENV + if [[ "${{ github.ref }}" == "refs/tags/bleeding_edge" ]]; then + echo "BUILD_NAME=3.0.0-bleeding_edge+${{ github.run_number }}" >> $GITHUB_ENV + fi + - name: Install Flutter uses: subosito/flutter-action@v2.8.0 with: @@ -420,4 +464,4 @@ jobs: - name: Build run: | - flutter build web --verbose --dart-define=FLUTTER_WEB_USE_SKIA=true --dart-define=FLUTTER_WEB_AUTO_DETECT=true + flutter build web --verbose --dart-define=FLUTTER_WEB_USE_SKIA=true --dart-define=FLUTTER_WEB_AUTO_DETECT=true --build-number=${{ env.BUILD_NUMBER }} ${{ env.BUILD_NAME && format('--build-name={0}', env.BUILD_NAME) }} diff --git a/lib/screens/layouts/desktop/layout_view.dart b/lib/screens/layouts/desktop/layout_view.dart index 095158e3..ec4dedcd 100644 --- a/lib/screens/layouts/desktop/layout_view.dart +++ b/lib/screens/layouts/desktop/layout_view.dart @@ -199,7 +199,7 @@ class _LargeDeviceGridState extends State } } -class LayoutView extends StatefulWidget { +class LayoutView extends StatelessWidget { const LayoutView({ super.key, required this.layout, @@ -214,31 +214,22 @@ class LayoutView extends StatefulWidget { final DragTargetWillAccept? onWillAccept; final ReorderCallback? onReorder; - @override - State createState() => _LayoutViewState(); -} - -class _LayoutViewState extends State { - var _volumeSliderVisible = false; - @override Widget build(BuildContext context) { final theme = Theme.of(context); - final loc = AppLocalizations.of(context); - final view = context.watch(); final settings = context.watch(); return DragTarget( onWillAcceptWithDetails: - widget.onWillAccept == null + onWillAccept == null ? null - : (details) => widget.onWillAccept!.call(details.data), - onAcceptWithDetails: (details) => widget.onAccept?.call(details.data), + : (details) => onWillAccept!.call(details.data), + onAcceptWithDetails: (details) => onAccept?.call(details.data), builder: (context, candidateItems, rejectedItems) { late Widget child; final devices = [ - ...widget.layout.devices, + ...layout.devices, ...candidateItems.whereType(), ]; final dl = devices.length; @@ -268,15 +259,14 @@ class _LayoutViewState extends State { } else if (dl == 1) { final device = devices.first; child = Padding( - key: ValueKey(widget.layout.hashCode), + key: ValueKey(layout.hashCode), padding: kGridPadding, child: AspectRatio( aspectRatio: kHorizontalAspectRatio, child: DesktopDeviceTile(device: device), ), ); - } else if (widget.layout.type == DesktopLayoutType.compactView && - dl >= 4) { + } else if (layout.type == DesktopLayoutType.compactView && dl >= 4) { var foldedDevices = devices .fold>>([[]], (collection, device) { @@ -316,7 +306,7 @@ class _LayoutViewState extends State { child = AbsorbPointer( absorbing: candidateItems.isNotEmpty, child: GridView.builder( - key: ValueKey(widget.layout.hashCode), + key: ValueKey(layout.hashCode), physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( @@ -352,11 +342,11 @@ class _LayoutViewState extends State { child: AbsorbPointer( absorbing: candidateItems.isNotEmpty, child: StaticGrid( - key: ValueKey(widget.layout.hashCode), + key: ValueKey(layout.hashCode), crossAxisCount: crossAxisCount.clamp(1, 50), childAspectRatio: kHorizontalAspectRatio, - reorderable: widget.onReorder != null, - onReorder: widget.onReorder ?? (a, b) {}, + reorderable: onReorder != null, + onReorder: onReorder ?? (a, b) {}, padding: EdgeInsets.zero, children: devices.map((device) { @@ -388,7 +378,7 @@ class _LayoutViewState extends State { child: SafeArea( child: Column( children: [ - if (!settings.isImmersiveMode) + if (!settings.isImmersiveMode && !isAlternativeWindow) Padding( padding: const EdgeInsets.all(16.0), child: IntrinsicHeight( @@ -396,127 +386,13 @@ class _LayoutViewState extends State { children: [ Expanded( child: Text( - widget.layout.name, + layout.name, style: theme.textTheme.titleSmall?.copyWith( color: Colors.white, ), ), ), - if (widget.layout.devices.isNotEmpty) - ...() { - final volume = - widget.layout.devices - .map((device) => device.volume) - .findMaxDuplicatedElementInList() - .toDouble(); - return [ - if (_volumeSliderVisible) - SizedBox( - height: 24.0, - child: Slider( - value: volume, - divisions: 100, - label: '${(volume * 100).round()}%', - onChanged: (value) async { - await widget.layout.setVolume(value); - if (mounted) setState(() {}); - }, - onChangeEnd: (value) async { - await widget.layout.setVolume(value); - view.save(); - }, - ), - ), - SquaredIconButton( - icon: const Icon( - Icons.equalizer, - color: Colors.white, - ), - tooltip: loc.layoutVolume( - (volume * 100).round(), - ), - onPressed: () { - setState(() { - _volumeSliderVisible = - !_volumeSliderVisible; - }); - }, - ), - ]; - }(), - SquaredIconButton( - icon: Icon( - view.isLayoutLocked(widget.layout) - ? Icons.lock - : Icons.lock_open, - color: Colors.white, - ), - tooltip: - view.isLayoutLocked(widget.layout) - ? loc.unlockLayout - : loc.lockLayout, - onPressed: - () => view.toggleLayoutLock(widget.layout), - ), - SquaredIconButton( - icon: const Icon( - Icons.satellite_alt, - color: Colors.white, - ), - tooltip: loc.addExternalStream, - onPressed: () { - AddExternalStreamDialog.show( - context, - targetLayout: widget.layout, - ); - }, - ), - if (canOpenNewWindow) - SquaredIconButton( - icon: const Icon( - Icons.open_in_new, - color: Colors.white, - ), - tooltip: loc.openInANewWindow, - onPressed: widget.layout.openInANewWindow, - ), - SquaredIconButton( - icon: const Icon(Icons.edit, color: Colors.white), - tooltip: loc.editLayout, - onPressed: () { - showDialog( - context: context, - builder: - (context) => - EditLayoutDialog(layout: widget.layout), - ); - }, - ), - SquaredIconButton( - icon: const Icon( - Icons.import_export, - color: Colors.white, - ), - tooltip: loc.exportLayout, - onPressed: () { - widget.layout.export( - dialogTitle: loc.exportLayout, - ); - }, - ), - if (widget.layout.devices.isNotEmpty) ...[ - const VerticalDivider(), - SquaredIconButton( - icon: Icon( - Icons.clear, - color: theme.colorScheme.error, - ), - tooltip: loc.clearLayout( - widget.layout.devices.length, - ), - onPressed: view.clearLayout, - ), - ], + LayoutOptions(layout: layout), ], ), ), @@ -536,6 +412,120 @@ class _LayoutViewState extends State { } } +class LayoutOptions extends StatefulWidget { + final Layout layout; + + const LayoutOptions({super.key, required this.layout}); + + @override + State createState() => _LayoutOptionsState(); +} + +class _LayoutOptionsState extends State { + bool _volumeSliderVisible = false; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final loc = AppLocalizations.of(context); + final view = context.watch(); + final isAlternativeWindow = AlternativeWindow.maybeOf(context) != null; + + return Row( + children: [ + if (widget.layout.devices.isNotEmpty) + ...() { + final volume = + widget.layout.devices + .map((device) => device.volume) + .findMaxDuplicatedElementInList() + .toDouble(); + return [ + if (_volumeSliderVisible) + SizedBox( + height: 24.0, + child: Slider( + value: volume, + divisions: 100, + label: '${(volume * 100).round()}%', + onChanged: (value) async { + await widget.layout.setVolume(value); + if (mounted) setState(() {}); + }, + onChangeEnd: (value) async { + await widget.layout.setVolume(value); + view.save(); + }, + ), + ), + SquaredIconButton( + icon: const Icon(Icons.equalizer, color: Colors.white), + tooltip: loc.layoutVolume((volume * 100).round()), + onPressed: () { + setState(() { + _volumeSliderVisible = !_volumeSliderVisible; + }); + }, + ), + ]; + }(), + SquaredIconButton( + icon: Icon( + view.isLayoutLocked(widget.layout) ? Icons.lock : Icons.lock_open, + color: Colors.white, + ), + tooltip: + view.isLayoutLocked(widget.layout) + ? loc.unlockLayout + : loc.lockLayout, + onPressed: () => view.toggleLayoutLock(widget.layout), + ), + SquaredIconButton( + icon: const Icon(Icons.satellite_alt, color: Colors.white), + tooltip: loc.addExternalStream, + onPressed: () { + AddExternalStreamDialog.show(context, targetLayout: widget.layout); + }, + ), + if (canOpenNewWindow && !isAlternativeWindow) + SquaredIconButton( + icon: const Icon(Icons.open_in_new, color: Colors.white), + tooltip: loc.openInANewWindow, + onPressed: widget.layout.openInANewWindow, + ), + // TODO(bdlukaa): "Add" button. Displays a popup with the current + // available cameras + SquaredIconButton( + icon: const Icon(Icons.edit, color: Colors.white), + tooltip: loc.editLayout, + onPressed: () { + showDialog( + context: context, + builder: (context) => EditLayoutDialog(layout: widget.layout), + ); + }, + ), + SquaredIconButton( + icon: const Icon(Icons.import_export, color: Colors.white), + tooltip: loc.exportLayout, + onPressed: () { + widget.layout.export(dialogTitle: loc.exportLayout); + }, + ), + if (widget.layout.devices.isNotEmpty) ...[ + const VerticalDivider(), + SquaredIconButton( + icon: Icon(Icons.clear, color: theme.colorScheme.error), + tooltip: loc.clearLayout(widget.layout.devices.length), + // TODO(bdlukaa): Add a confirmation and an UNDO option + onPressed: view.clearLayout, + ), + ], + ], + ); + } +} + class DesktopCompactTile extends StatelessWidget { const DesktopCompactTile({super.key, required this.devices}) : assert(devices.length >= 2 && devices.length <= 4); diff --git a/lib/screens/multi_window/single_layout_window.dart b/lib/screens/multi_window/single_layout_window.dart index 087a99e1..cf7154be 100644 --- a/lib/screens/multi_window/single_layout_window.dart +++ b/lib/screens/multi_window/single_layout_window.dart @@ -34,7 +34,11 @@ class AlternativeLayoutView extends StatelessWidget { child: SafeArea( child: Column( children: [ - WindowButtons(title: layout.name, showNavigator: false), + WindowButtons( + title: layout.name, + showNavigator: false, + flexible: LayoutOptions(layout: layout), + ), Expanded(child: LayoutView(layout: layout)), ], ), diff --git a/lib/screens/settings/updates_and_help.dart b/lib/screens/settings/updates_and_help.dart index bce4d83f..ced84ff0 100644 --- a/lib/screens/settings/updates_and_help.dart +++ b/lib/screens/settings/updates_and_help.dart @@ -505,7 +505,10 @@ class About extends StatelessWidget { children: [ const SizedBox(height: 8.0), if (update.packageInfo != null) ...[ - Text(update.packageInfo!.version), + Text( + '${update.packageInfo!.version}' + '${update.packageInfo!.buildNumber.isNotEmpty ? '(${update.packageInfo!.buildNumber})' : ''}', + ), const SizedBox(height: 8.0), Text(loc.versionText, style: theme.textTheme.displayMedium), ], diff --git a/lib/utils/video_player.dart b/lib/utils/video_player.dart index e68911af..43b32856 100644 --- a/lib/utils/video_player.dart +++ b/lib/utils/video_player.dart @@ -111,6 +111,7 @@ class UnityPlayers with ChangeNotifier { headers: { if (device.server.cookie != null) API.cookieHeader: device.server.cookie!, + ...device.server.headers, }, ); @@ -148,9 +149,13 @@ class UnityPlayers with ChangeNotifier { setSource(); - controller.onError.listen((event) { + controller.onError.listen((error) { writeLogToFile( - 'An error ocurred when playing a video (${controller.dataSource}): $event\n', + 'An error ocurred when playing a video (${controller.dataSource}): $error\n', + ); + logStreamToFile( + device.url ?? '${device.name} (${device.server.ip})', + error, ); }); @@ -187,9 +192,15 @@ class UnityPlayers with ChangeNotifier { ..setVolume(1.0) ..setSpeed(1.0); - controller.onError.listen((event) { + controller.onError.listen((error) { writeLogToFile( - 'An error ocurred when playing a video (${controller.dataSource}): $event\n', + 'An error ocurred when playing an event video (${controller.dataSource}): $error\n', + ); + logStreamToFile( + event.mediaURL == null + ? 'Event ${event.title} (${event.id})' + : event.mediaPath, + error, ); }); diff --git a/packages/unity_video_player/unity_video_player/pubspec.yaml b/packages/unity_video_player/unity_video_player/pubspec.yaml index 2e85d749..1118c128 100644 --- a/packages/unity_video_player/unity_video_player/pubspec.yaml +++ b/packages/unity_video_player/unity_video_player/pubspec.yaml @@ -36,6 +36,6 @@ flutter: linux: default_package: unity_video_player_flutter windows: - default_package: unity_video_player_main + default_package: unity_video_player_flutter web: default_package: unity_video_player_main diff --git a/packages/unity_video_player/unity_video_player_flutter/lib/unity_video_player_flutter.dart b/packages/unity_video_player/unity_video_player_flutter/lib/unity_video_player_flutter.dart index 6638b183..878265cb 100644 --- a/packages/unity_video_player/unity_video_player_flutter/lib/unity_video_player_flutter.dart +++ b/packages/unity_video_player/unity_video_player_flutter/lib/unity_video_player_flutter.dart @@ -8,6 +8,9 @@ import 'package:fvp/fvp.dart' as fvp; import 'package:unity_video_player_platform_interface/unity_video_player_platform_interface.dart'; import 'package:video_player/video_player.dart'; +/// Whether the current platform is a Raspberry Pi. +bool get isPi => const String.fromEnvironment('linux_environment') == 'pi'; + class UnityVideoPlayerFlutterInterface extends UnityVideoPlayerInterface { /// Registers this class as the default instance of [UnityVideoPlayerInterface]. static void registerWith() { @@ -20,7 +23,7 @@ class UnityVideoPlayerFlutterInterface extends UnityVideoPlayerInterface { @override Future initialize() async { - if ('pi' case const String.fromEnvironment('linux_environment')) { + if (isPi) { FlutterpiVideoPlayer.registerWith(); } else { fvp.registerWith(options: { @@ -93,7 +96,7 @@ class UnityVideoPlayerFlutterInterface extends UnityVideoPlayerInterface { } @override - bool get supportsFPS => false; + bool get supportsFPS => !isPi; @override bool get supportsHardwareZoom => false; @@ -114,6 +117,8 @@ class UnityVideoPlayerFlutter extends UnityVideoPlayer { String? title, }) { if (title != null) this.title = title; + onLog?.call( + 'Initialized player $title with width=$width and height=$height'); } @override @@ -244,9 +249,21 @@ class UnityVideoPlayerFlutter extends UnityVideoPlayer { Stream get volumeStream => _videoStream.stream.map((_) => volume); @override - double get fps => 0.0; + double get fps { + if (!isPi || player == null) return 0.0; + + return player + ?.getMediaInfo() + ?.video + ?.firstOrNull + ?.codec + .frameRate + .toDouble() ?? + 0.0; + } + @override - Stream get fpsStream => Stream.value(fps); + Stream get fpsStream => _videoStream.stream.map((_) => fps); @override double get aspectRatio => player?.value.aspectRatio ?? 0; diff --git a/packages/unity_video_player/unity_video_player_flutter/pubspec.yaml b/packages/unity_video_player/unity_video_player_flutter/pubspec.yaml index 06bbbf56..8559d458 100644 --- a/packages/unity_video_player/unity_video_player_flutter/pubspec.yaml +++ b/packages/unity_video_player/unity_video_player_flutter/pubspec.yaml @@ -18,7 +18,7 @@ dependencies: path: ../unity_video_player_main video_player: ^2.9.3 flutterpi_gstreamer_video_player: ^0.1.1+1 - fvp: ^0.30.0 + fvp: ^0.31.0 dev_dependencies: flutter_test: diff --git a/packages/unity_video_player/unity_video_player_platform_interface/lib/unity_video_player_platform_interface.dart b/packages/unity_video_player/unity_video_player_platform_interface/lib/unity_video_player_platform_interface.dart index 5b13bf8d..3b0e90b4 100644 --- a/packages/unity_video_player/unity_video_player_platform_interface/lib/unity_video_player_platform_interface.dart +++ b/packages/unity_video_player/unity_video_player_platform_interface/lib/unity_video_player_platform_interface.dart @@ -95,6 +95,7 @@ abstract class UnityVideoPlayerInterface extends PlatformInterface { debugPrint('Disposing player ${player.hashCode}'); await player.dispose(); } + UnityVideoPlayerInterface.players.clear(); }); } diff --git a/pubspec.lock b/pubspec.lock index a3778fd8..d9f6cc5f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -53,10 +53,10 @@ packages: dependency: transitive description: name: archive - sha256: "0c64e928dcbefddecd234205422bcfc2b5e6d31be0b86fef0d0dd48d7b4c9742" + sha256: "7dcbd0f87fe5f61cb28da39a1a8b70dbc106e2fe0516f7836eb7bb2948481a12" url: "https://pub.dev" source: hosted - version: "4.0.4" + version: "4.0.5" args: dependency: "direct main" description: @@ -269,10 +269,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: ee11ce89f8937c39181bc88d57a455972f7545b86150d8f287d0d9cf95bcdf0a + sha256: "09b474c0c8117484b80cbebc043801ff91e05cfbd2874d512825c899e1754694" url: "https://pub.dev" source: hosted - version: "9.1.0" + version: "9.2.3" firebase_core: dependency: "direct main" description: @@ -457,10 +457,10 @@ packages: dependency: transitive description: name: fvp - sha256: f5012756985f7c8c19caaea2d65baf8a6cf5fee9fe520e1fabb8bc61e1d5f468 + sha256: "724802f4c3f4d22cd2913356e91208096ba5aaab1db71c9e12b66bef4cf6f799" url: "https://pub.dev" source: hosted - version: "0.30.0" + version: "0.31.0" get_it: dependency: transitive description: @@ -513,10 +513,10 @@ packages: dependency: transitive description: name: image - sha256: "13d3349ace88f12f4a0d175eb5c12dcdd39d35c4c109a8a13dfeb6d0bd9e31c3" + sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" url: "https://pub.dev" source: hosted - version: "4.5.3" + version: "4.5.4" intl: dependency: "direct main" description: @@ -658,16 +658,16 @@ packages: description: path: "libs/android/media_kit_libs_android_video" ref: HEAD - resolved-ref: d2145a50f68394096845915a28874341fbf5b3fe + resolved-ref: d544e1c52db47a45097a8332a862687c832359d9 url: "https://github.com/media-kit/media-kit/" source: git - version: "1.3.6" + version: "1.3.7" media_kit_libs_ios_video: dependency: transitive description: path: "libs/ios/media_kit_libs_ios_video" ref: HEAD - resolved-ref: d2145a50f68394096845915a28874341fbf5b3fe + resolved-ref: d544e1c52db47a45097a8332a862687c832359d9 url: "https://github.com/media-kit/media-kit/" source: git version: "1.1.4" @@ -676,10 +676,10 @@ packages: description: path: "libs/windows/media_kit_libs_windows_video" ref: HEAD - resolved-ref: d2145a50f68394096845915a28874341fbf5b3fe + resolved-ref: d544e1c52db47a45097a8332a862687c832359d9 url: "https://github.com/media-kit/media-kit/" source: git - version: "1.0.10" + version: "1.0.11" media_kit_video: dependency: transitive description: @@ -900,10 +900,10 @@ packages: dependency: "direct main" description: name: provider - sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + sha256: "489024f942069c2920c844ee18bb3d467c69e48955a4f32d1677f71be103e310" url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.1.4" pub_semver: dependency: transitive description: @@ -1252,10 +1252,10 @@ packages: dependency: transitive description: name: video_player - sha256: "48941c8b05732f9582116b1c01850b74dbee1d8520cd7e34ad4609d6df666845" + sha256: "7d78f0cfaddc8c19d4cb2d3bebe1bfef11f2103b0a03e5398b303a1bf65eeb14" url: "https://pub.dev" source: hosted - version: "2.9.3" + version: "2.9.5" video_player_android: dependency: transitive description: @@ -1308,10 +1308,10 @@ packages: dependency: "direct main" description: name: wakelock_plus - sha256: "36c88af0b930121941345306d259ec4cc4ecca3b151c02e3a9e71aede83c615e" + sha256: b90fbcc8d7bdf3b883ea9706d9d76b9978cb1dfa4351fcc8014d6ec31a493354 url: "https://pub.dev" source: hosted - version: "1.2.10" + version: "1.2.11" wakelock_plus_platform_interface: dependency: transitive description: