From 11e39d81d1f91b02b75cd04f0b9425b9ac066fe0 Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Mon, 5 May 2025 16:48:06 +0200 Subject: [PATCH 01/23] Implements background playback functionality using allowBackgroundPlayback option. --- .../video_player/video_player/CHANGELOG.md | 1 + packages/video_player/video_player/README.md | 15 + .../video_player/lib/video_player.dart | 5 + .../video_player/test/video_player_test.dart | 9 +- .../video_player_android/CHANGELOG.md | 4 + .../flutter/plugins/videoplayer/Messages.java | 229 +++++------ .../plugins/videoplayer/VideoPlayer.java | 9 + .../videoplayer/VideoPlayerOptions.java | 1 + .../videoplayer/VideoPlayerPlugin.java | 5 + .../texture/TextureVideoPlayer.java | 12 +- .../lib/src/android_video_player.dart | 5 + .../lib/src/messages.g.dart | 355 +++++++++--------- .../pigeons/messages.dart | 1 + .../video_player_android/pubspec.yaml | 2 +- .../test/android_video_player_test.dart | 18 + .../video_player_avfoundation/CHANGELOG.md | 1 + .../FVPVideoPlayerPlugin.m | 24 ++ .../video_player_avfoundation/messages.g.h | 45 +-- .../video_player_avfoundation/messages.g.m | 269 ++++++------- .../lib/src/avfoundation_video_player.dart | 5 + .../lib/src/messages.g.dart | 328 ++++++++-------- .../pigeons/messages.dart | 2 + .../test/avfoundation_video_player_test.dart | 7 + .../video_player_web/CHANGELOG.md | 1 + .../video_player_web_test.dart | 8 + .../lib/video_player_web.dart | 5 + 26 files changed, 688 insertions(+), 678 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index d01c0ec1d9a..dcd5b5a0dd6 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,6 +1,7 @@ ## NEXT * Updates minimum supported SDK version to Flutter 3.29/Dart 3.7. +* Implements background playback functionality using allowBackgroundPlayback option. ## 2.10.0 diff --git a/packages/video_player/video_player/README.md b/packages/video_player/video_player/README.md index 261b68ba5c5..d97148fa8e6 100644 --- a/packages/video_player/video_player/README.md +++ b/packages/video_player/video_player/README.md @@ -22,6 +22,15 @@ in `/ios/Runner/Info.plist`. See [Apple's documentation](https://developer.apple.com/documentation/bundleresources/information_property_list/nsapptransportsecurity) to determine the right combination of entries for your use case and supported iOS versions. +If you plan to use background playback, you will also need to add the following permission in your Info.plist file. + +```xml +UIBackgroundModes + + audio + +``` + ### Android If you are using network-based videos, ensure that the following permission is present in your @@ -31,6 +40,12 @@ Android Manifest file, located in `/android/app/src/main/AndroidMa ``` +If you plan to use background playback, you will also need to add the following permission in your Android Manifest file. + +```xml + +``` + ### macOS If you are using network-based videos, you will need to [add the diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart index 8f8ebf5d8dc..67e6cddd987 100644 --- a/packages/video_player/video_player/lib/video_player.dart +++ b/packages/video_player/video_player/lib/video_player.dart @@ -469,6 +469,11 @@ class VideoPlayerController extends ValueNotifier { ); } + if (videoPlayerOptions?.allowBackgroundPlayback != null) { + await _videoPlayerPlatform.setAllowBackgroundPlayback( + videoPlayerOptions!.allowBackgroundPlayback); + } + _playerId = (await _videoPlayerPlatform.createWithOptions(creationOptions)) ?? kUninitializedPlayerId; diff --git a/packages/video_player/video_player/test/video_player_test.dart b/packages/video_player/video_player/test/video_player_test.dart index 8ded8dd56e6..e0e15194138 100644 --- a/packages/video_player/video_player/test/video_player_test.dart +++ b/packages/video_player/video_player/test/video_player_test.dart @@ -1572,8 +1572,13 @@ class FakeVideoPlayerPlatform extends VideoPlayerPlatform { } @override - Widget buildView(int playerId) { - return Texture(textureId: playerId); + Future setAllowBackgroundPlayback(bool allowBackgroundPlayback) async { + calls.add('setAllowBackgroundPlayback'); + } + + @override + Widget buildView(int textureId) { + return Texture(textureId: textureId); } @override diff --git a/packages/video_player/video_player_android/CHANGELOG.md b/packages/video_player/video_player_android/CHANGELOG.md index 787c115036d..ea1cae9d676 100644 --- a/packages/video_player/video_player_android/CHANGELOG.md +++ b/packages/video_player/video_player_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.9.0 + +* Implements background playback functionality using allowBackgroundPlayback option. + ## 2.8.16 * Updates Java compatibility version to 17 and minimum supported SDK version to Flutter 3.35/Dart 3.9. diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/Messages.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/Messages.java index 1bac72cf7bd..f1744bda26f 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/Messages.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/Messages.java @@ -21,6 +21,10 @@ import java.lang.annotation.Target; import java.nio.ByteBuffer; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Objects; @@ -37,7 +41,8 @@ public static class FlutterError extends RuntimeException { /** The error details. Must be a datatype supported by the api codec. */ public final Object details; - public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) { + public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) + { super(message); this.code = code; this.details = details; @@ -56,7 +61,7 @@ protected static ArrayList wrapError(@NonNull Throwable exception) { errorList.add(exception.toString()); errorList.add(exception.getClass().getSimpleName()); errorList.add( - "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); + "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); } return errorList; } @@ -81,7 +86,7 @@ public enum PlatformVideoFormat { /** * Information passed to the platform view creation. * - *

Generated class from Pigeon that represents data sent in messages. + * Generated class from Pigeon that represents data sent in messages. */ public static final class PlatformVideoViewCreationParams { private @NonNull Long playerId; @@ -102,12 +107,8 @@ public void setPlayerId(@NonNull Long setterArg) { @Override public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) { return false; } PlatformVideoViewCreationParams that = (PlatformVideoViewCreationParams) o; return playerId.equals(that.playerId); } @@ -141,8 +142,7 @@ ArrayList toList() { return toListResult; } - static @NonNull PlatformVideoViewCreationParams fromList( - @NonNull ArrayList pigeonVar_list) { + static @NonNull PlatformVideoViewCreationParams fromList(@NonNull ArrayList pigeonVar_list) { PlatformVideoViewCreationParams pigeonResult = new PlatformVideoViewCreationParams(); Object playerId = pigeonVar_list.get(0); pigeonResult.setPlayerId((Long) playerId); @@ -203,17 +203,10 @@ public void setUserAgent(@Nullable String setterArg) { @Override public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) { return false; } CreationOptions that = (CreationOptions) o; - return uri.equals(that.uri) - && Objects.equals(formatHint, that.formatHint) - && httpHeaders.equals(that.httpHeaders) - && Objects.equals(userAgent, that.userAgent); + return uri.equals(that.uri) && Objects.equals(formatHint, that.formatHint) && httpHeaders.equals(that.httpHeaders) && Objects.equals(userAgent, that.userAgent); } @Override @@ -322,12 +315,8 @@ public void setTextureId(@NonNull Long setterArg) { @Override public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) { return false; } TexturePlayerIds that = (TexturePlayerIds) o; return playerId.equals(that.playerId) && textureId.equals(that.textureId); } @@ -416,12 +405,8 @@ public void setBufferPosition(@NonNull Long setterArg) { @Override public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) { return false; } PlaybackState that = (PlaybackState) o; return playPosition.equals(that.playPosition) && bufferPosition.equals(that.bufferPosition); } @@ -483,11 +468,10 @@ private PigeonCodec() {} @Override protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { switch (type) { - case (byte) 129: - { - Object value = readValue(buffer); - return value == null ? null : PlatformVideoFormat.values()[((Long) value).intValue()]; - } + case (byte) 129: { + Object value = readValue(buffer); + return value == null ? null : PlatformVideoFormat.values()[((Long) value).intValue()]; + } case (byte) 130: return PlatformVideoViewCreationParams.fromList((ArrayList) readValue(buffer)); case (byte) 131: @@ -529,44 +513,35 @@ public interface AndroidVideoPlayerApi { void initialize(); - @NonNull + @NonNull Long createForPlatformView(@NonNull CreationOptions options); - @NonNull + @NonNull TexturePlayerIds createForTextureView(@NonNull CreationOptions options); void dispose(@NonNull Long playerId); void setMixWithOthers(@NonNull Boolean mixWithOthers); - @NonNull + void setAllowBackgroundPlayback(@NonNull Boolean allowBackgroundPlayback); + + @NonNull String getLookupKeyForAsset(@NonNull String asset, @Nullable String packageName); /** The codec used by AndroidVideoPlayerApi. */ static @NonNull MessageCodec getCodec() { return PigeonCodec.INSTANCE; } - /** - * Sets up an instance of `AndroidVideoPlayerApi` to handle messages through the - * `binaryMessenger`. - */ - static void setUp( - @NonNull BinaryMessenger binaryMessenger, @Nullable AndroidVideoPlayerApi api) { + /**Sets up an instance of `AndroidVideoPlayerApi` to handle messages through the `binaryMessenger`. */ + static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable AndroidVideoPlayerApi api) { setUp(binaryMessenger, "", api); } - - static void setUp( - @NonNull BinaryMessenger binaryMessenger, - @NonNull String messageChannelSuffix, - @Nullable AndroidVideoPlayerApi api) { + static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String messageChannelSuffix, @Nullable AndroidVideoPlayerApi api) { messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.initialize" - + messageChannelSuffix, - getCodec()); + binaryMessenger, "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.initialize" + messageChannelSuffix, getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -574,7 +549,8 @@ static void setUp( try { api.initialize(); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -586,10 +562,7 @@ static void setUp( { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.createForPlatformView" - + messageChannelSuffix, - getCodec()); + binaryMessenger, "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.createForPlatformView" + messageChannelSuffix, getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -599,7 +572,8 @@ static void setUp( try { Long output = api.createForPlatformView(optionsArg); wrapped.add(0, output); - } catch (Throwable exception) { + } + catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -611,10 +585,7 @@ static void setUp( { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.createForTextureView" - + messageChannelSuffix, - getCodec()); + binaryMessenger, "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.createForTextureView" + messageChannelSuffix, getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -624,7 +595,8 @@ static void setUp( try { TexturePlayerIds output = api.createForTextureView(optionsArg); wrapped.add(0, output); - } catch (Throwable exception) { + } + catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -636,10 +608,7 @@ static void setUp( { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.dispose" - + messageChannelSuffix, - getCodec()); + binaryMessenger, "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.dispose" + messageChannelSuffix, getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -649,7 +618,8 @@ static void setUp( try { api.dispose(playerIdArg); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -661,10 +631,7 @@ static void setUp( { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.setMixWithOthers" - + messageChannelSuffix, - getCodec()); + binaryMessenger, "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.setMixWithOthers" + messageChannelSuffix, getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -674,7 +641,31 @@ static void setUp( try { api.setMixWithOthers(mixWithOthersArg); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.setAllowBackgroundPlayback" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + Boolean allowBackgroundPlaybackArg = (Boolean) args.get(0); + try { + api.setAllowBackgroundPlayback(allowBackgroundPlaybackArg); + wrapped.add(0, null); + } + catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -686,10 +677,7 @@ static void setUp( { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.getLookupKeyForAsset" - + messageChannelSuffix, - getCodec()); + binaryMessenger, "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.getLookupKeyForAsset" + messageChannelSuffix, getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -700,7 +688,8 @@ static void setUp( try { String output = api.getLookupKeyForAsset(assetArg, packageNameArg); wrapped.add(0, output); - } catch (Throwable exception) { + } + catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -728,37 +717,26 @@ public interface VideoPlayerInstanceApi { /** * Returns the current playback state. * - *

This is combined into a single call to minimize platform channel calls for state that - * needs to be polled frequently. + * This is combined into a single call to minimize platform channel calls for + * state that needs to be polled frequently. */ - @NonNull + @NonNull PlaybackState getPlaybackState(); /** The codec used by VideoPlayerInstanceApi. */ static @NonNull MessageCodec getCodec() { return PigeonCodec.INSTANCE; } - /** - * Sets up an instance of `VideoPlayerInstanceApi` to handle messages through the - * `binaryMessenger`. - */ - static void setUp( - @NonNull BinaryMessenger binaryMessenger, @Nullable VideoPlayerInstanceApi api) { + /**Sets up an instance of `VideoPlayerInstanceApi` to handle messages through the `binaryMessenger`. */ + static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable VideoPlayerInstanceApi api) { setUp(binaryMessenger, "", api); } - - static void setUp( - @NonNull BinaryMessenger binaryMessenger, - @NonNull String messageChannelSuffix, - @Nullable VideoPlayerInstanceApi api) { + static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String messageChannelSuffix, @Nullable VideoPlayerInstanceApi api) { messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setLooping" - + messageChannelSuffix, - getCodec()); + binaryMessenger, "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setLooping" + messageChannelSuffix, getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -768,7 +746,8 @@ static void setUp( try { api.setLooping(loopingArg); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -780,10 +759,7 @@ static void setUp( { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setVolume" - + messageChannelSuffix, - getCodec()); + binaryMessenger, "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setVolume" + messageChannelSuffix, getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -793,7 +769,8 @@ static void setUp( try { api.setVolume(volumeArg); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -805,10 +782,7 @@ static void setUp( { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setPlaybackSpeed" - + messageChannelSuffix, - getCodec()); + binaryMessenger, "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setPlaybackSpeed" + messageChannelSuffix, getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -818,7 +792,8 @@ static void setUp( try { api.setPlaybackSpeed(speedArg); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -830,10 +805,7 @@ static void setUp( { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.play" - + messageChannelSuffix, - getCodec()); + binaryMessenger, "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.play" + messageChannelSuffix, getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -841,7 +813,8 @@ static void setUp( try { api.play(); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -853,10 +826,7 @@ static void setUp( { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.pause" - + messageChannelSuffix, - getCodec()); + binaryMessenger, "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.pause" + messageChannelSuffix, getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -864,7 +834,8 @@ static void setUp( try { api.pause(); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -876,10 +847,7 @@ static void setUp( { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.seekTo" - + messageChannelSuffix, - getCodec()); + binaryMessenger, "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.seekTo" + messageChannelSuffix, getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -889,7 +857,8 @@ static void setUp( try { api.seekTo(positionArg); wrapped.add(0, null); - } catch (Throwable exception) { + } + catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -901,10 +870,7 @@ static void setUp( { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.getPlaybackState" - + messageChannelSuffix, - getCodec()); + binaryMessenger, "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.getPlaybackState" + messageChannelSuffix, getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -912,7 +878,8 @@ static void setUp( try { PlaybackState output = api.getPlaybackState(); wrapped.add(0, output); - } catch (Throwable exception) { + } + catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java index d7861f8a527..4a42af4916e 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java @@ -56,6 +56,15 @@ public VideoPlayer( exoPlayer.prepare(); exoPlayer.addListener(createExoPlayerEventListener(exoPlayer, surfaceProducer)); setAudioAttributes(exoPlayer, options.mixWithOthers); + + if (options.allowBackgroundPlayback) { + exoPlayer.setWakeMode(C.WAKE_MODE_NETWORK); + exoPlayer.setAudioAttributes( + new AudioAttributes.Builder() + .setUsage(C.USAGE_MEDIA) + .build(), + /* handleAudioFocus= */ !options.mixWithOthers); + } } public void setDisposeHandler(@Nullable DisposeHandler handler) { diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerOptions.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerOptions.java index 20f7c5d2dba..386d7ae5324 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerOptions.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerOptions.java @@ -6,4 +6,5 @@ public class VideoPlayerOptions { public boolean mixWithOthers; + public boolean allowBackgroundPlayback; } diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java index db0e811b55b..477f128c6af 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java @@ -197,6 +197,11 @@ public void setMixWithOthers(@NonNull Boolean mixWithOthers) { : flutterState.keyForAssetAndPackageName.get(asset, packageName); } + @Override + public void setAllowBackgroundPlayback(@NonNull Boolean allowBackgroundPlayback) { + options.allowBackgroundPlayback = allowBackgroundPlayback; + } + private interface KeyForAssetFn { String get(String asset); } diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java index 57ed030f564..732982d94f1 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java @@ -29,6 +29,7 @@ public final class TextureVideoPlayer extends VideoPlayer implements SurfaceProducer.Callback { // True when the ExoPlayer instance has a null surface. private boolean needsSurface = true; + @Nullable private final VideoPlayerOptions options; /** * Creates a texture video player. * @@ -69,6 +70,7 @@ public TextureVideoPlayer( super(events, mediaItem, options, surfaceProducer, exoPlayerProvider); surfaceProducer.setCallback(this); + this.options = options; Surface surface = surfaceProducer.getSurface(); this.exoPlayer.setVideoSurface(surface); @@ -100,8 +102,14 @@ public void onSurfaceAvailable() { @RestrictTo(RestrictTo.Scope.LIBRARY) public void onSurfaceCleanup() { - exoPlayer.setVideoSurface(null); - needsSurface = true; + if (options == null || !options.allowBackgroundPlayback) { + savedStateDuring = ExoPlayerState.save(exoPlayer); + exoPlayer.release(); + } else { + savedStateDuring = null; + exoPlayer.setVideoSurface(null); + needsSurface = true; + } } public void dispose() { diff --git a/packages/video_player/video_player_android/lib/src/android_video_player.dart b/packages/video_player/video_player_android/lib/src/android_video_player.dart index 1e4d27f9935..82e996c6c4b 100644 --- a/packages/video_player/video_player_android/lib/src/android_video_player.dart +++ b/packages/video_player/video_player_android/lib/src/android_video_player.dart @@ -217,6 +217,11 @@ class AndroidVideoPlayer extends VideoPlayerPlatform { return _api.setMixWithOthers(mixWithOthers); } + @override + Future setAllowBackgroundPlayback(bool allowBackgroundPlayback) { + return _api.setAllowBackgroundPlayback(allowBackgroundPlayback); + } + _PlayerInstance _playerWith({required int id}) { final _PlayerInstance? player = _players[id]; return player ?? (throw StateError('No active player with ID $id.')); diff --git a/packages/video_player/video_player_android/lib/src/messages.g.dart b/packages/video_player/video_player_android/lib/src/messages.g.dart index 7701c6f4647..9505dea47b1 100644 --- a/packages/video_player/video_player_android/lib/src/messages.g.dart +++ b/packages/video_player/video_player_android/lib/src/messages.g.dart @@ -17,52 +17,56 @@ PlatformException _createConnectionError(String channelName) { message: 'Unable to establish connection on channel: "$channelName".', ); } - bool _deepEquals(Object? a, Object? b) { if (a is List && b is List) { return a.length == b.length && - a.indexed.every( - ((int, dynamic) item) => _deepEquals(item.$2, b[item.$1]), - ); + a.indexed + .every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1])); } if (a is Map && b is Map) { - return a.length == b.length && - a.entries.every( - (MapEntry entry) => - (b as Map).containsKey(entry.key) && - _deepEquals(entry.value, b[entry.key]), - ); + return a.length == b.length && a.entries.every((MapEntry entry) => + (b as Map).containsKey(entry.key) && + _deepEquals(entry.value, b[entry.key])); } return a == b; } + /// Pigeon equivalent of video_platform_interface's VideoFormat. -enum PlatformVideoFormat { dash, hls, ss } +enum PlatformVideoFormat { + dash, + hls, + ss, +} /// Information passed to the platform view creation. class PlatformVideoViewCreationParams { - PlatformVideoViewCreationParams({required this.playerId}); + PlatformVideoViewCreationParams({ + required this.playerId, + }); int playerId; List _toList() { - return [playerId]; + return [ + playerId, + ]; } Object encode() { - return _toList(); - } + return _toList(); } static PlatformVideoViewCreationParams decode(Object result) { result as List; - return PlatformVideoViewCreationParams(playerId: result[0]! as int); + return PlatformVideoViewCreationParams( + playerId: result[0]! as int, + ); } @override // ignore: avoid_equals_and_hash_code_on_mutable_classes bool operator ==(Object other) { - if (other is! PlatformVideoViewCreationParams || - other.runtimeType != runtimeType) { + if (other is! PlatformVideoViewCreationParams || other.runtimeType != runtimeType) { return false; } if (identical(this, other)) { @@ -73,7 +77,8 @@ class PlatformVideoViewCreationParams { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()); + int get hashCode => Object.hashAll(_toList()) +; } class CreationOptions { @@ -93,20 +98,23 @@ class CreationOptions { String? userAgent; List _toList() { - return [uri, formatHint, httpHeaders, userAgent]; + return [ + uri, + formatHint, + httpHeaders, + userAgent, + ]; } Object encode() { - return _toList(); - } + return _toList(); } static CreationOptions decode(Object result) { result as List; return CreationOptions( uri: result[0]! as String, formatHint: result[1] as PlatformVideoFormat?, - httpHeaders: (result[2] as Map?)! - .cast(), + httpHeaders: (result[2] as Map?)!.cast(), userAgent: result[3] as String?, ); } @@ -125,23 +133,29 @@ class CreationOptions { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()); + int get hashCode => Object.hashAll(_toList()) +; } class TexturePlayerIds { - TexturePlayerIds({required this.playerId, required this.textureId}); + TexturePlayerIds({ + required this.playerId, + required this.textureId, + }); int playerId; int textureId; List _toList() { - return [playerId, textureId]; + return [ + playerId, + textureId, + ]; } Object encode() { - return _toList(); - } + return _toList(); } static TexturePlayerIds decode(Object result) { result as List; @@ -165,11 +179,15 @@ class TexturePlayerIds { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()); + int get hashCode => Object.hashAll(_toList()) +; } class PlaybackState { - PlaybackState({required this.playPosition, required this.bufferPosition}); + PlaybackState({ + required this.playPosition, + required this.bufferPosition, + }); /// The current playback position, in milliseconds. int playPosition; @@ -178,12 +196,14 @@ class PlaybackState { int bufferPosition; List _toList() { - return [playPosition, bufferPosition]; + return [ + playPosition, + bufferPosition, + ]; } Object encode() { - return _toList(); - } + return _toList(); } static PlaybackState decode(Object result) { result as List; @@ -207,9 +227,11 @@ class PlaybackState { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()); + int get hashCode => Object.hashAll(_toList()) +; } + class _PigeonCodec extends StandardMessageCodec { const _PigeonCodec(); @override @@ -217,19 +239,19 @@ class _PigeonCodec extends StandardMessageCodec { if (value is int) { buffer.putUint8(4); buffer.putInt64(value); - } else if (value is PlatformVideoFormat) { + } else if (value is PlatformVideoFormat) { buffer.putUint8(129); writeValue(buffer, value.index); - } else if (value is PlatformVideoViewCreationParams) { + } else if (value is PlatformVideoViewCreationParams) { buffer.putUint8(130); writeValue(buffer, value.encode()); - } else if (value is CreationOptions) { + } else if (value is CreationOptions) { buffer.putUint8(131); writeValue(buffer, value.encode()); - } else if (value is TexturePlayerIds) { + } else if (value is TexturePlayerIds) { buffer.putUint8(132); writeValue(buffer, value.encode()); - } else if (value is PlaybackState) { + } else if (value is PlaybackState) { buffer.putUint8(133); writeValue(buffer, value.encode()); } else { @@ -240,16 +262,16 @@ class _PigeonCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 129: + case 129: final int? value = readValue(buffer) as int?; return value == null ? null : PlatformVideoFormat.values[value]; - case 130: + case 130: return PlatformVideoViewCreationParams.decode(readValue(buffer)!); - case 131: + case 131: return CreationOptions.decode(readValue(buffer)!); - case 132: + case 132: return TexturePlayerIds.decode(readValue(buffer)!); - case 133: + case 133: return PlaybackState.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -261,13 +283,9 @@ class AndroidVideoPlayerApi { /// Constructor for [AndroidVideoPlayerApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - AndroidVideoPlayerApi({ - BinaryMessenger? binaryMessenger, - String messageChannelSuffix = '', - }) : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty - ? '.$messageChannelSuffix' - : ''; + AndroidVideoPlayerApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) + : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -275,14 +293,12 @@ class AndroidVideoPlayerApi { final String pigeonVar_messageChannelSuffix; Future initialize() async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.initialize$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.initialize$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; @@ -300,17 +316,13 @@ class AndroidVideoPlayerApi { } Future createForPlatformView(CreationOptions options) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.createForPlatformView$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send( - [options], + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.createForPlatformView$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([options]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -332,17 +344,13 @@ class AndroidVideoPlayerApi { } Future createForTextureView(CreationOptions options) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.createForTextureView$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send( - [options], + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.createForTextureView$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([options]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -364,17 +372,13 @@ class AndroidVideoPlayerApi { } Future dispose(int playerId) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.dispose$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send( - [playerId], + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.dispose$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([playerId]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -391,17 +395,36 @@ class AndroidVideoPlayerApi { } Future setMixWithOthers(bool mixWithOthers) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.setMixWithOthers$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send( - [mixWithOthers], + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.setMixWithOthers$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([mixWithOthers]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + } + + Future setAllowBackgroundPlayback(bool allowBackgroundPlayback) async { + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.setAllowBackgroundPlayback$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([allowBackgroundPlayback]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -418,17 +441,13 @@ class AndroidVideoPlayerApi { } Future getLookupKeyForAsset(String asset, String? packageName) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.getLookupKeyForAsset$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send( - [asset, packageName], + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.getLookupKeyForAsset$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([asset, packageName]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -454,13 +473,9 @@ class VideoPlayerInstanceApi { /// Constructor for [VideoPlayerInstanceApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - VideoPlayerInstanceApi({ - BinaryMessenger? binaryMessenger, - String messageChannelSuffix = '', - }) : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty - ? '.$messageChannelSuffix' - : ''; + VideoPlayerInstanceApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) + : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -469,17 +484,13 @@ class VideoPlayerInstanceApi { /// Sets whether to automatically loop playback of the video. Future setLooping(bool looping) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setLooping$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send( - [looping], + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setLooping$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([looping]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -497,17 +508,13 @@ class VideoPlayerInstanceApi { /// Sets the volume, with 0.0 being muted and 1.0 being full volume. Future setVolume(double volume) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setVolume$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send( - [volume], + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setVolume$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([volume]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -525,17 +532,13 @@ class VideoPlayerInstanceApi { /// Sets the playback speed as a multiple of normal speed. Future setPlaybackSpeed(double speed) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setPlaybackSpeed$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send( - [speed], + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setPlaybackSpeed$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([speed]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -553,14 +556,12 @@ class VideoPlayerInstanceApi { /// Begins playback if the video is not currently playing. Future play() async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.play$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.play$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; @@ -579,14 +580,12 @@ class VideoPlayerInstanceApi { /// Pauses playback if the video is currently playing. Future pause() async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.pause$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.pause$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; @@ -605,17 +604,13 @@ class VideoPlayerInstanceApi { /// Seeks to the given playback position, in milliseconds. Future seekTo(int position) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.seekTo$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send( - [position], + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.seekTo$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([position]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -636,14 +631,12 @@ class VideoPlayerInstanceApi { /// This is combined into a single call to minimize platform channel calls for /// state that needs to be polled frequently. Future getPlaybackState() async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.getPlaybackState$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.getPlaybackState$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; diff --git a/packages/video_player/video_player_android/pigeons/messages.dart b/packages/video_player/video_player_android/pigeons/messages.dart index 3762c0703e2..d9626a6b343 100644 --- a/packages/video_player/video_player_android/pigeons/messages.dart +++ b/packages/video_player/video_player_android/pigeons/messages.dart @@ -58,6 +58,7 @@ abstract class AndroidVideoPlayerApi { TexturePlayerIds createForTextureView(CreationOptions options); void dispose(int playerId); void setMixWithOthers(bool mixWithOthers); + void setAllowBackgroundPlayback(bool allowBackgroundPlayback); String getLookupKeyForAsset(String asset, String? packageName); } diff --git a/packages/video_player/video_player_android/pubspec.yaml b/packages/video_player/video_player_android/pubspec.yaml index 641a1ff8927..17102e883df 100644 --- a/packages/video_player/video_player_android/pubspec.yaml +++ b/packages/video_player/video_player_android/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player_android description: Android implementation of the video_player plugin. repository: https://github.com/flutter/packages/tree/main/packages/video_player/video_player_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 -version: 2.8.16 +version: 2.9.0 environment: sdk: ^3.9.0 diff --git a/packages/video_player/video_player_android/test/android_video_player_test.dart b/packages/video_player/video_player_android/test/android_video_player_test.dart index efc2c2e7aec..3d640ea7595 100644 --- a/packages/video_player/video_player_android/test/android_video_player_test.dart +++ b/packages/video_player/video_player_android/test/android_video_player_test.dart @@ -498,6 +498,24 @@ void main() { }); }); + group('setAllowBackgroundPlayback', () { + test('passes true', () async { + final (AndroidVideoPlayer player, MockAndroidVideoPlayerApi api, _) = + setUpMockPlayer(playerId: 1); + await player.setAllowBackgroundPlayback(true); + + verify(api.setAllowBackgroundPlayback(true)); + }); + + test('passes false', () async { + final (AndroidVideoPlayer player, MockAndroidVideoPlayerApi api, _) = + setUpMockPlayer(playerId: 1); + await player.setAllowBackgroundPlayback(false); + + verify(api.setAllowBackgroundPlayback(false)); + }); + }); + test('setVolume', () async { final ( AndroidVideoPlayer player, diff --git a/packages/video_player/video_player_avfoundation/CHANGELOG.md b/packages/video_player/video_player_avfoundation/CHANGELOG.md index d358aae1f1c..4a2e123b3f5 100644 --- a/packages/video_player/video_player_avfoundation/CHANGELOG.md +++ b/packages/video_player/video_player_avfoundation/CHANGELOG.md @@ -1,6 +1,7 @@ ## NEXT * Updates minimum supported SDK version to Flutter 3.29/Dart 3.7. +* Implements background playback functionality using allowBackgroundPlayback option. ## 2.8.4 diff --git a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m index d1914d9f7c1..6babc9319eb 100644 --- a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m @@ -240,6 +240,30 @@ - (void)setMixWithOthers:(BOOL)mixWithOthers #endif } +- (void)setAllowBackgroundPlayback:(BOOL)allowBackgroundPlayback + error:(FlutterError **)error { +#if TARGET_OS_IOS + if (allowBackgroundPlayback) { + upgradeAudioSessionCategory(AVAudioSessionCategoryPlayback, + AVAudioSessionCategoryOptionMixWithOthers, 0); + } else { + upgradeAudioSessionCategory(AVAudioSession.sharedInstance.category, 0, 0); + } +#endif +} + +- (void)setAllowBackgroundPlayback:(BOOL)allowBackgroundPlayback + error:(FlutterError **)error { +#if TARGET_OS_IOS + if (allowBackgroundPlayback) { + upgradeAudioSessionCategory(AVAudioSessionCategoryPlayback, + AVAudioSessionCategoryOptionMixWithOthers, 0); + } else { + upgradeAudioSessionCategory(AVAudioSession.sharedInstance.category, 0, 0); + } +#endif +} + - (nullable NSString *)fileURLForAssetWithName:(NSString *)asset package:(nullable NSString *)package error:(FlutterError *_Nullable *_Nonnull)error { diff --git a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/include/video_player_avfoundation/messages.g.h b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/include/video_player_avfoundation/messages.g.h index becb97700e9..842c525dcdd 100644 --- a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/include/video_player_avfoundation/messages.g.h +++ b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/include/video_player_avfoundation/messages.g.h @@ -21,25 +21,26 @@ NS_ASSUME_NONNULL_BEGIN @interface FVPPlatformVideoViewCreationParams : NSObject /// `init` unavailable to enforce nonnull fields, see the `make` class method. - (instancetype)init NS_UNAVAILABLE; -+ (instancetype)makeWithPlayerId:(NSInteger)playerId; -@property(nonatomic, assign) NSInteger playerId; ++ (instancetype)makeWithPlayerId:(NSInteger )playerId; +@property(nonatomic, assign) NSInteger playerId; @end @interface FVPCreationOptions : NSObject /// `init` unavailable to enforce nonnull fields, see the `make` class method. - (instancetype)init NS_UNAVAILABLE; + (instancetype)makeWithUri:(NSString *)uri - httpHeaders:(NSDictionary *)httpHeaders; -@property(nonatomic, copy) NSString *uri; -@property(nonatomic, copy) NSDictionary *httpHeaders; + httpHeaders:(NSDictionary *)httpHeaders; +@property(nonatomic, copy) NSString * uri; +@property(nonatomic, copy) NSDictionary * httpHeaders; @end @interface FVPTexturePlayerIds : NSObject /// `init` unavailable to enforce nonnull fields, see the `make` class method. - (instancetype)init NS_UNAVAILABLE; -+ (instancetype)makeWithPlayerId:(NSInteger)playerId textureId:(NSInteger)textureId; -@property(nonatomic, assign) NSInteger playerId; -@property(nonatomic, assign) NSInteger textureId; ++ (instancetype)makeWithPlayerId:(NSInteger )playerId + textureId:(NSInteger )textureId; +@property(nonatomic, assign) NSInteger playerId; +@property(nonatomic, assign) NSInteger textureId; @end /// The codec used by all APIs. @@ -48,25 +49,18 @@ NSObject *FVPGetMessagesCodec(void); @protocol FVPAVFoundationVideoPlayerApi - (void)initialize:(FlutterError *_Nullable *_Nonnull)error; /// @return `nil` only when `error != nil`. -- (nullable NSNumber *)createPlatformViewPlayerWithOptions:(FVPCreationOptions *)params - error:(FlutterError *_Nullable *_Nonnull)error; +- (nullable NSNumber *)createPlatformViewPlayerWithOptions:(FVPCreationOptions *)params error:(FlutterError *_Nullable *_Nonnull)error; /// @return `nil` only when `error != nil`. -- (nullable FVPTexturePlayerIds *) - createTexturePlayerWithOptions:(FVPCreationOptions *)creationOptions - error:(FlutterError *_Nullable *_Nonnull)error; +- (nullable FVPTexturePlayerIds *)createTexturePlayerWithOptions:(FVPCreationOptions *)creationOptions error:(FlutterError *_Nullable *_Nonnull)error; - (void)setMixWithOthers:(BOOL)mixWithOthers error:(FlutterError *_Nullable *_Nonnull)error; -- (nullable NSString *)fileURLForAssetWithName:(NSString *)asset - package:(nullable NSString *)package - error:(FlutterError *_Nullable *_Nonnull)error; +- (void)setAllowBackgroundPlayback:(BOOL)allowBackgroundPlayback error:(FlutterError *_Nullable *_Nonnull)error; +- (nullable NSString *)fileURLForAssetWithName:(NSString *)asset package:(nullable NSString *)package error:(FlutterError *_Nullable *_Nonnull)error; @end -extern void SetUpFVPAVFoundationVideoPlayerApi( - id binaryMessenger, - NSObject *_Nullable api); +extern void SetUpFVPAVFoundationVideoPlayerApi(id binaryMessenger, NSObject *_Nullable api); + +extern void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id binaryMessenger, NSObject *_Nullable api, NSString *messageChannelSuffix); -extern void SetUpFVPAVFoundationVideoPlayerApiWithSuffix( - id binaryMessenger, - NSObject *_Nullable api, NSString *messageChannelSuffix); @protocol FVPVideoPlayerInstanceApi - (void)setLooping:(BOOL)looping error:(FlutterError *_Nullable *_Nonnull)error; @@ -80,11 +74,8 @@ extern void SetUpFVPAVFoundationVideoPlayerApiWithSuffix( - (void)disposeWithError:(FlutterError *_Nullable *_Nonnull)error; @end -extern void SetUpFVPVideoPlayerInstanceApi(id binaryMessenger, - NSObject *_Nullable api); +extern void SetUpFVPVideoPlayerInstanceApi(id binaryMessenger, NSObject *_Nullable api); -extern void SetUpFVPVideoPlayerInstanceApiWithSuffix( - id binaryMessenger, NSObject *_Nullable api, - NSString *messageChannelSuffix); +extern void SetUpFVPVideoPlayerInstanceApiWithSuffix(id binaryMessenger, NSObject *_Nullable api, NSString *messageChannelSuffix); NS_ASSUME_NONNULL_END diff --git a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/messages.g.m b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/messages.g.m index 5caf390b96a..b485b4494fa 100644 --- a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/messages.g.m +++ b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/messages.g.m @@ -49,15 +49,13 @@ + (nullable FVPTexturePlayerIds *)nullableFromList:(NSArray *)list; @end @implementation FVPPlatformVideoViewCreationParams -+ (instancetype)makeWithPlayerId:(NSInteger)playerId { - FVPPlatformVideoViewCreationParams *pigeonResult = - [[FVPPlatformVideoViewCreationParams alloc] init]; ++ (instancetype)makeWithPlayerId:(NSInteger )playerId { + FVPPlatformVideoViewCreationParams* pigeonResult = [[FVPPlatformVideoViewCreationParams alloc] init]; pigeonResult.playerId = playerId; return pigeonResult; } + (FVPPlatformVideoViewCreationParams *)fromList:(NSArray *)list { - FVPPlatformVideoViewCreationParams *pigeonResult = - [[FVPPlatformVideoViewCreationParams alloc] init]; + FVPPlatformVideoViewCreationParams *pigeonResult = [[FVPPlatformVideoViewCreationParams alloc] init]; pigeonResult.playerId = [GetNullableObjectAtIndex(list, 0) integerValue]; return pigeonResult; } @@ -73,8 +71,8 @@ + (nullable FVPPlatformVideoViewCreationParams *)nullableFromList:(NSArray * @implementation FVPCreationOptions + (instancetype)makeWithUri:(NSString *)uri - httpHeaders:(NSDictionary *)httpHeaders { - FVPCreationOptions *pigeonResult = [[FVPCreationOptions alloc] init]; + httpHeaders:(NSDictionary *)httpHeaders { + FVPCreationOptions* pigeonResult = [[FVPCreationOptions alloc] init]; pigeonResult.uri = uri; pigeonResult.httpHeaders = httpHeaders; return pigeonResult; @@ -97,8 +95,9 @@ + (nullable FVPCreationOptions *)nullableFromList:(NSArray *)list { @end @implementation FVPTexturePlayerIds -+ (instancetype)makeWithPlayerId:(NSInteger)playerId textureId:(NSInteger)textureId { - FVPTexturePlayerIds *pigeonResult = [[FVPTexturePlayerIds alloc] init]; ++ (instancetype)makeWithPlayerId:(NSInteger )playerId + textureId:(NSInteger )textureId { + FVPTexturePlayerIds* pigeonResult = [[FVPTexturePlayerIds alloc] init]; pigeonResult.playerId = playerId; pigeonResult.textureId = textureId; return pigeonResult; @@ -125,11 +124,11 @@ @interface FVPMessagesPigeonCodecReader : FlutterStandardReader @implementation FVPMessagesPigeonCodecReader - (nullable id)readValueOfType:(UInt8)type { switch (type) { - case 129: + case 129: return [FVPPlatformVideoViewCreationParams fromList:[self readValue]]; - case 130: + case 130: return [FVPCreationOptions fromList:[self readValue]]; - case 131: + case 131: return [FVPTexturePlayerIds fromList:[self readValue]]; default: return [super readValueOfType:type]; @@ -171,35 +170,25 @@ - (FlutterStandardReader *)readerWithData:(NSData *)data { static FlutterStandardMessageCodec *sSharedObject = nil; static dispatch_once_t sPred = 0; dispatch_once(&sPred, ^{ - FVPMessagesPigeonCodecReaderWriter *readerWriter = - [[FVPMessagesPigeonCodecReaderWriter alloc] init]; + FVPMessagesPigeonCodecReaderWriter *readerWriter = [[FVPMessagesPigeonCodecReaderWriter alloc] init]; sSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter]; }); return sSharedObject; } -void SetUpFVPAVFoundationVideoPlayerApi(id binaryMessenger, - NSObject *api) { +void SetUpFVPAVFoundationVideoPlayerApi(id binaryMessenger, NSObject *api) { SetUpFVPAVFoundationVideoPlayerApiWithSuffix(binaryMessenger, api, @""); } -void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id binaryMessenger, - NSObject *api, - NSString *messageChannelSuffix) { - messageChannelSuffix = messageChannelSuffix.length > 0 - ? [NSString stringWithFormat:@".%@", messageChannelSuffix] - : @""; +void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id binaryMessenger, NSObject *api, NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 ? [NSString stringWithFormat: @".%@", messageChannelSuffix] : @""; { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.video_player_avfoundation." - @"AVFoundationVideoPlayerApi.initialize", - messageChannelSuffix] + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.initialize", messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(initialize:)], - @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to @selector(initialize:)", - api); + NSCAssert([api respondsToSelector:@selector(initialize:)], @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to @selector(initialize:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { FlutterError *error; [api initialize:&error]; @@ -210,19 +199,13 @@ void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id bin } } { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:[NSString - stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.video_player_avfoundation." - @"AVFoundationVideoPlayerApi.createForPlatformView", - messageChannelSuffix] + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.createForPlatformView", messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(createPlatformViewPlayerWithOptions:error:)], - @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to " - @"@selector(createPlatformViewPlayerWithOptions:error:)", - api); + NSCAssert([api respondsToSelector:@selector(createPlatformViewPlayerWithOptions:error:)], @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to @selector(createPlatformViewPlayerWithOptions:error:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FVPCreationOptions *arg_params = GetNullableObjectAtIndex(args, 0); @@ -235,25 +218,18 @@ void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id bin } } { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:[NSString - stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.video_player_avfoundation." - @"AVFoundationVideoPlayerApi.createForTextureView", - messageChannelSuffix] + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.createForTextureView", messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(createTexturePlayerWithOptions:error:)], - @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to " - @"@selector(createTexturePlayerWithOptions:error:)", - api); + NSCAssert([api respondsToSelector:@selector(createTexturePlayerWithOptions:error:)], @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to @selector(createTexturePlayerWithOptions:error:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FVPCreationOptions *arg_creationOptions = GetNullableObjectAtIndex(args, 0); FlutterError *error; - FVPTexturePlayerIds *output = [api createTexturePlayerWithOptions:arg_creationOptions - error:&error]; + FVPTexturePlayerIds *output = [api createTexturePlayerWithOptions:arg_creationOptions error:&error]; callback(wrapResult(output, error)); }]; } else { @@ -261,18 +237,13 @@ void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id bin } } { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.video_player_avfoundation." - @"AVFoundationVideoPlayerApi.setMixWithOthers", - messageChannelSuffix] + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.setMixWithOthers", messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(setMixWithOthers:error:)], - @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to " - @"@selector(setMixWithOthers:error:)", - api); + NSCAssert([api respondsToSelector:@selector(setMixWithOthers:error:)], @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to @selector(setMixWithOthers:error:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; BOOL arg_mixWithOthers = [GetNullableObjectAtIndex(args, 0) boolValue]; @@ -285,18 +256,32 @@ void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id bin } } { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.video_player_avfoundation." - @"AVFoundationVideoPlayerApi.getAssetUrl", - messageChannelSuffix] + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.setAllowBackgroundPlayback", messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:FVPGetMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(setAllowBackgroundPlayback:error:)], @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to @selector(setAllowBackgroundPlayback:error:)", api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + BOOL arg_allowBackgroundPlayback = [GetNullableObjectAtIndex(args, 0) boolValue]; + FlutterError *error; + [api setAllowBackgroundPlayback:arg_allowBackgroundPlayback error:&error]; + callback(wrapResult(nil, error)); + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.getAssetUrl", messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(fileURLForAssetWithName:package:error:)], - @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to " - @"@selector(fileURLForAssetWithName:package:error:)", - api); + NSCAssert([api respondsToSelector:@selector(fileURLForAssetWithName:package:error:)], @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to @selector(fileURLForAssetWithName:package:error:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; NSString *arg_asset = GetNullableObjectAtIndex(args, 0); @@ -310,30 +295,20 @@ void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id bin } } } -void SetUpFVPVideoPlayerInstanceApi(id binaryMessenger, - NSObject *api) { +void SetUpFVPVideoPlayerInstanceApi(id binaryMessenger, NSObject *api) { SetUpFVPVideoPlayerInstanceApiWithSuffix(binaryMessenger, api, @""); } -void SetUpFVPVideoPlayerInstanceApiWithSuffix(id binaryMessenger, - NSObject *api, - NSString *messageChannelSuffix) { - messageChannelSuffix = messageChannelSuffix.length > 0 - ? [NSString stringWithFormat:@".%@", messageChannelSuffix] - : @""; +void SetUpFVPVideoPlayerInstanceApiWithSuffix(id binaryMessenger, NSObject *api, NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 ? [NSString stringWithFormat: @".%@", messageChannelSuffix] : @""; { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.video_player_avfoundation." - @"VideoPlayerInstanceApi.setLooping", - messageChannelSuffix] + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.setLooping", messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert( - [api respondsToSelector:@selector(setLooping:error:)], - @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(setLooping:error:)", - api); + NSCAssert([api respondsToSelector:@selector(setLooping:error:)], @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(setLooping:error:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; BOOL arg_looping = [GetNullableObjectAtIndex(args, 0) boolValue]; @@ -346,18 +321,13 @@ void SetUpFVPVideoPlayerInstanceApiWithSuffix(id binaryM } } { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.video_player_avfoundation." - @"VideoPlayerInstanceApi.setVolume", - messageChannelSuffix] + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.setVolume", messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert( - [api respondsToSelector:@selector(setVolume:error:)], - @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(setVolume:error:)", - api); + NSCAssert([api respondsToSelector:@selector(setVolume:error:)], @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(setVolume:error:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; double arg_volume = [GetNullableObjectAtIndex(args, 0) doubleValue]; @@ -370,18 +340,13 @@ void SetUpFVPVideoPlayerInstanceApiWithSuffix(id binaryM } } { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.video_player_avfoundation." - @"VideoPlayerInstanceApi.setPlaybackSpeed", - messageChannelSuffix] + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.setPlaybackSpeed", messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(setPlaybackSpeed:error:)], - @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to " - @"@selector(setPlaybackSpeed:error:)", - api); + NSCAssert([api respondsToSelector:@selector(setPlaybackSpeed:error:)], @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(setPlaybackSpeed:error:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; double arg_speed = [GetNullableObjectAtIndex(args, 0) doubleValue]; @@ -394,17 +359,13 @@ void SetUpFVPVideoPlayerInstanceApiWithSuffix(id binaryM } } { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.video_player_avfoundation." - @"VideoPlayerInstanceApi.play", - messageChannelSuffix] + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.play", messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(playWithError:)], - @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(playWithError:)", - api); + NSCAssert([api respondsToSelector:@selector(playWithError:)], @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(playWithError:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { FlutterError *error; [api playWithError:&error]; @@ -415,16 +376,13 @@ void SetUpFVPVideoPlayerInstanceApiWithSuffix(id binaryM } } { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.video_player_avfoundation." - @"VideoPlayerInstanceApi.getPosition", - messageChannelSuffix] + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.getPosition", messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(position:)], - @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(position:)", api); + NSCAssert([api respondsToSelector:@selector(position:)], @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(position:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { FlutterError *error; NSNumber *output = [api position:&error]; @@ -435,42 +393,32 @@ void SetUpFVPVideoPlayerInstanceApiWithSuffix(id binaryM } } { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.video_player_avfoundation." - @"VideoPlayerInstanceApi.seekTo", - messageChannelSuffix] + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.seekTo", messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert( - [api respondsToSelector:@selector(seekTo:completion:)], - @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(seekTo:completion:)", - api); + NSCAssert([api respondsToSelector:@selector(seekTo:completion:)], @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(seekTo:completion:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; NSInteger arg_position = [GetNullableObjectAtIndex(args, 0) integerValue]; - [api seekTo:arg_position - completion:^(FlutterError *_Nullable error) { - callback(wrapResult(nil, error)); - }]; + [api seekTo:arg_position completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; }]; } else { [channel setMessageHandler:nil]; } } { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.video_player_avfoundation." - @"VideoPlayerInstanceApi.pause", - messageChannelSuffix] + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.pause", messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(pauseWithError:)], - @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(pauseWithError:)", - api); + NSCAssert([api respondsToSelector:@selector(pauseWithError:)], @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(pauseWithError:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { FlutterError *error; [api pauseWithError:&error]; @@ -481,18 +429,13 @@ void SetUpFVPVideoPlayerInstanceApiWithSuffix(id binaryM } } { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.video_player_avfoundation." - @"VideoPlayerInstanceApi.dispose", - messageChannelSuffix] + FlutterBasicMessageChannel *channel = + [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.dispose", messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert( - [api respondsToSelector:@selector(disposeWithError:)], - @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(disposeWithError:)", - api); + NSCAssert([api respondsToSelector:@selector(disposeWithError:)], @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(disposeWithError:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { FlutterError *error; [api disposeWithError:&error]; diff --git a/packages/video_player/video_player_avfoundation/lib/src/avfoundation_video_player.dart b/packages/video_player/video_player_avfoundation/lib/src/avfoundation_video_player.dart index 98ab00cf8d5..e87861447c7 100644 --- a/packages/video_player/video_player_avfoundation/lib/src/avfoundation_video_player.dart +++ b/packages/video_player/video_player_avfoundation/lib/src/avfoundation_video_player.dart @@ -212,6 +212,11 @@ class AVFoundationVideoPlayer extends VideoPlayerPlatform { return _api.setMixWithOthers(mixWithOthers); } + @override + Future setAllowBackgroundPlayback(bool allowBackgroundPlayback) { + return _api.setAllowBackgroundPlayback(allowBackgroundPlayback); + } + @override Widget buildView(int playerId) { return buildViewWithOptions(VideoViewOptions(playerId: playerId)); diff --git a/packages/video_player/video_player_avfoundation/lib/src/messages.g.dart b/packages/video_player/video_player_avfoundation/lib/src/messages.g.dart index 842210ef11e..19eda5cd136 100644 --- a/packages/video_player/video_player_avfoundation/lib/src/messages.g.dart +++ b/packages/video_player/video_player_avfoundation/lib/src/messages.g.dart @@ -17,49 +17,49 @@ PlatformException _createConnectionError(String channelName) { message: 'Unable to establish connection on channel: "$channelName".', ); } - bool _deepEquals(Object? a, Object? b) { if (a is List && b is List) { return a.length == b.length && - a.indexed.every( - ((int, dynamic) item) => _deepEquals(item.$2, b[item.$1]), - ); + a.indexed + .every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1])); } if (a is Map && b is Map) { - return a.length == b.length && - a.entries.every( - (MapEntry entry) => - (b as Map).containsKey(entry.key) && - _deepEquals(entry.value, b[entry.key]), - ); + return a.length == b.length && a.entries.every((MapEntry entry) => + (b as Map).containsKey(entry.key) && + _deepEquals(entry.value, b[entry.key])); } return a == b; } + /// Information passed to the platform view creation. class PlatformVideoViewCreationParams { - PlatformVideoViewCreationParams({required this.playerId}); + PlatformVideoViewCreationParams({ + required this.playerId, + }); int playerId; List _toList() { - return [playerId]; + return [ + playerId, + ]; } Object encode() { - return _toList(); - } + return _toList(); } static PlatformVideoViewCreationParams decode(Object result) { result as List; - return PlatformVideoViewCreationParams(playerId: result[0]! as int); + return PlatformVideoViewCreationParams( + playerId: result[0]! as int, + ); } @override // ignore: avoid_equals_and_hash_code_on_mutable_classes bool operator ==(Object other) { - if (other is! PlatformVideoViewCreationParams || - other.runtimeType != runtimeType) { + if (other is! PlatformVideoViewCreationParams || other.runtimeType != runtimeType) { return false; } if (identical(this, other)) { @@ -70,30 +70,35 @@ class PlatformVideoViewCreationParams { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()); + int get hashCode => Object.hashAll(_toList()) +; } class CreationOptions { - CreationOptions({required this.uri, required this.httpHeaders}); + CreationOptions({ + required this.uri, + required this.httpHeaders, + }); String uri; Map httpHeaders; List _toList() { - return [uri, httpHeaders]; + return [ + uri, + httpHeaders, + ]; } Object encode() { - return _toList(); - } + return _toList(); } static CreationOptions decode(Object result) { result as List; return CreationOptions( uri: result[0]! as String, - httpHeaders: - (result[1] as Map?)!.cast(), + httpHeaders: (result[1] as Map?)!.cast(), ); } @@ -111,23 +116,29 @@ class CreationOptions { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()); + int get hashCode => Object.hashAll(_toList()) +; } class TexturePlayerIds { - TexturePlayerIds({required this.playerId, required this.textureId}); + TexturePlayerIds({ + required this.playerId, + required this.textureId, + }); int playerId; int textureId; List _toList() { - return [playerId, textureId]; + return [ + playerId, + textureId, + ]; } Object encode() { - return _toList(); - } + return _toList(); } static TexturePlayerIds decode(Object result) { result as List; @@ -151,9 +162,11 @@ class TexturePlayerIds { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()); + int get hashCode => Object.hashAll(_toList()) +; } + class _PigeonCodec extends StandardMessageCodec { const _PigeonCodec(); @override @@ -161,13 +174,13 @@ class _PigeonCodec extends StandardMessageCodec { if (value is int) { buffer.putUint8(4); buffer.putInt64(value); - } else if (value is PlatformVideoViewCreationParams) { + } else if (value is PlatformVideoViewCreationParams) { buffer.putUint8(129); writeValue(buffer, value.encode()); - } else if (value is CreationOptions) { + } else if (value is CreationOptions) { buffer.putUint8(130); writeValue(buffer, value.encode()); - } else if (value is TexturePlayerIds) { + } else if (value is TexturePlayerIds) { buffer.putUint8(131); writeValue(buffer, value.encode()); } else { @@ -178,11 +191,11 @@ class _PigeonCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 129: + case 129: return PlatformVideoViewCreationParams.decode(readValue(buffer)!); - case 130: + case 130: return CreationOptions.decode(readValue(buffer)!); - case 131: + case 131: return TexturePlayerIds.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -194,12 +207,9 @@ class AVFoundationVideoPlayerApi { /// Constructor for [AVFoundationVideoPlayerApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - AVFoundationVideoPlayerApi({ - BinaryMessenger? binaryMessenger, - String messageChannelSuffix = '', - }) : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = - messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + AVFoundationVideoPlayerApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) + : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -207,14 +217,12 @@ class AVFoundationVideoPlayerApi { final String pigeonVar_messageChannelSuffix; Future initialize() async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.initialize$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.initialize$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; @@ -232,17 +240,13 @@ class AVFoundationVideoPlayerApi { } Future createForPlatformView(CreationOptions params) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.createForPlatformView$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send( - [params], + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.createForPlatformView$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([params]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -263,20 +267,14 @@ class AVFoundationVideoPlayerApi { } } - Future createForTextureView( - CreationOptions creationOptions, - ) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.createForTextureView$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send( - [creationOptions], + Future createForTextureView(CreationOptions creationOptions) async { + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.createForTextureView$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([creationOptions]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -298,17 +296,36 @@ class AVFoundationVideoPlayerApi { } Future setMixWithOthers(bool mixWithOthers) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.setMixWithOthers$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send( - [mixWithOthers], + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.setMixWithOthers$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([mixWithOthers]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + } + + Future setAllowBackgroundPlayback(bool allowBackgroundPlayback) async { + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.setAllowBackgroundPlayback$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([allowBackgroundPlayback]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -325,17 +342,13 @@ class AVFoundationVideoPlayerApi { } Future getAssetUrl(String asset, String? package) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.getAssetUrl$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send( - [asset, package], + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.getAssetUrl$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([asset, package]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -356,12 +369,9 @@ class VideoPlayerInstanceApi { /// Constructor for [VideoPlayerInstanceApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - VideoPlayerInstanceApi({ - BinaryMessenger? binaryMessenger, - String messageChannelSuffix = '', - }) : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = - messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + VideoPlayerInstanceApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) + : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -369,17 +379,13 @@ class VideoPlayerInstanceApi { final String pigeonVar_messageChannelSuffix; Future setLooping(bool looping) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.setLooping$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send( - [looping], + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.setLooping$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([looping]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -396,17 +402,13 @@ class VideoPlayerInstanceApi { } Future setVolume(double volume) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.setVolume$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send( - [volume], + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.setVolume$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([volume]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -423,17 +425,13 @@ class VideoPlayerInstanceApi { } Future setPlaybackSpeed(double speed) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.setPlaybackSpeed$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send( - [speed], + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.setPlaybackSpeed$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([speed]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -450,14 +448,12 @@ class VideoPlayerInstanceApi { } Future play() async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.play$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.play$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; @@ -475,14 +471,12 @@ class VideoPlayerInstanceApi { } Future getPosition() async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.getPosition$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.getPosition$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; @@ -505,17 +499,13 @@ class VideoPlayerInstanceApi { } Future seekTo(int position) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.seekTo$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send( - [position], + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.seekTo$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([position]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -532,14 +522,12 @@ class VideoPlayerInstanceApi { } Future pause() async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.pause$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.pause$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; @@ -557,14 +545,12 @@ class VideoPlayerInstanceApi { } Future dispose() async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.dispose$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.dispose$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; diff --git a/packages/video_player/video_player_avfoundation/pigeons/messages.dart b/packages/video_player/video_player_avfoundation/pigeons/messages.dart index 6e872dec145..086a2538add 100644 --- a/packages/video_player/video_player_avfoundation/pigeons/messages.dart +++ b/packages/video_player/video_player_avfoundation/pigeons/messages.dart @@ -52,6 +52,8 @@ abstract class AVFoundationVideoPlayerApi { TexturePlayerIds createForTextureView(CreationOptions creationOptions); @ObjCSelector('setMixWithOthers:') void setMixWithOthers(bool mixWithOthers); + @ObjCSelector('setAllowBackgroundPlayback:') + void setAllowBackgroundPlayback(bool allowBackgroundPlayback); @ObjCSelector('fileURLForAssetWithName:package:') String? getAssetUrl(String asset, String? package); } diff --git a/packages/video_player/video_player_avfoundation/test/avfoundation_video_player_test.dart b/packages/video_player/video_player_avfoundation/test/avfoundation_video_player_test.dart index e83ad258c31..ae29778ce16 100644 --- a/packages/video_player/video_player_avfoundation/test/avfoundation_video_player_test.dart +++ b/packages/video_player/video_player_avfoundation/test/avfoundation_video_player_test.dart @@ -455,6 +455,13 @@ void main() { }); }); + test('setAllowBackgroundPlayback does nothing', () async { + final (AVFoundationVideoPlayer player, _, _) = setUpMockPlayer(playerId: 1); + // Should complete without error, even though it's a no-op on iOS + await player.setAllowBackgroundPlayback(true); + await player.setAllowBackgroundPlayback(false); + }); + test('setVolume', () async { final ( AVFoundationVideoPlayer player, diff --git a/packages/video_player/video_player_web/CHANGELOG.md b/packages/video_player/video_player_web/CHANGELOG.md index 83c26791acd..426a5d1d7cd 100644 --- a/packages/video_player/video_player_web/CHANGELOG.md +++ b/packages/video_player/video_player_web/CHANGELOG.md @@ -1,6 +1,7 @@ ## NEXT * Updates minimum supported SDK version to Flutter 3.29/Dart 3.7. +* Implements background playback functionality using allowBackgroundPlayback option. ## 2.4.0 diff --git a/packages/video_player/video_player_web/example/integration_test/video_player_web_test.dart b/packages/video_player/video_player_web/example/integration_test/video_player_web_test.dart index dc70f9f35b6..78e4ae58527 100644 --- a/packages/video_player/video_player_web/example/integration_test/video_player_web_test.dart +++ b/packages/video_player/video_player_web/example/integration_test/video_player_web_test.dart @@ -203,6 +203,14 @@ void main() { expect(VideoPlayerPlatform.instance.setMixWithOthers(false), completes); }); + testWidgets('ignores setting allowBackgroundPlayback', + (WidgetTester tester) async { + expect(VideoPlayerPlatform.instance.setAllowBackgroundPlayback(true), + completes); + expect(VideoPlayerPlatform.instance.setAllowBackgroundPlayback(false), + completes); + }); + testWidgets( 'double call to play will emit a single isPlayingStateUpdate event', (WidgetTester tester) async { diff --git a/packages/video_player/video_player_web/lib/video_player_web.dart b/packages/video_player/video_player_web/lib/video_player_web.dart index a7061b6652a..2ec3981120c 100644 --- a/packages/video_player/video_player_web/lib/video_player_web.dart +++ b/packages/video_player/video_player_web/lib/video_player_web.dart @@ -170,4 +170,9 @@ class VideoPlayerPlugin extends VideoPlayerPlatform { /// Sets the audio mode to mix with other sources (ignored). @override Future setMixWithOthers(bool mixWithOthers) => Future.value(); + + /// Sets the audio mode to allow background playback (ignored). + @override + Future setAllowBackgroundPlayback(bool allowBackgroundPlayback) => + Future.value(); } From bce7066540eb45705f3dd6308c022b25c0420c07 Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Tue, 6 May 2025 17:35:09 +0200 Subject: [PATCH 02/23] Remove unnecessary iOS code --- .../video_player_avfoundation/FVPVideoPlayerPlugin.m | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m index 6babc9319eb..c620333b66c 100644 --- a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m @@ -243,12 +243,7 @@ - (void)setMixWithOthers:(BOOL)mixWithOthers - (void)setAllowBackgroundPlayback:(BOOL)allowBackgroundPlayback error:(FlutterError **)error { #if TARGET_OS_IOS - if (allowBackgroundPlayback) { - upgradeAudioSessionCategory(AVAudioSessionCategoryPlayback, - AVAudioSessionCategoryOptionMixWithOthers, 0); - } else { - upgradeAudioSessionCategory(AVAudioSession.sharedInstance.category, 0, 0); - } + // Do nothing here, the background playback still works #endif } From ea276cca0542652f37973ebbe5e8747e757aed63 Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Wed, 7 May 2025 11:03:31 +0200 Subject: [PATCH 03/23] Use path-based dependency overrides --- packages/camera/camera/example/pubspec.yaml | 4 ++++ packages/camera/camera_android/example/pubspec.yaml | 4 ++++ .../camera/camera_android_camerax/example/pubspec.yaml | 4 ++++ packages/camera/camera_avfoundation/example/pubspec.yaml | 4 ++++ packages/image_picker/image_picker/example/pubspec.yaml | 4 ++++ .../image_picker/image_picker_android/example/pubspec.yaml | 4 ++++ .../image_picker/image_picker_ios/example/pubspec.yaml | 4 ++++ .../image_picker/image_picker_linux/example/pubspec.yaml | 4 ++++ .../image_picker/image_picker_macos/example/pubspec.yaml | 4 ++++ .../image_picker/image_picker_windows/example/pubspec.yaml | 4 ++++ packages/interactive_media_ads/example/pubspec.yaml | 4 ++++ packages/video_player/video_player/example/pubspec.yaml | 7 +++++++ packages/video_player/video_player/pubspec.yaml | 7 +++++++ .../video_player/video_player_android/example/pubspec.yaml | 4 ++++ packages/video_player/video_player_android/pubspec.yaml | 4 ++++ .../video_player_avfoundation/example/pubspec.yaml | 4 ++++ .../video_player/video_player_avfoundation/pubspec.yaml | 4 ++++ .../video_player/video_player_web/example/pubspec.yaml | 4 ++++ packages/video_player/video_player_web/pubspec.yaml | 4 ++++ 19 files changed, 82 insertions(+) diff --git a/packages/camera/camera/example/pubspec.yaml b/packages/camera/camera/example/pubspec.yaml index e268268e320..126da5058c6 100644 --- a/packages/camera/camera/example/pubspec.yaml +++ b/packages/camera/camera/example/pubspec.yaml @@ -31,3 +31,7 @@ dev_dependencies: flutter: uses-material-design: true +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player: {path: ../../../../packages/video_player/video_player} diff --git a/packages/camera/camera_android/example/pubspec.yaml b/packages/camera/camera_android/example/pubspec.yaml index f4d614defd6..7a900e6ded4 100644 --- a/packages/camera/camera_android/example/pubspec.yaml +++ b/packages/camera/camera_android/example/pubspec.yaml @@ -31,3 +31,7 @@ dev_dependencies: flutter: uses-material-design: true +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player: {path: ../../../../packages/video_player/video_player} diff --git a/packages/camera/camera_android_camerax/example/pubspec.yaml b/packages/camera/camera_android_camerax/example/pubspec.yaml index 81a4e079b2a..9a958c9bbfb 100644 --- a/packages/camera/camera_android_camerax/example/pubspec.yaml +++ b/packages/camera/camera_android_camerax/example/pubspec.yaml @@ -28,4 +28,8 @@ dev_dependencies: flutter: uses-material-design: true +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player: {path: ../../../../packages/video_player/video_player} diff --git a/packages/camera/camera_avfoundation/example/pubspec.yaml b/packages/camera/camera_avfoundation/example/pubspec.yaml index 4b9a5b5a5e5..be3f4eb3c76 100644 --- a/packages/camera/camera_avfoundation/example/pubspec.yaml +++ b/packages/camera/camera_avfoundation/example/pubspec.yaml @@ -29,3 +29,7 @@ dev_dependencies: flutter: uses-material-design: true +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player: {path: ../../../../packages/video_player/video_player} diff --git a/packages/image_picker/image_picker/example/pubspec.yaml b/packages/image_picker/image_picker/example/pubspec.yaml index 6b736e428b6..d6d24e1ece3 100644 --- a/packages/image_picker/image_picker/example/pubspec.yaml +++ b/packages/image_picker/image_picker/example/pubspec.yaml @@ -31,3 +31,7 @@ dev_dependencies: flutter: uses-material-design: true +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player: {path: ../../../../packages/video_player/video_player} diff --git a/packages/image_picker/image_picker_android/example/pubspec.yaml b/packages/image_picker/image_picker_android/example/pubspec.yaml index 4dbd12f2e3b..44d910050da 100644 --- a/packages/image_picker/image_picker_android/example/pubspec.yaml +++ b/packages/image_picker/image_picker_android/example/pubspec.yaml @@ -33,3 +33,7 @@ dev_dependencies: flutter: uses-material-design: true +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player: {path: ../../../../packages/video_player/video_player} diff --git a/packages/image_picker/image_picker_ios/example/pubspec.yaml b/packages/image_picker/image_picker_ios/example/pubspec.yaml index ea46de1cc7e..f0602d3895b 100755 --- a/packages/image_picker/image_picker_ios/example/pubspec.yaml +++ b/packages/image_picker/image_picker_ios/example/pubspec.yaml @@ -28,3 +28,7 @@ dev_dependencies: flutter: uses-material-design: true +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player: {path: ../../../../packages/video_player/video_player} diff --git a/packages/image_picker/image_picker_linux/example/pubspec.yaml b/packages/image_picker/image_picker_linux/example/pubspec.yaml index 2d9e179c859..4fa155115d6 100644 --- a/packages/image_picker/image_picker_linux/example/pubspec.yaml +++ b/packages/image_picker/image_picker_linux/example/pubspec.yaml @@ -27,3 +27,7 @@ dev_dependencies: flutter: uses-material-design: true +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player: {path: ../../../../packages/video_player/video_player} diff --git a/packages/image_picker/image_picker_macos/example/pubspec.yaml b/packages/image_picker/image_picker_macos/example/pubspec.yaml index de7bf253b28..c0bcd7fcd36 100644 --- a/packages/image_picker/image_picker_macos/example/pubspec.yaml +++ b/packages/image_picker/image_picker_macos/example/pubspec.yaml @@ -27,3 +27,7 @@ dev_dependencies: flutter: uses-material-design: true +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player: {path: ../../../../packages/video_player/video_player} diff --git a/packages/image_picker/image_picker_windows/example/pubspec.yaml b/packages/image_picker/image_picker_windows/example/pubspec.yaml index 4bac1e1cef3..98daac0e61d 100644 --- a/packages/image_picker/image_picker_windows/example/pubspec.yaml +++ b/packages/image_picker/image_picker_windows/example/pubspec.yaml @@ -27,3 +27,7 @@ dev_dependencies: flutter: uses-material-design: true +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player: {path: ../../../../packages/video_player/video_player} diff --git a/packages/interactive_media_ads/example/pubspec.yaml b/packages/interactive_media_ads/example/pubspec.yaml index f47472464a1..862693eea00 100644 --- a/packages/interactive_media_ads/example/pubspec.yaml +++ b/packages/interactive_media_ads/example/pubspec.yaml @@ -24,3 +24,7 @@ dev_dependencies: flutter: uses-material-design: true +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player: {path: ../../../packages/video_player/video_player} diff --git a/packages/video_player/video_player/example/pubspec.yaml b/packages/video_player/video_player/example/pubspec.yaml index 6c990c8b34f..cb4a34c0fc8 100644 --- a/packages/video_player/video_player/example/pubspec.yaml +++ b/packages/video_player/video_player/example/pubspec.yaml @@ -35,3 +35,10 @@ flutter: - assets/bumble_bee_captions.srt - assets/bumble_bee_captions.vtt - assets/Audio.mp3 +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player_android: {path: ../../../../packages/video_player/video_player_android} + video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} + video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} + video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index c8863f632ff..4c2548d253a 100644 --- a/packages/video_player/video_player/pubspec.yaml +++ b/packages/video_player/video_player/pubspec.yaml @@ -38,3 +38,10 @@ dev_dependencies: topics: - video - video-player +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player_android: {path: ../../../packages/video_player/video_player_android} + video_player_avfoundation: {path: ../../../packages/video_player/video_player_avfoundation} + video_player_platform_interface: {path: ../../../packages/video_player/video_player_platform_interface} + video_player_web: {path: ../../../packages/video_player/video_player_web} diff --git a/packages/video_player/video_player_android/example/pubspec.yaml b/packages/video_player/video_player_android/example/pubspec.yaml index 4afc63d4990..1a3b7cdffff 100644 --- a/packages/video_player/video_player_android/example/pubspec.yaml +++ b/packages/video_player/video_player_android/example/pubspec.yaml @@ -34,3 +34,7 @@ flutter: assets: - assets/flutter-mark-square-64.png - assets/Butterfly-209.mp4 +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} diff --git a/packages/video_player/video_player_android/pubspec.yaml b/packages/video_player/video_player_android/pubspec.yaml index 17102e883df..9e3eb52ac40 100644 --- a/packages/video_player/video_player_android/pubspec.yaml +++ b/packages/video_player/video_player_android/pubspec.yaml @@ -32,3 +32,7 @@ dev_dependencies: topics: - video - video-player +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player_platform_interface: {path: ../../../packages/video_player/video_player_platform_interface} diff --git a/packages/video_player/video_player_avfoundation/example/pubspec.yaml b/packages/video_player/video_player_avfoundation/example/pubspec.yaml index 8d52a355e9d..1f09101e4a1 100644 --- a/packages/video_player/video_player_avfoundation/example/pubspec.yaml +++ b/packages/video_player/video_player_avfoundation/example/pubspec.yaml @@ -31,3 +31,7 @@ flutter: assets: - assets/flutter-mark-square-64.png - assets/Butterfly-209.mp4 +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} diff --git a/packages/video_player/video_player_avfoundation/pubspec.yaml b/packages/video_player/video_player_avfoundation/pubspec.yaml index 8675038ba86..60280ea543b 100644 --- a/packages/video_player/video_player_avfoundation/pubspec.yaml +++ b/packages/video_player/video_player_avfoundation/pubspec.yaml @@ -36,3 +36,7 @@ dev_dependencies: topics: - video - video-player +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player_platform_interface: {path: ../../../packages/video_player/video_player_platform_interface} diff --git a/packages/video_player/video_player_web/example/pubspec.yaml b/packages/video_player/video_player_web/example/pubspec.yaml index e3bce694990..c11ee9cfc8b 100644 --- a/packages/video_player/video_player_web/example/pubspec.yaml +++ b/packages/video_player/video_player_web/example/pubspec.yaml @@ -18,3 +18,7 @@ dev_dependencies: sdk: flutter integration_test: sdk: flutter +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} diff --git a/packages/video_player/video_player_web/pubspec.yaml b/packages/video_player/video_player_web/pubspec.yaml index ca36ffe35ee..d8ea9bd434b 100644 --- a/packages/video_player/video_player_web/pubspec.yaml +++ b/packages/video_player/video_player_web/pubspec.yaml @@ -31,3 +31,7 @@ dev_dependencies: topics: - video - video-player +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + video_player_platform_interface: {path: ../../../packages/video_player/video_player_platform_interface} From c3821a1bd55d6c0c8ba2a3a7d80f1af86c855378 Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Thu, 8 May 2025 10:04:19 +0200 Subject: [PATCH 04/23] Add missing dependency overrides --- packages/camera/camera/example/pubspec.yaml | 4 ++++ packages/camera/camera_android/example/pubspec.yaml | 4 ++++ packages/camera/camera_android_camerax/example/pubspec.yaml | 5 ++++- packages/camera/camera_avfoundation/example/pubspec.yaml | 4 ++++ packages/image_picker/image_picker/example/pubspec.yaml | 4 ++++ .../image_picker/image_picker_android/example/pubspec.yaml | 4 ++++ packages/image_picker/image_picker_ios/example/pubspec.yaml | 4 ++++ .../image_picker/image_picker_linux/example/pubspec.yaml | 4 ++++ .../image_picker/image_picker_macos/example/pubspec.yaml | 4 ++++ .../image_picker/image_picker_windows/example/pubspec.yaml | 4 ++++ packages/interactive_media_ads/example/pubspec.yaml | 4 ++++ 11 files changed, 44 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera/example/pubspec.yaml b/packages/camera/camera/example/pubspec.yaml index 126da5058c6..2bd29f84fec 100644 --- a/packages/camera/camera/example/pubspec.yaml +++ b/packages/camera/camera/example/pubspec.yaml @@ -35,3 +35,7 @@ flutter: # See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins dependency_overrides: video_player: {path: ../../../../packages/video_player/video_player} + video_player_android: {path: ../../../../packages/video_player/video_player_android} + video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} + video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} + video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/camera/camera_android/example/pubspec.yaml b/packages/camera/camera_android/example/pubspec.yaml index 7a900e6ded4..3d9a7b90c27 100644 --- a/packages/camera/camera_android/example/pubspec.yaml +++ b/packages/camera/camera_android/example/pubspec.yaml @@ -35,3 +35,7 @@ flutter: # See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins dependency_overrides: video_player: {path: ../../../../packages/video_player/video_player} + video_player_android: {path: ../../../../packages/video_player/video_player_android} + video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} + video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} + video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/camera/camera_android_camerax/example/pubspec.yaml b/packages/camera/camera_android_camerax/example/pubspec.yaml index 9a958c9bbfb..bcea060f2d5 100644 --- a/packages/camera/camera_android_camerax/example/pubspec.yaml +++ b/packages/camera/camera_android_camerax/example/pubspec.yaml @@ -32,4 +32,7 @@ flutter: # See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins dependency_overrides: video_player: {path: ../../../../packages/video_player/video_player} - + video_player_android: {path: ../../../../packages/video_player/video_player_android} + video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} + video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} + video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/camera/camera_avfoundation/example/pubspec.yaml b/packages/camera/camera_avfoundation/example/pubspec.yaml index be3f4eb3c76..3a8a2bacb2c 100644 --- a/packages/camera/camera_avfoundation/example/pubspec.yaml +++ b/packages/camera/camera_avfoundation/example/pubspec.yaml @@ -33,3 +33,7 @@ flutter: # See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins dependency_overrides: video_player: {path: ../../../../packages/video_player/video_player} + video_player_android: {path: ../../../../packages/video_player/video_player_android} + video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} + video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} + video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/image_picker/image_picker/example/pubspec.yaml b/packages/image_picker/image_picker/example/pubspec.yaml index d6d24e1ece3..18cc1912113 100644 --- a/packages/image_picker/image_picker/example/pubspec.yaml +++ b/packages/image_picker/image_picker/example/pubspec.yaml @@ -35,3 +35,7 @@ flutter: # See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins dependency_overrides: video_player: {path: ../../../../packages/video_player/video_player} + video_player_android: {path: ../../../../packages/video_player/video_player_android} + video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} + video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} + video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/image_picker/image_picker_android/example/pubspec.yaml b/packages/image_picker/image_picker_android/example/pubspec.yaml index 44d910050da..bf20e54d4e9 100644 --- a/packages/image_picker/image_picker_android/example/pubspec.yaml +++ b/packages/image_picker/image_picker_android/example/pubspec.yaml @@ -37,3 +37,7 @@ flutter: # See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins dependency_overrides: video_player: {path: ../../../../packages/video_player/video_player} + video_player_android: {path: ../../../../packages/video_player/video_player_android} + video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} + video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} + video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/image_picker/image_picker_ios/example/pubspec.yaml b/packages/image_picker/image_picker_ios/example/pubspec.yaml index f0602d3895b..aedda1a65a9 100755 --- a/packages/image_picker/image_picker_ios/example/pubspec.yaml +++ b/packages/image_picker/image_picker_ios/example/pubspec.yaml @@ -32,3 +32,7 @@ flutter: # See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins dependency_overrides: video_player: {path: ../../../../packages/video_player/video_player} + video_player_android: {path: ../../../../packages/video_player/video_player_android} + video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} + video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} + video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/image_picker/image_picker_linux/example/pubspec.yaml b/packages/image_picker/image_picker_linux/example/pubspec.yaml index 4fa155115d6..53f0d9717d6 100644 --- a/packages/image_picker/image_picker_linux/example/pubspec.yaml +++ b/packages/image_picker/image_picker_linux/example/pubspec.yaml @@ -31,3 +31,7 @@ flutter: # See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins dependency_overrides: video_player: {path: ../../../../packages/video_player/video_player} + video_player_android: {path: ../../../../packages/video_player/video_player_android} + video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} + video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} + video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/image_picker/image_picker_macos/example/pubspec.yaml b/packages/image_picker/image_picker_macos/example/pubspec.yaml index c0bcd7fcd36..25c14b60caa 100644 --- a/packages/image_picker/image_picker_macos/example/pubspec.yaml +++ b/packages/image_picker/image_picker_macos/example/pubspec.yaml @@ -31,3 +31,7 @@ flutter: # See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins dependency_overrides: video_player: {path: ../../../../packages/video_player/video_player} + video_player_android: {path: ../../../../packages/video_player/video_player_android} + video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} + video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} + video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/image_picker/image_picker_windows/example/pubspec.yaml b/packages/image_picker/image_picker_windows/example/pubspec.yaml index 98daac0e61d..6598719d836 100644 --- a/packages/image_picker/image_picker_windows/example/pubspec.yaml +++ b/packages/image_picker/image_picker_windows/example/pubspec.yaml @@ -31,3 +31,7 @@ flutter: # See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins dependency_overrides: video_player: {path: ../../../../packages/video_player/video_player} + video_player_android: {path: ../../../../packages/video_player/video_player_android} + video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} + video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} + video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/interactive_media_ads/example/pubspec.yaml b/packages/interactive_media_ads/example/pubspec.yaml index 862693eea00..50de705996a 100644 --- a/packages/interactive_media_ads/example/pubspec.yaml +++ b/packages/interactive_media_ads/example/pubspec.yaml @@ -28,3 +28,7 @@ flutter: # See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins dependency_overrides: video_player: {path: ../../../packages/video_player/video_player} + video_player_android: {path: ../../../../packages/video_player/video_player_android} + video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} + video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} + video_player_web: {path: ../../../../packages/video_player/video_player_web} From 77c89eece1659aeac0d3d221c2509460feaaaaed Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Thu, 8 May 2025 10:26:34 +0200 Subject: [PATCH 05/23] Fix incorrect dependency paths --- packages/interactive_media_ads/example/pubspec.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/interactive_media_ads/example/pubspec.yaml b/packages/interactive_media_ads/example/pubspec.yaml index 50de705996a..3c67f6a7486 100644 --- a/packages/interactive_media_ads/example/pubspec.yaml +++ b/packages/interactive_media_ads/example/pubspec.yaml @@ -28,7 +28,7 @@ flutter: # See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins dependency_overrides: video_player: {path: ../../../packages/video_player/video_player} - video_player_android: {path: ../../../../packages/video_player/video_player_android} - video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} - video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} - video_player_web: {path: ../../../../packages/video_player/video_player_web} + video_player_android: {path: ../../../packages/video_player/video_player_android} + video_player_avfoundation: {path: ../../../packages/video_player/video_player_avfoundation} + video_player_platform_interface: {path: ../../../packages/video_player/video_player_platform_interface} + video_player_web: {path: ../../../packages/video_player/video_player_web} From 19cea1e51afcc33d7c19c785536da92ebd48575c Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Thu, 8 May 2025 16:12:16 +0200 Subject: [PATCH 06/23] Revert dependency overrides for non-video_player packages --- packages/camera/camera/example/pubspec.yaml | 8 -------- packages/camera/camera_android/example/pubspec.yaml | 8 -------- .../camera/camera_android_camerax/example/pubspec.yaml | 8 -------- packages/camera/camera_avfoundation/example/pubspec.yaml | 8 -------- packages/image_picker/image_picker/example/pubspec.yaml | 8 -------- .../image_picker_android/example/pubspec.yaml | 8 -------- .../image_picker/image_picker_ios/example/pubspec.yaml | 8 -------- .../image_picker/image_picker_linux/example/pubspec.yaml | 8 -------- .../image_picker/image_picker_macos/example/pubspec.yaml | 8 -------- .../image_picker_windows/example/pubspec.yaml | 8 -------- 10 files changed, 80 deletions(-) diff --git a/packages/camera/camera/example/pubspec.yaml b/packages/camera/camera/example/pubspec.yaml index 2bd29f84fec..e268268e320 100644 --- a/packages/camera/camera/example/pubspec.yaml +++ b/packages/camera/camera/example/pubspec.yaml @@ -31,11 +31,3 @@ dev_dependencies: flutter: uses-material-design: true -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player: {path: ../../../../packages/video_player/video_player} - video_player_android: {path: ../../../../packages/video_player/video_player_android} - video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} - video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} - video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/camera/camera_android/example/pubspec.yaml b/packages/camera/camera_android/example/pubspec.yaml index 3d9a7b90c27..f4d614defd6 100644 --- a/packages/camera/camera_android/example/pubspec.yaml +++ b/packages/camera/camera_android/example/pubspec.yaml @@ -31,11 +31,3 @@ dev_dependencies: flutter: uses-material-design: true -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player: {path: ../../../../packages/video_player/video_player} - video_player_android: {path: ../../../../packages/video_player/video_player_android} - video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} - video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} - video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/camera/camera_android_camerax/example/pubspec.yaml b/packages/camera/camera_android_camerax/example/pubspec.yaml index bcea060f2d5..ec3bb5f2f7a 100644 --- a/packages/camera/camera_android_camerax/example/pubspec.yaml +++ b/packages/camera/camera_android_camerax/example/pubspec.yaml @@ -28,11 +28,3 @@ dev_dependencies: flutter: uses-material-design: true -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player: {path: ../../../../packages/video_player/video_player} - video_player_android: {path: ../../../../packages/video_player/video_player_android} - video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} - video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} - video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/camera/camera_avfoundation/example/pubspec.yaml b/packages/camera/camera_avfoundation/example/pubspec.yaml index 3a8a2bacb2c..4b9a5b5a5e5 100644 --- a/packages/camera/camera_avfoundation/example/pubspec.yaml +++ b/packages/camera/camera_avfoundation/example/pubspec.yaml @@ -29,11 +29,3 @@ dev_dependencies: flutter: uses-material-design: true -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player: {path: ../../../../packages/video_player/video_player} - video_player_android: {path: ../../../../packages/video_player/video_player_android} - video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} - video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} - video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/image_picker/image_picker/example/pubspec.yaml b/packages/image_picker/image_picker/example/pubspec.yaml index 18cc1912113..6b736e428b6 100644 --- a/packages/image_picker/image_picker/example/pubspec.yaml +++ b/packages/image_picker/image_picker/example/pubspec.yaml @@ -31,11 +31,3 @@ dev_dependencies: flutter: uses-material-design: true -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player: {path: ../../../../packages/video_player/video_player} - video_player_android: {path: ../../../../packages/video_player/video_player_android} - video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} - video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} - video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/image_picker/image_picker_android/example/pubspec.yaml b/packages/image_picker/image_picker_android/example/pubspec.yaml index bf20e54d4e9..4dbd12f2e3b 100644 --- a/packages/image_picker/image_picker_android/example/pubspec.yaml +++ b/packages/image_picker/image_picker_android/example/pubspec.yaml @@ -33,11 +33,3 @@ dev_dependencies: flutter: uses-material-design: true -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player: {path: ../../../../packages/video_player/video_player} - video_player_android: {path: ../../../../packages/video_player/video_player_android} - video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} - video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} - video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/image_picker/image_picker_ios/example/pubspec.yaml b/packages/image_picker/image_picker_ios/example/pubspec.yaml index aedda1a65a9..ea46de1cc7e 100755 --- a/packages/image_picker/image_picker_ios/example/pubspec.yaml +++ b/packages/image_picker/image_picker_ios/example/pubspec.yaml @@ -28,11 +28,3 @@ dev_dependencies: flutter: uses-material-design: true -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player: {path: ../../../../packages/video_player/video_player} - video_player_android: {path: ../../../../packages/video_player/video_player_android} - video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} - video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} - video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/image_picker/image_picker_linux/example/pubspec.yaml b/packages/image_picker/image_picker_linux/example/pubspec.yaml index 53f0d9717d6..2d9e179c859 100644 --- a/packages/image_picker/image_picker_linux/example/pubspec.yaml +++ b/packages/image_picker/image_picker_linux/example/pubspec.yaml @@ -27,11 +27,3 @@ dev_dependencies: flutter: uses-material-design: true -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player: {path: ../../../../packages/video_player/video_player} - video_player_android: {path: ../../../../packages/video_player/video_player_android} - video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} - video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} - video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/image_picker/image_picker_macos/example/pubspec.yaml b/packages/image_picker/image_picker_macos/example/pubspec.yaml index 25c14b60caa..de7bf253b28 100644 --- a/packages/image_picker/image_picker_macos/example/pubspec.yaml +++ b/packages/image_picker/image_picker_macos/example/pubspec.yaml @@ -27,11 +27,3 @@ dev_dependencies: flutter: uses-material-design: true -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player: {path: ../../../../packages/video_player/video_player} - video_player_android: {path: ../../../../packages/video_player/video_player_android} - video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} - video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} - video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/image_picker/image_picker_windows/example/pubspec.yaml b/packages/image_picker/image_picker_windows/example/pubspec.yaml index 6598719d836..4bac1e1cef3 100644 --- a/packages/image_picker/image_picker_windows/example/pubspec.yaml +++ b/packages/image_picker/image_picker_windows/example/pubspec.yaml @@ -27,11 +27,3 @@ dev_dependencies: flutter: uses-material-design: true -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player: {path: ../../../../packages/video_player/video_player} - video_player_android: {path: ../../../../packages/video_player/video_player_android} - video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} - video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} - video_player_web: {path: ../../../../packages/video_player/video_player_web} From d3b421a50174e8ecbd900fe4949f9afbba0bb23c Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Thu, 8 May 2025 16:14:57 +0200 Subject: [PATCH 07/23] Revert dependency overrides for non-video_player packages --- packages/interactive_media_ads/example/pubspec.yaml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/interactive_media_ads/example/pubspec.yaml b/packages/interactive_media_ads/example/pubspec.yaml index 3c67f6a7486..f47472464a1 100644 --- a/packages/interactive_media_ads/example/pubspec.yaml +++ b/packages/interactive_media_ads/example/pubspec.yaml @@ -24,11 +24,3 @@ dev_dependencies: flutter: uses-material-design: true -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player: {path: ../../../packages/video_player/video_player} - video_player_android: {path: ../../../packages/video_player/video_player_android} - video_player_avfoundation: {path: ../../../packages/video_player/video_player_avfoundation} - video_player_platform_interface: {path: ../../../packages/video_player/video_player_platform_interface} - video_player_web: {path: ../../../packages/video_player/video_player_web} From e3cc2c0dd3b0aadde78b7016806c254d12154a24 Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Fri, 9 May 2025 10:04:47 +0200 Subject: [PATCH 08/23] Revert pubspec.yaml changes --- packages/camera/camera_android_camerax/example/pubspec.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/camera/camera_android_camerax/example/pubspec.yaml b/packages/camera/camera_android_camerax/example/pubspec.yaml index ec3bb5f2f7a..81a4e079b2a 100644 --- a/packages/camera/camera_android_camerax/example/pubspec.yaml +++ b/packages/camera/camera_android_camerax/example/pubspec.yaml @@ -28,3 +28,4 @@ dev_dependencies: flutter: uses-material-design: true + From d4bed81acde0d1ac5d04bfc2f9813ada4e1848b7 Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Wed, 4 Jun 2025 14:26:38 +0200 Subject: [PATCH 09/23] Fix version mismatch --- packages/video_player/video_player/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index 4c2548d253a..9cab02993a3 100644 --- a/packages/video_player/video_player/pubspec.yaml +++ b/packages/video_player/video_player/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for displaying inline video with other Flutter widgets on Android, iOS, macOS and web. repository: https://github.com/flutter/packages/tree/main/packages/video_player/video_player issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 -version: 2.10.0 +version: 2.11.0 environment: sdk: ^3.7.0 From 98f55a16ffb66e12e04f5e41bff2d6782cc91d09 Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Mon, 9 Jun 2025 21:22:30 +0200 Subject: [PATCH 10/23] Remove unused options field from TextureVideoPlayer --- .../flutter/plugins/videoplayer/texture/TextureVideoPlayer.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java index 732982d94f1..b00a1332841 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java @@ -29,7 +29,6 @@ public final class TextureVideoPlayer extends VideoPlayer implements SurfaceProducer.Callback { // True when the ExoPlayer instance has a null surface. private boolean needsSurface = true; - @Nullable private final VideoPlayerOptions options; /** * Creates a texture video player. * @@ -70,7 +69,6 @@ public TextureVideoPlayer( super(events, mediaItem, options, surfaceProducer, exoPlayerProvider); surfaceProducer.setCallback(this); - this.options = options; Surface surface = surfaceProducer.getSurface(); this.exoPlayer.setVideoSurface(surface); From c835f14b7f1bd95a13f6f9975d435de168c092a2 Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Mon, 1 Sep 2025 15:53:13 +0200 Subject: [PATCH 11/23] Update README with WAKE_LOCK permissions info --- packages/video_player/video_player_android/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/video_player/video_player_android/README.md b/packages/video_player/video_player_android/README.md index 8bffc986128..f3ebf6412d0 100644 --- a/packages/video_player/video_player_android/README.md +++ b/packages/video_player/video_player_android/README.md @@ -11,6 +11,12 @@ so you do not need to add it to your `pubspec.yaml`. However, if you `import` this package to use any of its APIs directly, you should add it to your `pubspec.yaml` as usual. +If you plan to use background playback, you will also need to add the following permission in your Android Manifest file. + +```xml + +``` + ## Known issues Using `VideoViewType.platformView` is not currently recommended on Android due to a known [issue][3] affecting platform views on Android. From bc798f2f5dce1ba8a7ad64ba2fc105b8958315b6 Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Mon, 1 Sep 2025 16:40:24 +0200 Subject: [PATCH 12/23] Add wake mode tests --- .../plugins/videoplayer/VideoPlayerTest.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/packages/video_player/video_player_android/android/src/test/java/io/flutter/plugins/videoplayer/VideoPlayerTest.java b/packages/video_player/video_player_android/android/src/test/java/io/flutter/plugins/videoplayer/VideoPlayerTest.java index 4c1fd9f2134..e80d15e4e8c 100644 --- a/packages/video_player/video_player_android/android/src/test/java/io/flutter/plugins/videoplayer/VideoPlayerTest.java +++ b/packages/video_player/video_player_android/android/src/test/java/io/flutter/plugins/videoplayer/VideoPlayerTest.java @@ -217,4 +217,27 @@ public void disposeReleasesExoPlayer() { verify(mockExoPlayer).release(); } + + @Test + public void loadsAndPreparesProvidedMediaWithoutWakeModeByDefault() { + VideoPlayerOptions options = new VideoPlayerOptions(); + + VideoPlayer videoPlayer = createVideoPlayer(options); + + verify(mockExoPlayer, never()).setWakeMode(anyInt()); + + videoPlayer.dispose(); + } + + @Test + public void loadsAndPreparesProvidedMediaWakeModeWhenAllowBackgroundPlaybackSet() { + VideoPlayerOptions options = new VideoPlayerOptions(); + options.allowBackgroundPlayback = true; + + VideoPlayer videoPlayer = createVideoPlayer(options); + + verify(mockExoPlayer).setWakeMode(C.WAKE_MODE_NETWORK); + + videoPlayer.dispose(); + } } From 27bcb3bdb50845aadf8f6298e60ae378d466548a Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Thu, 16 Oct 2025 10:43:48 +0200 Subject: [PATCH 13/23] Format code and regenerate mocks after rebase --- .../integration_test/video_player_test.dart | 8 +- .../video_player/example/lib/basic.dart | 22 +- .../video_player/example/lib/main.dart | 39 +- .../video_player/lib/src/sub_rip.dart | 2 +- .../video_player/lib/src/web_vtt.dart | 2 +- .../video_player/lib/video_player.dart | 130 ++++--- .../video_player/test/video_player_test.dart | 42 +-- .../flutter/plugins/videoplayer/Messages.java | 212 +++++++---- .../plugins/videoplayer/VideoPlayer.java | 10 +- .../texture/TextureVideoPlayer.java | 2 +- .../lib/src/messages.g.dart | 348 ++++++++++-------- .../test/android_video_player_test.mocks.dart | 11 + .../lib/src/messages.g.dart | 321 +++++++++------- .../test/avfoundation_video_player_test.dart | 4 +- .../avfoundation_video_player_test.mocks.dart | 11 + .../integration_test/pkg_web_tweaks.dart | 3 +- .../integration_test/video_player_test.dart | 126 +++---- .../video_player_web_test.dart | 64 ++-- .../lib/src/video_player.dart | 24 +- .../lib/video_player_web.dart | 11 +- 20 files changed, 761 insertions(+), 631 deletions(-) diff --git a/packages/video_player/video_player/example/integration_test/video_player_test.dart b/packages/video_player/video_player/example/integration_test/video_player_test.dart index 7ddf2404957..2531bd37808 100644 --- a/packages/video_player/video_player/example/integration_test/video_player_test.dart +++ b/packages/video_player/video_player/example/integration_test/video_player_test.dart @@ -56,8 +56,8 @@ void main() { }); testWidgets('live stream duration != 0', (WidgetTester tester) async { - final VideoPlayerController - networkController = VideoPlayerController.networkUrl( + final VideoPlayerController networkController = + VideoPlayerController.networkUrl( Uri.parse( 'https://flutter.github.io/assets-for-api-docs/assets/videos/hls/bee.m3u8', ), @@ -312,8 +312,8 @@ void main() { skip: // MEDIA_ELEMENT_ERROR on web, see https://github.com/flutter/flutter/issues/169219 kIsWeb || - // Hanging on Android, see https://github.com/flutter/flutter/issues/160797 - defaultTargetPlatform == TargetPlatform.android, + // Hanging on Android, see https://github.com/flutter/flutter/issues/160797 + defaultTargetPlatform == TargetPlatform.android, ); }); diff --git a/packages/video_player/video_player/example/lib/basic.dart b/packages/video_player/video_player/example/lib/basic.dart index f8ef6029ae6..d9bc1983ccb 100644 --- a/packages/video_player/video_player/example/lib/basic.dart +++ b/packages/video_player/video_player/example/lib/basic.dart @@ -28,11 +28,10 @@ class _VideoAppState extends State { void initState() { super.initState(); _controller = VideoPlayerController.networkUrl( - Uri.parse( - 'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4', - ), - ) - ..initialize().then((_) { + Uri.parse( + 'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4', + ), + )..initialize().then((_) { // Ensure the first frame is shown after the video is initialized, even before the play button has been pressed. setState(() {}); }); @@ -44,13 +43,12 @@ class _VideoAppState extends State { title: 'Video Demo', home: Scaffold( body: Center( - child: - _controller.value.isInitialized - ? AspectRatio( - aspectRatio: _controller.value.aspectRatio, - child: VideoPlayer(_controller), - ) - : Container(), + child: _controller.value.isInitialized + ? AspectRatio( + aspectRatio: _controller.value.aspectRatio, + child: VideoPlayer(_controller), + ) + : Container(), ), floatingActionButton: FloatingActionButton( onPressed: () { diff --git a/packages/video_player/video_player/example/lib/main.dart b/packages/video_player/video_player/example/lib/main.dart index 1382af5d87d..8249f71d92a 100644 --- a/packages/video_player/video_player/example/lib/main.dart +++ b/packages/video_player/video_player/example/lib/main.dart @@ -50,17 +50,16 @@ class _App extends StatelessWidget { body: TabBarView( children: [ _ViewTypeTabBar( - builder: - (VideoViewType viewType) => _BumbleBeeRemoteVideo(viewType), + builder: (VideoViewType viewType) => + _BumbleBeeRemoteVideo(viewType), ), _ViewTypeTabBar( - builder: - (VideoViewType viewType) => _ButterFlyAssetVideo(viewType), + builder: (VideoViewType viewType) => + _ButterFlyAssetVideo(viewType), ), _ViewTypeTabBar( - builder: - (VideoViewType viewType) => - _ButterFlyAssetVideoInList(viewType), + builder: (VideoViewType viewType) => + _ButterFlyAssetVideoInList(viewType), ), ], ), @@ -146,8 +145,7 @@ class _ButterFlyAssetVideoInList extends StatelessWidget { title: Text('Video video'), ), Stack( - alignment: - FractionalOffset.bottomRight + + alignment: FractionalOffset.bottomRight + const FractionalOffset(-0.1, -0.1), children: [ _ButterFlyAssetVideo(viewType), @@ -381,20 +379,19 @@ class _ControlsOverlay extends StatelessWidget { AnimatedSwitcher( duration: const Duration(milliseconds: 50), reverseDuration: const Duration(milliseconds: 200), - child: - controller.value.isPlaying - ? const SizedBox.shrink() - : const ColoredBox( - color: Colors.black26, - child: Center( - child: Icon( - Icons.play_arrow, - color: Colors.white, - size: 100.0, - semanticLabel: 'Play', - ), + child: controller.value.isPlaying + ? const SizedBox.shrink() + : const ColoredBox( + color: Colors.black26, + child: Center( + child: Icon( + Icons.play_arrow, + color: Colors.white, + size: 100.0, + semanticLabel: 'Play', ), ), + ), ), GestureDetector( onTap: () { diff --git a/packages/video_player/video_player/lib/src/sub_rip.dart b/packages/video_player/video_player/lib/src/sub_rip.dart index 991026fd6e0..447305a2acc 100644 --- a/packages/video_player/video_player/lib/src/sub_rip.dart +++ b/packages/video_player/video_player/lib/src/sub_rip.dart @@ -13,7 +13,7 @@ class SubRipCaptionFile extends ClosedCaptionFile { /// the SubRip file format. /// * See: https://en.wikipedia.org/wiki/SubRip SubRipCaptionFile(this.fileContents) - : _captions = _parseCaptionsFromSubRipString(fileContents); + : _captions = _parseCaptionsFromSubRipString(fileContents); /// The entire body of the SubRip file. // TODO(cyanglaz): Remove this public member as it doesn't seem need to exist. diff --git a/packages/video_player/video_player/lib/src/web_vtt.dart b/packages/video_player/video_player/lib/src/web_vtt.dart index a46b602c227..b8e78560196 100644 --- a/packages/video_player/video_player/lib/src/web_vtt.dart +++ b/packages/video_player/video_player/lib/src/web_vtt.dart @@ -16,7 +16,7 @@ class WebVTTCaptionFile extends ClosedCaptionFile { /// the WebVTT file format. /// * See: https://en.wikipedia.org/wiki/WebVTT WebVTTCaptionFile(String fileContents) - : _captions = _parseCaptionsFromWebVTTString(fileContents); + : _captions = _parseCaptionsFromWebVTTString(fileContents); @override List get captions => _captions; diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart index 67e6cddd987..e71093fdda3 100644 --- a/packages/video_player/video_player/lib/video_player.dart +++ b/packages/video_player/video_player/lib/video_player.dart @@ -63,15 +63,15 @@ class VideoPlayerValue { /// Returns an instance for a video that hasn't been loaded. const VideoPlayerValue.uninitialized() - : this(duration: Duration.zero, isInitialized: false); + : this(duration: Duration.zero, isInitialized: false); /// Returns an instance with the given [errorDescription]. const VideoPlayerValue.erroneous(String errorDescription) - : this( - duration: Duration.zero, - isInitialized: false, - errorDescription: errorDescription, - ); + : this( + duration: Duration.zero, + isInitialized: false, + errorDescription: errorDescription, + ); /// This constant is just to indicate that parameter is not passed to [copyWith] /// workaround for this issue https://github.com/dart-lang/language/issues/2009 @@ -188,10 +188,9 @@ class VideoPlayerValue { volume: volume ?? this.volume, playbackSpeed: playbackSpeed ?? this.playbackSpeed, rotationCorrection: rotationCorrection ?? this.rotationCorrection, - errorDescription: - errorDescription != _defaultErrorDescription - ? errorDescription - : this.errorDescription, + errorDescription: errorDescription != _defaultErrorDescription + ? errorDescription + : this.errorDescription, isCompleted: isCompleted ?? this.isCompleted, ); } @@ -238,22 +237,22 @@ class VideoPlayerValue { @override int get hashCode => Object.hash( - duration, - position, - caption, - captionOffset, - buffered, - isPlaying, - isLooping, - isBuffering, - volume, - playbackSpeed, - errorDescription, - size, - rotationCorrection, - isInitialized, - isCompleted, - ); + duration, + position, + caption, + captionOffset, + buffered, + isPlaying, + isLooping, + isBuffering, + volume, + playbackSpeed, + errorDescription, + size, + rotationCorrection, + isInitialized, + isCompleted, + ); } /// Controls a platform video player, and provides updates when the state is @@ -282,11 +281,11 @@ class VideoPlayerController extends ValueNotifier { Future? closedCaptionFile, this.videoPlayerOptions, this.viewType = VideoViewType.textureView, - }) : _closedCaptionFileFuture = closedCaptionFile, - dataSourceType = DataSourceType.asset, - formatHint = null, - httpHeaders = const {}, - super(const VideoPlayerValue(duration: Duration.zero)); + }) : _closedCaptionFileFuture = closedCaptionFile, + dataSourceType = DataSourceType.asset, + formatHint = null, + httpHeaders = const {}, + super(const VideoPlayerValue(duration: Duration.zero)); /// Constructs a [VideoPlayerController] playing a network video. /// @@ -309,10 +308,10 @@ class VideoPlayerController extends ValueNotifier { this.videoPlayerOptions, this.httpHeaders = const {}, this.viewType = VideoViewType.textureView, - }) : _closedCaptionFileFuture = closedCaptionFile, - dataSourceType = DataSourceType.network, - package = null, - super(const VideoPlayerValue(duration: Duration.zero)); + }) : _closedCaptionFileFuture = closedCaptionFile, + dataSourceType = DataSourceType.network, + package = null, + super(const VideoPlayerValue(duration: Duration.zero)); /// Constructs a [VideoPlayerController] playing a network video. /// @@ -330,11 +329,11 @@ class VideoPlayerController extends ValueNotifier { this.videoPlayerOptions, this.httpHeaders = const {}, this.viewType = VideoViewType.textureView, - }) : _closedCaptionFileFuture = closedCaptionFile, - dataSource = url.toString(), - dataSourceType = DataSourceType.network, - package = null, - super(const VideoPlayerValue(duration: Duration.zero)); + }) : _closedCaptionFileFuture = closedCaptionFile, + dataSource = url.toString(), + dataSourceType = DataSourceType.network, + package = null, + super(const VideoPlayerValue(duration: Duration.zero)); /// Constructs a [VideoPlayerController] playing a video from a file. /// @@ -346,12 +345,12 @@ class VideoPlayerController extends ValueNotifier { this.videoPlayerOptions, this.httpHeaders = const {}, this.viewType = VideoViewType.textureView, - }) : _closedCaptionFileFuture = closedCaptionFile, - dataSource = Uri.file(file.absolute.path).toString(), - dataSourceType = DataSourceType.file, - package = null, - formatHint = null, - super(const VideoPlayerValue(duration: Duration.zero)); + }) : _closedCaptionFileFuture = closedCaptionFile, + dataSource = Uri.file(file.absolute.path).toString(), + dataSourceType = DataSourceType.file, + package = null, + formatHint = null, + super(const VideoPlayerValue(duration: Duration.zero)); /// Constructs a [VideoPlayerController] playing a video from a contentUri. /// @@ -362,17 +361,17 @@ class VideoPlayerController extends ValueNotifier { Future? closedCaptionFile, this.videoPlayerOptions, this.viewType = VideoViewType.textureView, - }) : assert( - defaultTargetPlatform == TargetPlatform.android, - 'VideoPlayerController.contentUri is only supported on Android.', - ), - _closedCaptionFileFuture = closedCaptionFile, - dataSource = contentUri.toString(), - dataSourceType = DataSourceType.contentUri, - package = null, - formatHint = null, - httpHeaders = const {}, - super(const VideoPlayerValue(duration: Duration.zero)); + }) : assert( + defaultTargetPlatform == TargetPlatform.android, + 'VideoPlayerController.contentUri is only supported on Android.', + ), + _closedCaptionFileFuture = closedCaptionFile, + dataSource = contentUri.toString(), + dataSourceType = DataSourceType.contentUri, + package = null, + formatHint = null, + httpHeaders = const {}, + super(const VideoPlayerValue(duration: Duration.zero)); /// The URI to the video file. This will be in different formats depending on /// the [DataSourceType] of the original video. @@ -476,7 +475,7 @@ class VideoPlayerController extends ValueNotifier { _playerId = (await _videoPlayerPlatform.createWithOptions(creationOptions)) ?? - kUninitializedPlayerId; + kUninitializedPlayerId; _creatingCompleter!.complete(null); final Completer initializingCompleter = Completer(); @@ -911,17 +910,17 @@ class _VideoPlayerState extends State { return _playerId == VideoPlayerController.kUninitializedPlayerId ? Container() : _VideoPlayerWithRotation( - rotation: widget.controller.value.rotationCorrection, - child: _videoPlayerPlatform.buildViewWithOptions( - VideoViewOptions(playerId: _playerId), - ), - ); + rotation: widget.controller.value.rotationCorrection, + child: _videoPlayerPlatform.buildViewWithOptions( + VideoViewOptions(playerId: _playerId), + ), + ); } } class _VideoPlayerWithRotation extends StatelessWidget { const _VideoPlayerWithRotation({required this.rotation, required this.child}) - : assert(rotation % 90 == 0, 'Rotation must be a multiple of 90'); + : assert(rotation % 90 == 0, 'Rotation must be a multiple of 90'); final int rotation; final Widget child; @@ -1215,8 +1214,7 @@ class ClosedCaption extends StatelessWidget { return const SizedBox.shrink(); } - final TextStyle effectiveTextStyle = - textStyle ?? + final TextStyle effectiveTextStyle = textStyle ?? DefaultTextStyle.of( context, ).style.copyWith(fontSize: 36.0, color: Colors.white); diff --git a/packages/video_player/video_player/test/video_player_test.dart b/packages/video_player/video_player/test/video_player_test.dart index e0e15194138..e4fbe3c69df 100644 --- a/packages/video_player/video_player/test/video_player_test.dart +++ b/packages/video_player/video_player/test/video_player_test.dart @@ -343,9 +343,9 @@ void main() { test('network url with hint', () async { final VideoPlayerController controller = VideoPlayerController.networkUrl( - Uri.parse('https://127.0.0.1'), - formatHint: VideoFormat.dash, - ); + Uri.parse('https://127.0.0.1'), + formatHint: VideoFormat.dash, + ); addTearDown(controller.dispose); await controller.initialize(); @@ -363,9 +363,9 @@ void main() { test('network url with some headers', () async { final VideoPlayerController controller = VideoPlayerController.networkUrl( - Uri.parse('https://127.0.0.1'), - httpHeaders: {'Authorization': 'Bearer token'}, - ); + Uri.parse('https://127.0.0.1'), + httpHeaders: {'Authorization': 'Bearer token'}, + ); addTearDown(controller.dispose); await controller.initialize(); @@ -773,9 +773,9 @@ void main() { test('works when position updates', () async { final VideoPlayerController controller = VideoPlayerController.networkUrl( - _localhostUri, - closedCaptionFile: _loadClosedCaption(), - ); + _localhostUri, + closedCaptionFile: _loadClosedCaption(), + ); await controller.initialize(); await controller.play(); @@ -813,9 +813,9 @@ void main() { test('works when seeking', () async { final VideoPlayerController controller = VideoPlayerController.networkUrl( - _localhostUri, - closedCaptionFile: _loadClosedCaption(), - ); + _localhostUri, + closedCaptionFile: _loadClosedCaption(), + ); addTearDown(controller.dispose); await controller.initialize(); @@ -847,9 +847,9 @@ void main() { test('works when seeking with captionOffset positive', () async { final VideoPlayerController controller = VideoPlayerController.networkUrl( - _localhostUri, - closedCaptionFile: _loadClosedCaption(), - ); + _localhostUri, + closedCaptionFile: _loadClosedCaption(), + ); addTearDown(controller.dispose); await controller.initialize(); @@ -885,9 +885,9 @@ void main() { test('works when seeking with captionOffset negative', () async { final VideoPlayerController controller = VideoPlayerController.networkUrl( - _localhostUri, - closedCaptionFile: _loadClosedCaption(), - ); + _localhostUri, + closedCaptionFile: _loadClosedCaption(), + ); addTearDown(controller.dispose); await controller.initialize(); @@ -941,9 +941,9 @@ void main() { test('setClosedCaptionFile removes/changes caption file', () async { final VideoPlayerController controller = VideoPlayerController.networkUrl( - _localhostUri, - closedCaptionFile: _loadClosedCaption(), - ); + _localhostUri, + closedCaptionFile: _loadClosedCaption(), + ); addTearDown(controller.dispose); await controller.initialize(); diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/Messages.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/Messages.java index f1744bda26f..9765ccde582 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/Messages.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/Messages.java @@ -21,10 +21,6 @@ import java.lang.annotation.Target; import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Objects; @@ -41,8 +37,7 @@ public static class FlutterError extends RuntimeException { /** The error details. Must be a datatype supported by the api codec. */ public final Object details; - public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) - { + public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) { super(message); this.code = code; this.details = details; @@ -61,7 +56,7 @@ protected static ArrayList wrapError(@NonNull Throwable exception) { errorList.add(exception.toString()); errorList.add(exception.getClass().getSimpleName()); errorList.add( - "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); + "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); } return errorList; } @@ -86,7 +81,7 @@ public enum PlatformVideoFormat { /** * Information passed to the platform view creation. * - * Generated class from Pigeon that represents data sent in messages. + *

Generated class from Pigeon that represents data sent in messages. */ public static final class PlatformVideoViewCreationParams { private @NonNull Long playerId; @@ -107,8 +102,12 @@ public void setPlayerId(@NonNull Long setterArg) { @Override public boolean equals(Object o) { - if (this == o) { return true; } - if (o == null || getClass() != o.getClass()) { return false; } + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } PlatformVideoViewCreationParams that = (PlatformVideoViewCreationParams) o; return playerId.equals(that.playerId); } @@ -142,7 +141,8 @@ ArrayList toList() { return toListResult; } - static @NonNull PlatformVideoViewCreationParams fromList(@NonNull ArrayList pigeonVar_list) { + static @NonNull PlatformVideoViewCreationParams fromList( + @NonNull ArrayList pigeonVar_list) { PlatformVideoViewCreationParams pigeonResult = new PlatformVideoViewCreationParams(); Object playerId = pigeonVar_list.get(0); pigeonResult.setPlayerId((Long) playerId); @@ -203,10 +203,17 @@ public void setUserAgent(@Nullable String setterArg) { @Override public boolean equals(Object o) { - if (this == o) { return true; } - if (o == null || getClass() != o.getClass()) { return false; } + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } CreationOptions that = (CreationOptions) o; - return uri.equals(that.uri) && Objects.equals(formatHint, that.formatHint) && httpHeaders.equals(that.httpHeaders) && Objects.equals(userAgent, that.userAgent); + return uri.equals(that.uri) + && Objects.equals(formatHint, that.formatHint) + && httpHeaders.equals(that.httpHeaders) + && Objects.equals(userAgent, that.userAgent); } @Override @@ -315,8 +322,12 @@ public void setTextureId(@NonNull Long setterArg) { @Override public boolean equals(Object o) { - if (this == o) { return true; } - if (o == null || getClass() != o.getClass()) { return false; } + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } TexturePlayerIds that = (TexturePlayerIds) o; return playerId.equals(that.playerId) && textureId.equals(that.textureId); } @@ -405,8 +416,12 @@ public void setBufferPosition(@NonNull Long setterArg) { @Override public boolean equals(Object o) { - if (this == o) { return true; } - if (o == null || getClass() != o.getClass()) { return false; } + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } PlaybackState that = (PlaybackState) o; return playPosition.equals(that.playPosition) && bufferPosition.equals(that.bufferPosition); } @@ -468,10 +483,11 @@ private PigeonCodec() {} @Override protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { switch (type) { - case (byte) 129: { - Object value = readValue(buffer); - return value == null ? null : PlatformVideoFormat.values()[((Long) value).intValue()]; - } + case (byte) 129: + { + Object value = readValue(buffer); + return value == null ? null : PlatformVideoFormat.values()[((Long) value).intValue()]; + } case (byte) 130: return PlatformVideoViewCreationParams.fromList((ArrayList) readValue(buffer)); case (byte) 131: @@ -513,10 +529,10 @@ public interface AndroidVideoPlayerApi { void initialize(); - @NonNull + @NonNull Long createForPlatformView(@NonNull CreationOptions options); - @NonNull + @NonNull TexturePlayerIds createForTextureView(@NonNull CreationOptions options); void dispose(@NonNull Long playerId); @@ -525,23 +541,34 @@ public interface AndroidVideoPlayerApi { void setAllowBackgroundPlayback(@NonNull Boolean allowBackgroundPlayback); - @NonNull + @NonNull String getLookupKeyForAsset(@NonNull String asset, @Nullable String packageName); /** The codec used by AndroidVideoPlayerApi. */ static @NonNull MessageCodec getCodec() { return PigeonCodec.INSTANCE; } - /**Sets up an instance of `AndroidVideoPlayerApi` to handle messages through the `binaryMessenger`. */ - static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable AndroidVideoPlayerApi api) { + /** + * Sets up an instance of `AndroidVideoPlayerApi` to handle messages through the + * `binaryMessenger`. + */ + static void setUp( + @NonNull BinaryMessenger binaryMessenger, @Nullable AndroidVideoPlayerApi api) { setUp(binaryMessenger, "", api); } - static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String messageChannelSuffix, @Nullable AndroidVideoPlayerApi api) { + + static void setUp( + @NonNull BinaryMessenger binaryMessenger, + @NonNull String messageChannelSuffix, + @Nullable AndroidVideoPlayerApi api) { messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.initialize" + messageChannelSuffix, getCodec()); + binaryMessenger, + "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.initialize" + + messageChannelSuffix, + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -549,8 +576,7 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess try { api.initialize(); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -562,7 +588,10 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.createForPlatformView" + messageChannelSuffix, getCodec()); + binaryMessenger, + "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.createForPlatformView" + + messageChannelSuffix, + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -572,8 +601,7 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess try { Long output = api.createForPlatformView(optionsArg); wrapped.add(0, output); - } - catch (Throwable exception) { + } catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -585,7 +613,10 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.createForTextureView" + messageChannelSuffix, getCodec()); + binaryMessenger, + "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.createForTextureView" + + messageChannelSuffix, + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -595,8 +626,7 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess try { TexturePlayerIds output = api.createForTextureView(optionsArg); wrapped.add(0, output); - } - catch (Throwable exception) { + } catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -608,7 +638,10 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.dispose" + messageChannelSuffix, getCodec()); + binaryMessenger, + "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.dispose" + + messageChannelSuffix, + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -618,8 +651,7 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess try { api.dispose(playerIdArg); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -631,7 +663,10 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.setMixWithOthers" + messageChannelSuffix, getCodec()); + binaryMessenger, + "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.setMixWithOthers" + + messageChannelSuffix, + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -641,8 +676,7 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess try { api.setMixWithOthers(mixWithOthersArg); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -654,7 +688,10 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.setAllowBackgroundPlayback" + messageChannelSuffix, getCodec()); + binaryMessenger, + "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.setAllowBackgroundPlayback" + + messageChannelSuffix, + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -664,8 +701,7 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess try { api.setAllowBackgroundPlayback(allowBackgroundPlaybackArg); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -677,7 +713,10 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.getLookupKeyForAsset" + messageChannelSuffix, getCodec()); + binaryMessenger, + "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.getLookupKeyForAsset" + + messageChannelSuffix, + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -688,8 +727,7 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess try { String output = api.getLookupKeyForAsset(assetArg, packageNameArg); wrapped.add(0, output); - } - catch (Throwable exception) { + } catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -717,26 +755,37 @@ public interface VideoPlayerInstanceApi { /** * Returns the current playback state. * - * This is combined into a single call to minimize platform channel calls for - * state that needs to be polled frequently. + *

This is combined into a single call to minimize platform channel calls for state that + * needs to be polled frequently. */ - @NonNull + @NonNull PlaybackState getPlaybackState(); /** The codec used by VideoPlayerInstanceApi. */ static @NonNull MessageCodec getCodec() { return PigeonCodec.INSTANCE; } - /**Sets up an instance of `VideoPlayerInstanceApi` to handle messages through the `binaryMessenger`. */ - static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable VideoPlayerInstanceApi api) { + /** + * Sets up an instance of `VideoPlayerInstanceApi` to handle messages through the + * `binaryMessenger`. + */ + static void setUp( + @NonNull BinaryMessenger binaryMessenger, @Nullable VideoPlayerInstanceApi api) { setUp(binaryMessenger, "", api); } - static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String messageChannelSuffix, @Nullable VideoPlayerInstanceApi api) { + + static void setUp( + @NonNull BinaryMessenger binaryMessenger, + @NonNull String messageChannelSuffix, + @Nullable VideoPlayerInstanceApi api) { messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setLooping" + messageChannelSuffix, getCodec()); + binaryMessenger, + "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setLooping" + + messageChannelSuffix, + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -746,8 +795,7 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess try { api.setLooping(loopingArg); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -759,7 +807,10 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setVolume" + messageChannelSuffix, getCodec()); + binaryMessenger, + "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setVolume" + + messageChannelSuffix, + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -769,8 +820,7 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess try { api.setVolume(volumeArg); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -782,7 +832,10 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setPlaybackSpeed" + messageChannelSuffix, getCodec()); + binaryMessenger, + "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setPlaybackSpeed" + + messageChannelSuffix, + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -792,8 +845,7 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess try { api.setPlaybackSpeed(speedArg); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -805,7 +857,10 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.play" + messageChannelSuffix, getCodec()); + binaryMessenger, + "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.play" + + messageChannelSuffix, + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -813,8 +868,7 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess try { api.play(); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -826,7 +880,10 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.pause" + messageChannelSuffix, getCodec()); + binaryMessenger, + "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.pause" + + messageChannelSuffix, + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -834,8 +891,7 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess try { api.pause(); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -847,7 +903,10 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.seekTo" + messageChannelSuffix, getCodec()); + binaryMessenger, + "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.seekTo" + + messageChannelSuffix, + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -857,8 +916,7 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess try { api.seekTo(positionArg); wrapped.add(0, null); - } - catch (Throwable exception) { + } catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); @@ -870,7 +928,10 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.getPlaybackState" + messageChannelSuffix, getCodec()); + binaryMessenger, + "dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.getPlaybackState" + + messageChannelSuffix, + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -878,8 +939,7 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String mess try { PlaybackState output = api.getPlaybackState(); wrapped.add(0, output); - } - catch (Throwable exception) { + } catch (Throwable exception) { wrapped = wrapError(exception); } reply.reply(wrapped); diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java index 4a42af4916e..8b34632ea4e 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java @@ -58,12 +58,10 @@ public VideoPlayer( setAudioAttributes(exoPlayer, options.mixWithOthers); if (options.allowBackgroundPlayback) { - exoPlayer.setWakeMode(C.WAKE_MODE_NETWORK); - exoPlayer.setAudioAttributes( - new AudioAttributes.Builder() - .setUsage(C.USAGE_MEDIA) - .build(), - /* handleAudioFocus= */ !options.mixWithOthers); + exoPlayer.setWakeMode(C.WAKE_MODE_NETWORK); + exoPlayer.setAudioAttributes( + new AudioAttributes.Builder().setUsage(C.USAGE_MEDIA).build(), + /* handleAudioFocus= */ !options.mixWithOthers); } } diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java index b00a1332841..e03bc3bb19d 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java @@ -100,7 +100,7 @@ public void onSurfaceAvailable() { @RestrictTo(RestrictTo.Scope.LIBRARY) public void onSurfaceCleanup() { - if (options == null || !options.allowBackgroundPlayback) { + if (options == null || !options.allowBackgroundPlayback) { savedStateDuring = ExoPlayerState.save(exoPlayer); exoPlayer.release(); } else { diff --git a/packages/video_player/video_player_android/lib/src/messages.g.dart b/packages/video_player/video_player_android/lib/src/messages.g.dart index 9505dea47b1..f168f9d312d 100644 --- a/packages/video_player/video_player_android/lib/src/messages.g.dart +++ b/packages/video_player/video_player_android/lib/src/messages.g.dart @@ -17,56 +17,52 @@ PlatformException _createConnectionError(String channelName) { message: 'Unable to establish connection on channel: "$channelName".', ); } + bool _deepEquals(Object? a, Object? b) { if (a is List && b is List) { return a.length == b.length && - a.indexed - .every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1])); + a.indexed.every( + ((int, dynamic) item) => _deepEquals(item.$2, b[item.$1]), + ); } if (a is Map && b is Map) { - return a.length == b.length && a.entries.every((MapEntry entry) => - (b as Map).containsKey(entry.key) && - _deepEquals(entry.value, b[entry.key])); + return a.length == b.length && + a.entries.every( + (MapEntry entry) => + (b as Map).containsKey(entry.key) && + _deepEquals(entry.value, b[entry.key]), + ); } return a == b; } - /// Pigeon equivalent of video_platform_interface's VideoFormat. -enum PlatformVideoFormat { - dash, - hls, - ss, -} +enum PlatformVideoFormat { dash, hls, ss } /// Information passed to the platform view creation. class PlatformVideoViewCreationParams { - PlatformVideoViewCreationParams({ - required this.playerId, - }); + PlatformVideoViewCreationParams({required this.playerId}); int playerId; List _toList() { - return [ - playerId, - ]; + return [playerId]; } Object encode() { - return _toList(); } + return _toList(); + } static PlatformVideoViewCreationParams decode(Object result) { result as List; - return PlatformVideoViewCreationParams( - playerId: result[0]! as int, - ); + return PlatformVideoViewCreationParams(playerId: result[0]! as int); } @override // ignore: avoid_equals_and_hash_code_on_mutable_classes bool operator ==(Object other) { - if (other is! PlatformVideoViewCreationParams || other.runtimeType != runtimeType) { + if (other is! PlatformVideoViewCreationParams || + other.runtimeType != runtimeType) { return false; } if (identical(this, other)) { @@ -77,8 +73,7 @@ class PlatformVideoViewCreationParams { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class CreationOptions { @@ -98,23 +93,20 @@ class CreationOptions { String? userAgent; List _toList() { - return [ - uri, - formatHint, - httpHeaders, - userAgent, - ]; + return [uri, formatHint, httpHeaders, userAgent]; } Object encode() { - return _toList(); } + return _toList(); + } static CreationOptions decode(Object result) { result as List; return CreationOptions( uri: result[0]! as String, formatHint: result[1] as PlatformVideoFormat?, - httpHeaders: (result[2] as Map?)!.cast(), + httpHeaders: (result[2] as Map?)! + .cast(), userAgent: result[3] as String?, ); } @@ -133,29 +125,23 @@ class CreationOptions { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class TexturePlayerIds { - TexturePlayerIds({ - required this.playerId, - required this.textureId, - }); + TexturePlayerIds({required this.playerId, required this.textureId}); int playerId; int textureId; List _toList() { - return [ - playerId, - textureId, - ]; + return [playerId, textureId]; } Object encode() { - return _toList(); } + return _toList(); + } static TexturePlayerIds decode(Object result) { result as List; @@ -179,15 +165,11 @@ class TexturePlayerIds { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class PlaybackState { - PlaybackState({ - required this.playPosition, - required this.bufferPosition, - }); + PlaybackState({required this.playPosition, required this.bufferPosition}); /// The current playback position, in milliseconds. int playPosition; @@ -196,14 +178,12 @@ class PlaybackState { int bufferPosition; List _toList() { - return [ - playPosition, - bufferPosition, - ]; + return [playPosition, bufferPosition]; } Object encode() { - return _toList(); } + return _toList(); + } static PlaybackState decode(Object result) { result as List; @@ -227,11 +207,9 @@ class PlaybackState { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } - class _PigeonCodec extends StandardMessageCodec { const _PigeonCodec(); @override @@ -239,19 +217,19 @@ class _PigeonCodec extends StandardMessageCodec { if (value is int) { buffer.putUint8(4); buffer.putInt64(value); - } else if (value is PlatformVideoFormat) { + } else if (value is PlatformVideoFormat) { buffer.putUint8(129); writeValue(buffer, value.index); - } else if (value is PlatformVideoViewCreationParams) { + } else if (value is PlatformVideoViewCreationParams) { buffer.putUint8(130); writeValue(buffer, value.encode()); - } else if (value is CreationOptions) { + } else if (value is CreationOptions) { buffer.putUint8(131); writeValue(buffer, value.encode()); - } else if (value is TexturePlayerIds) { + } else if (value is TexturePlayerIds) { buffer.putUint8(132); writeValue(buffer, value.encode()); - } else if (value is PlaybackState) { + } else if (value is PlaybackState) { buffer.putUint8(133); writeValue(buffer, value.encode()); } else { @@ -262,16 +240,16 @@ class _PigeonCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 129: + case 129: final int? value = readValue(buffer) as int?; return value == null ? null : PlatformVideoFormat.values[value]; - case 130: + case 130: return PlatformVideoViewCreationParams.decode(readValue(buffer)!); - case 131: + case 131: return CreationOptions.decode(readValue(buffer)!); - case 132: + case 132: return TexturePlayerIds.decode(readValue(buffer)!); - case 133: + case 133: return PlaybackState.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -283,9 +261,13 @@ class AndroidVideoPlayerApi { /// Constructor for [AndroidVideoPlayerApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - AndroidVideoPlayerApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + AndroidVideoPlayerApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -293,12 +275,14 @@ class AndroidVideoPlayerApi { final String pigeonVar_messageChannelSuffix; Future initialize() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.initialize$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.initialize$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; @@ -316,13 +300,17 @@ class AndroidVideoPlayerApi { } Future createForPlatformView(CreationOptions options) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.createForPlatformView$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.createForPlatformView$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [options], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([options]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -344,13 +332,17 @@ class AndroidVideoPlayerApi { } Future createForTextureView(CreationOptions options) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.createForTextureView$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.createForTextureView$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [options], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([options]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -372,13 +364,17 @@ class AndroidVideoPlayerApi { } Future dispose(int playerId) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.dispose$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.dispose$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [playerId], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([playerId]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -395,13 +391,17 @@ class AndroidVideoPlayerApi { } Future setMixWithOthers(bool mixWithOthers) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.setMixWithOthers$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.setMixWithOthers$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [mixWithOthers], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([mixWithOthers]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -418,13 +418,17 @@ class AndroidVideoPlayerApi { } Future setAllowBackgroundPlayback(bool allowBackgroundPlayback) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.setAllowBackgroundPlayback$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.setAllowBackgroundPlayback$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [allowBackgroundPlayback], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([allowBackgroundPlayback]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -441,13 +445,17 @@ class AndroidVideoPlayerApi { } Future getLookupKeyForAsset(String asset, String? packageName) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.getLookupKeyForAsset$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.getLookupKeyForAsset$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [asset, packageName], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([asset, packageName]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -473,9 +481,13 @@ class VideoPlayerInstanceApi { /// Constructor for [VideoPlayerInstanceApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - VideoPlayerInstanceApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + VideoPlayerInstanceApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -484,13 +496,17 @@ class VideoPlayerInstanceApi { /// Sets whether to automatically loop playback of the video. Future setLooping(bool looping) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setLooping$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setLooping$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [looping], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([looping]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -508,13 +524,17 @@ class VideoPlayerInstanceApi { /// Sets the volume, with 0.0 being muted and 1.0 being full volume. Future setVolume(double volume) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setVolume$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setVolume$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [volume], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([volume]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -532,13 +552,17 @@ class VideoPlayerInstanceApi { /// Sets the playback speed as a multiple of normal speed. Future setPlaybackSpeed(double speed) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setPlaybackSpeed$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.setPlaybackSpeed$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [speed], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([speed]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -556,12 +580,14 @@ class VideoPlayerInstanceApi { /// Begins playback if the video is not currently playing. Future play() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.play$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.play$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; @@ -580,12 +606,14 @@ class VideoPlayerInstanceApi { /// Pauses playback if the video is currently playing. Future pause() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.pause$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.pause$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; @@ -604,13 +632,17 @@ class VideoPlayerInstanceApi { /// Seeks to the given playback position, in milliseconds. Future seekTo(int position) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.seekTo$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.seekTo$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [position], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([position]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -631,12 +663,14 @@ class VideoPlayerInstanceApi { /// This is combined into a single call to minimize platform channel calls for /// state that needs to be polled frequently. Future getPlaybackState() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.getPlaybackState$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_android.VideoPlayerInstanceApi.getPlaybackState$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; diff --git a/packages/video_player/video_player_android/test/android_video_player_test.mocks.dart b/packages/video_player/video_player_android/test/android_video_player_test.mocks.dart index 4bc36448aa4..fb05d202380 100644 --- a/packages/video_player/video_player_android/test/android_video_player_test.mocks.dart +++ b/packages/video_player/video_player_android/test/android_video_player_test.mocks.dart @@ -111,6 +111,17 @@ class MockAndroidVideoPlayerApi extends _i1.Mock ) as _i4.Future); + @override + _i4.Future setAllowBackgroundPlayback(bool? allowBackgroundPlayback) => + (super.noSuchMethod( + Invocation.method(#setAllowBackgroundPlayback, [ + allowBackgroundPlayback, + ]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + @override _i4.Future getLookupKeyForAsset(String? asset, String? packageName) => (super.noSuchMethod( diff --git a/packages/video_player/video_player_avfoundation/lib/src/messages.g.dart b/packages/video_player/video_player_avfoundation/lib/src/messages.g.dart index 19eda5cd136..ef3ce35c7b6 100644 --- a/packages/video_player/video_player_avfoundation/lib/src/messages.g.dart +++ b/packages/video_player/video_player_avfoundation/lib/src/messages.g.dart @@ -17,49 +17,49 @@ PlatformException _createConnectionError(String channelName) { message: 'Unable to establish connection on channel: "$channelName".', ); } + bool _deepEquals(Object? a, Object? b) { if (a is List && b is List) { return a.length == b.length && - a.indexed - .every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1])); + a.indexed.every( + ((int, dynamic) item) => _deepEquals(item.$2, b[item.$1]), + ); } if (a is Map && b is Map) { - return a.length == b.length && a.entries.every((MapEntry entry) => - (b as Map).containsKey(entry.key) && - _deepEquals(entry.value, b[entry.key])); + return a.length == b.length && + a.entries.every( + (MapEntry entry) => + (b as Map).containsKey(entry.key) && + _deepEquals(entry.value, b[entry.key]), + ); } return a == b; } - /// Information passed to the platform view creation. class PlatformVideoViewCreationParams { - PlatformVideoViewCreationParams({ - required this.playerId, - }); + PlatformVideoViewCreationParams({required this.playerId}); int playerId; List _toList() { - return [ - playerId, - ]; + return [playerId]; } Object encode() { - return _toList(); } + return _toList(); + } static PlatformVideoViewCreationParams decode(Object result) { result as List; - return PlatformVideoViewCreationParams( - playerId: result[0]! as int, - ); + return PlatformVideoViewCreationParams(playerId: result[0]! as int); } @override // ignore: avoid_equals_and_hash_code_on_mutable_classes bool operator ==(Object other) { - if (other is! PlatformVideoViewCreationParams || other.runtimeType != runtimeType) { + if (other is! PlatformVideoViewCreationParams || + other.runtimeType != runtimeType) { return false; } if (identical(this, other)) { @@ -70,35 +70,30 @@ class PlatformVideoViewCreationParams { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class CreationOptions { - CreationOptions({ - required this.uri, - required this.httpHeaders, - }); + CreationOptions({required this.uri, required this.httpHeaders}); String uri; Map httpHeaders; List _toList() { - return [ - uri, - httpHeaders, - ]; + return [uri, httpHeaders]; } Object encode() { - return _toList(); } + return _toList(); + } static CreationOptions decode(Object result) { result as List; return CreationOptions( uri: result[0]! as String, - httpHeaders: (result[1] as Map?)!.cast(), + httpHeaders: + (result[1] as Map?)!.cast(), ); } @@ -116,29 +111,23 @@ class CreationOptions { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class TexturePlayerIds { - TexturePlayerIds({ - required this.playerId, - required this.textureId, - }); + TexturePlayerIds({required this.playerId, required this.textureId}); int playerId; int textureId; List _toList() { - return [ - playerId, - textureId, - ]; + return [playerId, textureId]; } Object encode() { - return _toList(); } + return _toList(); + } static TexturePlayerIds decode(Object result) { result as List; @@ -162,11 +151,9 @@ class TexturePlayerIds { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } - class _PigeonCodec extends StandardMessageCodec { const _PigeonCodec(); @override @@ -174,13 +161,13 @@ class _PigeonCodec extends StandardMessageCodec { if (value is int) { buffer.putUint8(4); buffer.putInt64(value); - } else if (value is PlatformVideoViewCreationParams) { + } else if (value is PlatformVideoViewCreationParams) { buffer.putUint8(129); writeValue(buffer, value.encode()); - } else if (value is CreationOptions) { + } else if (value is CreationOptions) { buffer.putUint8(130); writeValue(buffer, value.encode()); - } else if (value is TexturePlayerIds) { + } else if (value is TexturePlayerIds) { buffer.putUint8(131); writeValue(buffer, value.encode()); } else { @@ -191,11 +178,11 @@ class _PigeonCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 129: + case 129: return PlatformVideoViewCreationParams.decode(readValue(buffer)!); - case 130: + case 130: return CreationOptions.decode(readValue(buffer)!); - case 131: + case 131: return TexturePlayerIds.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -207,9 +194,12 @@ class AVFoundationVideoPlayerApi { /// Constructor for [AVFoundationVideoPlayerApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - AVFoundationVideoPlayerApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + AVFoundationVideoPlayerApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = + messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -217,12 +207,14 @@ class AVFoundationVideoPlayerApi { final String pigeonVar_messageChannelSuffix; Future initialize() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.initialize$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.initialize$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; @@ -240,13 +232,17 @@ class AVFoundationVideoPlayerApi { } Future createForPlatformView(CreationOptions params) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.createForPlatformView$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.createForPlatformView$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [params], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([params]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -267,14 +263,20 @@ class AVFoundationVideoPlayerApi { } } - Future createForTextureView(CreationOptions creationOptions) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.createForTextureView$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + Future createForTextureView( + CreationOptions creationOptions, + ) async { + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.createForTextureView$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [creationOptions], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([creationOptions]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -296,13 +298,17 @@ class AVFoundationVideoPlayerApi { } Future setMixWithOthers(bool mixWithOthers) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.setMixWithOthers$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.setMixWithOthers$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [mixWithOthers], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([mixWithOthers]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -319,13 +325,17 @@ class AVFoundationVideoPlayerApi { } Future setAllowBackgroundPlayback(bool allowBackgroundPlayback) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.setAllowBackgroundPlayback$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.setAllowBackgroundPlayback$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [allowBackgroundPlayback], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([allowBackgroundPlayback]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -342,13 +352,17 @@ class AVFoundationVideoPlayerApi { } Future getAssetUrl(String asset, String? package) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.getAssetUrl$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.getAssetUrl$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [asset, package], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([asset, package]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -369,9 +383,12 @@ class VideoPlayerInstanceApi { /// Constructor for [VideoPlayerInstanceApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - VideoPlayerInstanceApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + VideoPlayerInstanceApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = + messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -379,13 +396,17 @@ class VideoPlayerInstanceApi { final String pigeonVar_messageChannelSuffix; Future setLooping(bool looping) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.setLooping$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.setLooping$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [looping], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([looping]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -402,13 +423,17 @@ class VideoPlayerInstanceApi { } Future setVolume(double volume) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.setVolume$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.setVolume$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [volume], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([volume]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -425,13 +450,17 @@ class VideoPlayerInstanceApi { } Future setPlaybackSpeed(double speed) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.setPlaybackSpeed$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.setPlaybackSpeed$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [speed], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([speed]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -448,12 +477,14 @@ class VideoPlayerInstanceApi { } Future play() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.play$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.play$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; @@ -471,12 +502,14 @@ class VideoPlayerInstanceApi { } Future getPosition() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.getPosition$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.getPosition$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; @@ -499,13 +532,17 @@ class VideoPlayerInstanceApi { } Future seekTo(int position) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.seekTo$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.seekTo$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [position], ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([position]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -522,12 +559,14 @@ class VideoPlayerInstanceApi { } Future pause() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.pause$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.pause$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; @@ -545,12 +584,14 @@ class VideoPlayerInstanceApi { } Future dispose() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.dispose$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final String pigeonVar_channelName = + 'dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.dispose$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; diff --git a/packages/video_player/video_player_avfoundation/test/avfoundation_video_player_test.dart b/packages/video_player/video_player_avfoundation/test/avfoundation_video_player_test.dart index ae29778ce16..ec6750bb720 100644 --- a/packages/video_player/video_player_avfoundation/test/avfoundation_video_player_test.dart +++ b/packages/video_player/video_player_avfoundation/test/avfoundation_video_player_test.dart @@ -456,7 +456,9 @@ void main() { }); test('setAllowBackgroundPlayback does nothing', () async { - final (AVFoundationVideoPlayer player, _, _) = setUpMockPlayer(playerId: 1); + final (AVFoundationVideoPlayer player, _, _) = setUpMockPlayer( + playerId: 1, + ); // Should complete without error, even though it's a no-op on iOS await player.setAllowBackgroundPlayback(true); await player.setAllowBackgroundPlayback(false); diff --git a/packages/video_player/video_player_avfoundation/test/avfoundation_video_player_test.mocks.dart b/packages/video_player/video_player_avfoundation/test/avfoundation_video_player_test.mocks.dart index 8caf6ad8dc4..0af159d6686 100644 --- a/packages/video_player/video_player_avfoundation/test/avfoundation_video_player_test.mocks.dart +++ b/packages/video_player/video_player_avfoundation/test/avfoundation_video_player_test.mocks.dart @@ -97,6 +97,17 @@ class MockAVFoundationVideoPlayerApi extends _i1.Mock ) as _i4.Future); + @override + _i4.Future setAllowBackgroundPlayback(bool? allowBackgroundPlayback) => + (super.noSuchMethod( + Invocation.method(#setAllowBackgroundPlayback, [ + allowBackgroundPlayback, + ]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + @override _i4.Future getAssetUrl(String? asset, String? package) => (super.noSuchMethod( diff --git a/packages/video_player/video_player_web/example/integration_test/pkg_web_tweaks.dart b/packages/video_player/video_player_web/example/integration_test/pkg_web_tweaks.dart index 91ae5eabd1b..5ec37344c88 100644 --- a/packages/video_player/video_player_web/example/integration_test/pkg_web_tweaks.dart +++ b/packages/video_player/video_player_web/example/integration_test/pkg_web_tweaks.dart @@ -57,7 +57,8 @@ extension type Descriptor._(JSObject _) implements JSObject { factory Descriptor.accessor({ void Function(JSAny? value)? set, JSAny? Function()? get, - }) => Descriptor._accessor(set: set?.toJS, get: get?.toJS); + }) => + Descriptor._accessor(set: set?.toJS, get: get?.toJS); external factory Descriptor._accessor({ // JSBoolean configurable, diff --git a/packages/video_player/video_player_web/example/integration_test/video_player_test.dart b/packages/video_player/video_player_web/example/integration_test/video_player_test.dart index c183c6c076e..2e7c1a44f50 100644 --- a/packages/video_player/video_player_web/example/integration_test/video_player_test.dart +++ b/packages/video_player/video_player_web/example/integration_test/video_player_test.dart @@ -24,19 +24,17 @@ void main() { setUp(() { // Never set "src" on the video, so this test doesn't hit the network! - video = - web.HTMLVideoElement() - ..controls = true - ..playsInline = false; + video = web.HTMLVideoElement() + ..controls = true + ..playsInline = false; }); testWidgets('initialize() calls load', (WidgetTester _) async { bool loadCalled = false; - video['load'] = - () { - loadCalled = true; - }.toJS; + video['load'] = () { + loadCalled = true; + }.toJS; VideoPlayer(videoElement: video).initialize(); @@ -193,17 +191,15 @@ void main() { WidgetTester tester, ) async { // Take all the "buffering" events that we see during the next few seconds - final Future> stream = - timedStream - .where( - (VideoEvent event) => - bufferingEvents.contains(event.eventType), - ) - .map( - (VideoEvent event) => - event.eventType == VideoEventType.bufferingStart, - ) - .toList(); + final Future> stream = timedStream + .where( + (VideoEvent event) => bufferingEvents.contains(event.eventType), + ) + .map( + (VideoEvent event) => + event.eventType == VideoEventType.bufferingStart, + ) + .toList(); // Simulate some events coming from the player... player.setBuffering(true); @@ -226,17 +222,15 @@ void main() { WidgetTester tester, ) async { // Take all the "buffering" events that we see during the next few seconds - final Future> stream = - timedStream - .where( - (VideoEvent event) => - bufferingEvents.contains(event.eventType), - ) - .map( - (VideoEvent event) => - event.eventType == VideoEventType.bufferingStart, - ) - .toList(); + final Future> stream = timedStream + .where( + (VideoEvent event) => bufferingEvents.contains(event.eventType), + ) + .map( + (VideoEvent event) => + event.eventType == VideoEventType.bufferingStart, + ) + .toList(); player.setBuffering(true); @@ -253,17 +247,15 @@ void main() { WidgetTester tester, ) async { // Take all the "buffering" events that we see during the next few seconds - final Future> stream = - timedStream - .where( - (VideoEvent event) => - bufferingEvents.contains(event.eventType), - ) - .map( - (VideoEvent event) => - event.eventType == VideoEventType.bufferingStart, - ) - .toList(); + final Future> stream = timedStream + .where( + (VideoEvent event) => bufferingEvents.contains(event.eventType), + ) + .map( + (VideoEvent event) => + event.eventType == VideoEventType.bufferingStart, + ) + .toList(); player.setBuffering(true); @@ -285,13 +277,12 @@ void main() { video.dispatchEvent(web.Event('canplay')); // Take all the "initialized" events that we see during the next few seconds - final Future> stream = - timedStream - .where( - (VideoEvent event) => - event.eventType == VideoEventType.initialized, - ) - .toList(); + final Future> stream = timedStream + .where( + (VideoEvent event) => + event.eventType == VideoEventType.initialized, + ) + .toList(); video.dispatchEvent(web.Event('canplay')); video.dispatchEvent(web.Event('canplay')); @@ -309,13 +300,12 @@ void main() { video.dispatchEvent(web.Event('loadedmetadata')); video.dispatchEvent(web.Event('loadedmetadata')); - final Future> stream = - timedStream - .where( - (VideoEvent event) => - event.eventType == VideoEventType.initialized, - ) - .toList(); + final Future> stream = timedStream + .where( + (VideoEvent event) => + event.eventType == VideoEventType.initialized, + ) + .toList(); final List events = await stream; @@ -328,13 +318,12 @@ void main() { video.dispatchEvent(web.Event('loadeddata')); video.dispatchEvent(web.Event('loadeddata')); - final Future> stream = - timedStream - .where( - (VideoEvent event) => - event.eventType == VideoEventType.initialized, - ) - .toList(); + final Future> stream = timedStream + .where( + (VideoEvent event) => + event.eventType == VideoEventType.initialized, + ) + .toList(); final List events = await stream; @@ -346,13 +335,12 @@ void main() { setInfinityDuration(video); expect(video.duration.isInfinite, isTrue); - final Future> stream = - timedStream - .where( - (VideoEvent event) => - event.eventType == VideoEventType.initialized, - ) - .toList(); + final Future> stream = timedStream + .where( + (VideoEvent event) => + event.eventType == VideoEventType.initialized, + ) + .toList(); video.dispatchEvent(web.Event('canplay')); diff --git a/packages/video_player/video_player_web/example/integration_test/video_player_web_test.dart b/packages/video_player/video_player_web/example/integration_test/video_player_web_test.dart index 78e4ae58527..818f56a2288 100644 --- a/packages/video_player/video_player_web/example/integration_test/video_player_web_test.dart +++ b/packages/video_player/video_player_web/example/integration_test/video_player_web_test.dart @@ -124,19 +124,19 @@ void main() { ) async { final int videoPlayerId = (await VideoPlayerPlatform.instance.createWithOptions( - VideoCreationOptions( - dataSource: DataSource( - sourceType: DataSourceType.network, - uri: getUrlForAssetAsNetworkSource( - 'assets/__non_existent.webm', - ), - ), - viewType: VideoViewType.platformView, + VideoCreationOptions( + dataSource: DataSource( + sourceType: DataSourceType.network, + uri: getUrlForAssetAsNetworkSource( + 'assets/__non_existent.webm', ), - ))!; + ), + viewType: VideoViewType.platformView, + ), + ))!; - final Stream eventStream = VideoPlayerPlatform.instance - .videoEventsFor(videoPlayerId); + final Stream eventStream = + VideoPlayerPlatform.instance.videoEventsFor(videoPlayerId); // Mute video to allow autoplay (See https://goo.gl/xX8pDD) await VideoPlayerPlatform.instance.setVolume(videoPlayerId, 0); @@ -215,18 +215,15 @@ void main() { 'double call to play will emit a single isPlayingStateUpdate event', (WidgetTester tester) async { final int videoPlayerId = await playerId; - final Stream eventStream = VideoPlayerPlatform.instance - .videoEventsFor(videoPlayerId); - - final Future> stream = - eventStream - .timeout( - const Duration(seconds: 2), - onTimeout: (EventSink sink) { - sink.close(); - }, - ) - .toList(); + final Stream eventStream = + VideoPlayerPlatform.instance.videoEventsFor(videoPlayerId); + + final Future> stream = eventStream.timeout( + const Duration(seconds: 2), + onTimeout: (EventSink sink) { + sink.close(); + }, + ).toList(); await VideoPlayerPlatform.instance.setVolume(videoPlayerId, 0); await VideoPlayerPlatform.instance.play(videoPlayerId); @@ -258,18 +255,15 @@ void main() { 'video playback lifecycle', (WidgetTester tester) async { final int videoPlayerId = await playerId; - final Stream eventStream = VideoPlayerPlatform.instance - .videoEventsFor(videoPlayerId); - - final Future> stream = - eventStream - .timeout( - const Duration(seconds: 2), - onTimeout: (EventSink sink) { - sink.close(); - }, - ) - .toList(); + final Stream eventStream = + VideoPlayerPlatform.instance.videoEventsFor(videoPlayerId); + + final Future> stream = eventStream.timeout( + const Duration(seconds: 2), + onTimeout: (EventSink sink) { + sink.close(); + }, + ).toList(); await VideoPlayerPlatform.instance.setVolume(videoPlayerId, 0); await VideoPlayerPlatform.instance.play(videoPlayerId); diff --git a/packages/video_player/video_player_web/lib/src/video_player.dart b/packages/video_player/video_player_web/lib/src/video_player.dart index af7dfcd5920..6db581cde28 100644 --- a/packages/video_player/video_player_web/lib/src/video_player.dart +++ b/packages/video_player/video_player_web/lib/src/video_player.dart @@ -42,8 +42,8 @@ class VideoPlayer { VideoPlayer({ required web.HTMLVideoElement videoElement, @visibleForTesting StreamController? eventController, - }) : _videoElement = videoElement, - _eventController = eventController ?? StreamController(); + }) : _videoElement = videoElement, + _eventController = eventController ?? StreamController(); final StreamController _eventController; final web.HTMLVideoElement _videoElement; @@ -313,13 +313,12 @@ class VideoPlayer { _videoElement.duration, ); - final Size? size = - _videoElement.videoHeight.isFinite - ? Size( - _videoElement.videoWidth.toDouble(), - _videoElement.videoHeight.toDouble(), - ) - : null; + final Size? size = _videoElement.videoHeight.isFinite + ? Size( + _videoElement.videoWidth.toDouble(), + _videoElement.videoHeight.toDouble(), + ) + : null; _eventController.add( VideoEvent( @@ -340,10 +339,9 @@ class VideoPlayer { _isBuffering = buffering; _eventController.add( VideoEvent( - eventType: - _isBuffering - ? VideoEventType.bufferingStart - : VideoEventType.bufferingEnd, + eventType: _isBuffering + ? VideoEventType.bufferingStart + : VideoEventType.bufferingEnd, ), ); } diff --git a/packages/video_player/video_player_web/lib/video_player_web.dart b/packages/video_player/video_player_web/lib/video_player_web.dart index 2ec3981120c..0b05380c0a2 100644 --- a/packages/video_player/video_player_web/lib/video_player_web.dart +++ b/packages/video_player/video_player_web/lib/video_player_web.dart @@ -90,12 +90,11 @@ class VideoPlayerPlugin extends VideoPlayerPlatform { ); } - final web.HTMLVideoElement videoElement = - web.HTMLVideoElement() - ..id = 'videoElement-$playerId' - ..style.border = 'none' - ..style.height = '100%' - ..style.width = '100%'; + final web.HTMLVideoElement videoElement = web.HTMLVideoElement() + ..id = 'videoElement-$playerId' + ..style.border = 'none' + ..style.height = '100%' + ..style.width = '100%'; // TODO(hterkelsen): Use initialization parameters once they are available ui_web.platformViewRegistry.registerViewFactory( From 7c41c4e46bb71e304fce43017112540ca2e4ce0a Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Thu, 16 Oct 2025 23:33:49 +0200 Subject: [PATCH 14/23] Fixes rebase merge errors --- .../plugins/videoplayer/VideoPlayerPlugin.java | 2 +- .../videoplayer/texture/TextureVideoPlayer.java | 6 ------ .../video_player_avfoundation/FVPVideoPlayerPlugin.m | 12 ------------ 3 files changed, 1 insertion(+), 19 deletions(-) diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java index 477f128c6af..f506fea98c5 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java @@ -199,7 +199,7 @@ public void setMixWithOthers(@NonNull Boolean mixWithOthers) { @Override public void setAllowBackgroundPlayback(@NonNull Boolean allowBackgroundPlayback) { - options.allowBackgroundPlayback = allowBackgroundPlayback; + sharedOptions.allowBackgroundPlayback = allowBackgroundPlayback; } private interface KeyForAssetFn { diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java index e03bc3bb19d..6fffb98d15a 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java @@ -100,14 +100,8 @@ public void onSurfaceAvailable() { @RestrictTo(RestrictTo.Scope.LIBRARY) public void onSurfaceCleanup() { - if (options == null || !options.allowBackgroundPlayback) { - savedStateDuring = ExoPlayerState.save(exoPlayer); - exoPlayer.release(); - } else { - savedStateDuring = null; exoPlayer.setVideoSurface(null); needsSurface = true; - } } public void dispose() { diff --git a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m index c620333b66c..20cf565177e 100644 --- a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m @@ -247,18 +247,6 @@ - (void)setAllowBackgroundPlayback:(BOOL)allowBackgroundPlayback #endif } -- (void)setAllowBackgroundPlayback:(BOOL)allowBackgroundPlayback - error:(FlutterError **)error { -#if TARGET_OS_IOS - if (allowBackgroundPlayback) { - upgradeAudioSessionCategory(AVAudioSessionCategoryPlayback, - AVAudioSessionCategoryOptionMixWithOthers, 0); - } else { - upgradeAudioSessionCategory(AVAudioSession.sharedInstance.category, 0, 0); - } -#endif -} - - (nullable NSString *)fileURLForAssetWithName:(NSString *)asset package:(nullable NSString *)package error:(FlutterError *_Nullable *_Nonnull)error { From b820a88c0d78a2249cc6e7ba6850c367cc542898 Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Fri, 17 Oct 2025 00:01:43 +0200 Subject: [PATCH 15/23] Remove dependency_overrides and update to published platform interface 6.5.0 --- packages/video_player/video_player/example/pubspec.yaml | 7 ------- packages/video_player/video_player/pubspec.yaml | 7 ------- .../video_player/video_player_android/example/pubspec.yaml | 4 ---- packages/video_player/video_player_android/pubspec.yaml | 6 +----- .../video_player_avfoundation/example/pubspec.yaml | 4 ---- .../video_player/video_player_avfoundation/pubspec.yaml | 6 +----- .../video_player/video_player_web/example/pubspec.yaml | 4 ---- packages/video_player/video_player_web/pubspec.yaml | 6 +----- 8 files changed, 3 insertions(+), 41 deletions(-) diff --git a/packages/video_player/video_player/example/pubspec.yaml b/packages/video_player/video_player/example/pubspec.yaml index cb4a34c0fc8..6c990c8b34f 100644 --- a/packages/video_player/video_player/example/pubspec.yaml +++ b/packages/video_player/video_player/example/pubspec.yaml @@ -35,10 +35,3 @@ flutter: - assets/bumble_bee_captions.srt - assets/bumble_bee_captions.vtt - assets/Audio.mp3 -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player_android: {path: ../../../../packages/video_player/video_player_android} - video_player_avfoundation: {path: ../../../../packages/video_player/video_player_avfoundation} - video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} - video_player_web: {path: ../../../../packages/video_player/video_player_web} diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index 9cab02993a3..ecfe58b40ec 100644 --- a/packages/video_player/video_player/pubspec.yaml +++ b/packages/video_player/video_player/pubspec.yaml @@ -38,10 +38,3 @@ dev_dependencies: topics: - video - video-player -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player_android: {path: ../../../packages/video_player/video_player_android} - video_player_avfoundation: {path: ../../../packages/video_player/video_player_avfoundation} - video_player_platform_interface: {path: ../../../packages/video_player/video_player_platform_interface} - video_player_web: {path: ../../../packages/video_player/video_player_web} diff --git a/packages/video_player/video_player_android/example/pubspec.yaml b/packages/video_player/video_player_android/example/pubspec.yaml index 1a3b7cdffff..4afc63d4990 100644 --- a/packages/video_player/video_player_android/example/pubspec.yaml +++ b/packages/video_player/video_player_android/example/pubspec.yaml @@ -34,7 +34,3 @@ flutter: assets: - assets/flutter-mark-square-64.png - assets/Butterfly-209.mp4 -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} diff --git a/packages/video_player/video_player_android/pubspec.yaml b/packages/video_player/video_player_android/pubspec.yaml index 9e3eb52ac40..e500dc14a35 100644 --- a/packages/video_player/video_player_android/pubspec.yaml +++ b/packages/video_player/video_player_android/pubspec.yaml @@ -20,7 +20,7 @@ flutter: dependencies: flutter: sdk: flutter - video_player_platform_interface: ^6.3.0 + video_player_platform_interface: ^6.5.0 dev_dependencies: build_runner: ^2.3.3 @@ -32,7 +32,3 @@ dev_dependencies: topics: - video - video-player -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player_platform_interface: {path: ../../../packages/video_player/video_player_platform_interface} diff --git a/packages/video_player/video_player_avfoundation/example/pubspec.yaml b/packages/video_player/video_player_avfoundation/example/pubspec.yaml index 1f09101e4a1..8d52a355e9d 100644 --- a/packages/video_player/video_player_avfoundation/example/pubspec.yaml +++ b/packages/video_player/video_player_avfoundation/example/pubspec.yaml @@ -31,7 +31,3 @@ flutter: assets: - assets/flutter-mark-square-64.png - assets/Butterfly-209.mp4 -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} diff --git a/packages/video_player/video_player_avfoundation/pubspec.yaml b/packages/video_player/video_player_avfoundation/pubspec.yaml index 60280ea543b..1a0f8eec243 100644 --- a/packages/video_player/video_player_avfoundation/pubspec.yaml +++ b/packages/video_player/video_player_avfoundation/pubspec.yaml @@ -24,7 +24,7 @@ flutter: dependencies: flutter: sdk: flutter - video_player_platform_interface: ^6.3.0 + video_player_platform_interface: ^6.5.0 dev_dependencies: build_runner: ^2.3.3 @@ -36,7 +36,3 @@ dev_dependencies: topics: - video - video-player -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player_platform_interface: {path: ../../../packages/video_player/video_player_platform_interface} diff --git a/packages/video_player/video_player_web/example/pubspec.yaml b/packages/video_player/video_player_web/example/pubspec.yaml index c11ee9cfc8b..e3bce694990 100644 --- a/packages/video_player/video_player_web/example/pubspec.yaml +++ b/packages/video_player/video_player_web/example/pubspec.yaml @@ -18,7 +18,3 @@ dev_dependencies: sdk: flutter integration_test: sdk: flutter -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player_platform_interface: {path: ../../../../packages/video_player/video_player_platform_interface} diff --git a/packages/video_player/video_player_web/pubspec.yaml b/packages/video_player/video_player_web/pubspec.yaml index d8ea9bd434b..7eacd05ff61 100644 --- a/packages/video_player/video_player_web/pubspec.yaml +++ b/packages/video_player/video_player_web/pubspec.yaml @@ -21,7 +21,7 @@ dependencies: sdk: flutter flutter_web_plugins: sdk: flutter - video_player_platform_interface: ^6.4.0 + video_player_platform_interface: ^6.5.0 web: ">=0.5.1 <2.0.0" dev_dependencies: @@ -31,7 +31,3 @@ dev_dependencies: topics: - video - video-player -# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. -# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins -dependency_overrides: - video_player_platform_interface: {path: ../../../packages/video_player/video_player_platform_interface} From 7ed672cd2531e1bc92c67375801fb3e7bf86affe Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Fri, 17 Oct 2025 00:03:47 +0200 Subject: [PATCH 16/23] Bump video_player_avfoundation to 2.9.0 and video_player_web to 2.5.0 --- packages/video_player/video_player/pubspec.yaml | 4 ++-- packages/video_player/video_player_avfoundation/CHANGELOG.md | 2 +- packages/video_player/video_player_avfoundation/pubspec.yaml | 2 +- packages/video_player/video_player_web/CHANGELOG.md | 2 +- packages/video_player/video_player_web/pubspec.yaml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index ecfe58b40ec..f9eefa8f1bf 100644 --- a/packages/video_player/video_player/pubspec.yaml +++ b/packages/video_player/video_player/pubspec.yaml @@ -26,9 +26,9 @@ dependencies: sdk: flutter html: ^0.15.0 video_player_android: ^2.8.1 - video_player_avfoundation: ^2.7.0 + video_player_avfoundation: ^2.9.0 video_player_platform_interface: ^6.3.0 - video_player_web: ^2.1.0 + video_player_web: ^2.5.0 dev_dependencies: flutter_test: diff --git a/packages/video_player/video_player_avfoundation/CHANGELOG.md b/packages/video_player/video_player_avfoundation/CHANGELOG.md index 4a2e123b3f5..3957267b84c 100644 --- a/packages/video_player/video_player_avfoundation/CHANGELOG.md +++ b/packages/video_player/video_player_avfoundation/CHANGELOG.md @@ -1,4 +1,4 @@ -## NEXT +## 2.9.0 * Updates minimum supported SDK version to Flutter 3.29/Dart 3.7. * Implements background playback functionality using allowBackgroundPlayback option. diff --git a/packages/video_player/video_player_avfoundation/pubspec.yaml b/packages/video_player/video_player_avfoundation/pubspec.yaml index 1a0f8eec243..ac25b5a7db1 100644 --- a/packages/video_player/video_player_avfoundation/pubspec.yaml +++ b/packages/video_player/video_player_avfoundation/pubspec.yaml @@ -2,7 +2,7 @@ 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 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 -version: 2.8.4 +version: 2.9.0 environment: sdk: ^3.7.0 diff --git a/packages/video_player/video_player_web/CHANGELOG.md b/packages/video_player/video_player_web/CHANGELOG.md index 426a5d1d7cd..ebdcf00e521 100644 --- a/packages/video_player/video_player_web/CHANGELOG.md +++ b/packages/video_player/video_player_web/CHANGELOG.md @@ -1,4 +1,4 @@ -## NEXT +## 2.5.0 * Updates minimum supported SDK version to Flutter 3.29/Dart 3.7. * Implements background playback functionality using allowBackgroundPlayback option. diff --git a/packages/video_player/video_player_web/pubspec.yaml b/packages/video_player/video_player_web/pubspec.yaml index 7eacd05ff61..82a101cd867 100644 --- a/packages/video_player/video_player_web/pubspec.yaml +++ b/packages/video_player/video_player_web/pubspec.yaml @@ -2,7 +2,7 @@ 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 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 -version: 2.4.0 +version: 2.5.0 environment: sdk: ^3.7.0 From 9f65b1e8c69b0078d3473f8ebad93b4925408294 Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Fri, 17 Oct 2025 00:04:28 +0200 Subject: [PATCH 17/23] Update video_player CHANGELOG to version 2.11.0 --- packages/video_player/video_player/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index dcd5b5a0dd6..8e9f0a9bbdc 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,4 +1,4 @@ -## NEXT +## 2.11.0 * Updates minimum supported SDK version to Flutter 3.29/Dart 3.7. * Implements background playback functionality using allowBackgroundPlayback option. From 121c597f47d766e786276fa2a9e14e53f7ca434d Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Fri, 17 Oct 2025 00:06:58 +0200 Subject: [PATCH 18/23] Format code with dart format and clang-format --- .../integration_test/video_player_test.dart | 8 +- .../video_player/example/lib/basic.dart | 22 +- .../video_player/example/lib/main.dart | 39 +-- .../video_player/lib/src/sub_rip.dart | 2 +- .../video_player/lib/src/web_vtt.dart | 2 +- .../video_player/lib/video_player.dart | 133 ++++----- .../video_player/test/video_player_test.dart | 42 +-- .../texture/TextureVideoPlayer.java | 38 +-- .../FVPVideoPlayerPlugin.m | 3 +- .../video_player_avfoundation/messages.g.h | 47 ++-- .../video_player_avfoundation/messages.g.m | 266 ++++++++++++------ .../integration_test/pkg_web_tweaks.dart | 3 +- .../integration_test/video_player_test.dart | 126 +++++---- .../video_player_web_test.dart | 81 +++--- .../lib/src/video_player.dart | 24 +- .../lib/video_player_web.dart | 11 +- 16 files changed, 480 insertions(+), 367 deletions(-) diff --git a/packages/video_player/video_player/example/integration_test/video_player_test.dart b/packages/video_player/video_player/example/integration_test/video_player_test.dart index 2531bd37808..7ddf2404957 100644 --- a/packages/video_player/video_player/example/integration_test/video_player_test.dart +++ b/packages/video_player/video_player/example/integration_test/video_player_test.dart @@ -56,8 +56,8 @@ void main() { }); testWidgets('live stream duration != 0', (WidgetTester tester) async { - final VideoPlayerController networkController = - VideoPlayerController.networkUrl( + final VideoPlayerController + networkController = VideoPlayerController.networkUrl( Uri.parse( 'https://flutter.github.io/assets-for-api-docs/assets/videos/hls/bee.m3u8', ), @@ -312,8 +312,8 @@ void main() { skip: // MEDIA_ELEMENT_ERROR on web, see https://github.com/flutter/flutter/issues/169219 kIsWeb || - // Hanging on Android, see https://github.com/flutter/flutter/issues/160797 - defaultTargetPlatform == TargetPlatform.android, + // Hanging on Android, see https://github.com/flutter/flutter/issues/160797 + defaultTargetPlatform == TargetPlatform.android, ); }); diff --git a/packages/video_player/video_player/example/lib/basic.dart b/packages/video_player/video_player/example/lib/basic.dart index d9bc1983ccb..f8ef6029ae6 100644 --- a/packages/video_player/video_player/example/lib/basic.dart +++ b/packages/video_player/video_player/example/lib/basic.dart @@ -28,10 +28,11 @@ class _VideoAppState extends State { void initState() { super.initState(); _controller = VideoPlayerController.networkUrl( - Uri.parse( - 'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4', - ), - )..initialize().then((_) { + Uri.parse( + 'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4', + ), + ) + ..initialize().then((_) { // Ensure the first frame is shown after the video is initialized, even before the play button has been pressed. setState(() {}); }); @@ -43,12 +44,13 @@ class _VideoAppState extends State { title: 'Video Demo', home: Scaffold( body: Center( - child: _controller.value.isInitialized - ? AspectRatio( - aspectRatio: _controller.value.aspectRatio, - child: VideoPlayer(_controller), - ) - : Container(), + child: + _controller.value.isInitialized + ? AspectRatio( + aspectRatio: _controller.value.aspectRatio, + child: VideoPlayer(_controller), + ) + : Container(), ), floatingActionButton: FloatingActionButton( onPressed: () { diff --git a/packages/video_player/video_player/example/lib/main.dart b/packages/video_player/video_player/example/lib/main.dart index 8249f71d92a..1382af5d87d 100644 --- a/packages/video_player/video_player/example/lib/main.dart +++ b/packages/video_player/video_player/example/lib/main.dart @@ -50,16 +50,17 @@ class _App extends StatelessWidget { body: TabBarView( children: [ _ViewTypeTabBar( - builder: (VideoViewType viewType) => - _BumbleBeeRemoteVideo(viewType), + builder: + (VideoViewType viewType) => _BumbleBeeRemoteVideo(viewType), ), _ViewTypeTabBar( - builder: (VideoViewType viewType) => - _ButterFlyAssetVideo(viewType), + builder: + (VideoViewType viewType) => _ButterFlyAssetVideo(viewType), ), _ViewTypeTabBar( - builder: (VideoViewType viewType) => - _ButterFlyAssetVideoInList(viewType), + builder: + (VideoViewType viewType) => + _ButterFlyAssetVideoInList(viewType), ), ], ), @@ -145,7 +146,8 @@ class _ButterFlyAssetVideoInList extends StatelessWidget { title: Text('Video video'), ), Stack( - alignment: FractionalOffset.bottomRight + + alignment: + FractionalOffset.bottomRight + const FractionalOffset(-0.1, -0.1), children: [ _ButterFlyAssetVideo(viewType), @@ -379,19 +381,20 @@ class _ControlsOverlay extends StatelessWidget { AnimatedSwitcher( duration: const Duration(milliseconds: 50), reverseDuration: const Duration(milliseconds: 200), - child: controller.value.isPlaying - ? const SizedBox.shrink() - : const ColoredBox( - color: Colors.black26, - child: Center( - child: Icon( - Icons.play_arrow, - color: Colors.white, - size: 100.0, - semanticLabel: 'Play', + child: + controller.value.isPlaying + ? const SizedBox.shrink() + : const ColoredBox( + color: Colors.black26, + child: Center( + child: Icon( + Icons.play_arrow, + color: Colors.white, + size: 100.0, + semanticLabel: 'Play', + ), ), ), - ), ), GestureDetector( onTap: () { diff --git a/packages/video_player/video_player/lib/src/sub_rip.dart b/packages/video_player/video_player/lib/src/sub_rip.dart index 447305a2acc..991026fd6e0 100644 --- a/packages/video_player/video_player/lib/src/sub_rip.dart +++ b/packages/video_player/video_player/lib/src/sub_rip.dart @@ -13,7 +13,7 @@ class SubRipCaptionFile extends ClosedCaptionFile { /// the SubRip file format. /// * See: https://en.wikipedia.org/wiki/SubRip SubRipCaptionFile(this.fileContents) - : _captions = _parseCaptionsFromSubRipString(fileContents); + : _captions = _parseCaptionsFromSubRipString(fileContents); /// The entire body of the SubRip file. // TODO(cyanglaz): Remove this public member as it doesn't seem need to exist. diff --git a/packages/video_player/video_player/lib/src/web_vtt.dart b/packages/video_player/video_player/lib/src/web_vtt.dart index b8e78560196..a46b602c227 100644 --- a/packages/video_player/video_player/lib/src/web_vtt.dart +++ b/packages/video_player/video_player/lib/src/web_vtt.dart @@ -16,7 +16,7 @@ class WebVTTCaptionFile extends ClosedCaptionFile { /// the WebVTT file format. /// * See: https://en.wikipedia.org/wiki/WebVTT WebVTTCaptionFile(String fileContents) - : _captions = _parseCaptionsFromWebVTTString(fileContents); + : _captions = _parseCaptionsFromWebVTTString(fileContents); @override List get captions => _captions; diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart index e71093fdda3..f0f63978a0a 100644 --- a/packages/video_player/video_player/lib/video_player.dart +++ b/packages/video_player/video_player/lib/video_player.dart @@ -63,15 +63,15 @@ class VideoPlayerValue { /// Returns an instance for a video that hasn't been loaded. const VideoPlayerValue.uninitialized() - : this(duration: Duration.zero, isInitialized: false); + : this(duration: Duration.zero, isInitialized: false); /// Returns an instance with the given [errorDescription]. const VideoPlayerValue.erroneous(String errorDescription) - : this( - duration: Duration.zero, - isInitialized: false, - errorDescription: errorDescription, - ); + : this( + duration: Duration.zero, + isInitialized: false, + errorDescription: errorDescription, + ); /// This constant is just to indicate that parameter is not passed to [copyWith] /// workaround for this issue https://github.com/dart-lang/language/issues/2009 @@ -188,9 +188,10 @@ class VideoPlayerValue { volume: volume ?? this.volume, playbackSpeed: playbackSpeed ?? this.playbackSpeed, rotationCorrection: rotationCorrection ?? this.rotationCorrection, - errorDescription: errorDescription != _defaultErrorDescription - ? errorDescription - : this.errorDescription, + errorDescription: + errorDescription != _defaultErrorDescription + ? errorDescription + : this.errorDescription, isCompleted: isCompleted ?? this.isCompleted, ); } @@ -237,22 +238,22 @@ class VideoPlayerValue { @override int get hashCode => Object.hash( - duration, - position, - caption, - captionOffset, - buffered, - isPlaying, - isLooping, - isBuffering, - volume, - playbackSpeed, - errorDescription, - size, - rotationCorrection, - isInitialized, - isCompleted, - ); + duration, + position, + caption, + captionOffset, + buffered, + isPlaying, + isLooping, + isBuffering, + volume, + playbackSpeed, + errorDescription, + size, + rotationCorrection, + isInitialized, + isCompleted, + ); } /// Controls a platform video player, and provides updates when the state is @@ -281,11 +282,11 @@ class VideoPlayerController extends ValueNotifier { Future? closedCaptionFile, this.videoPlayerOptions, this.viewType = VideoViewType.textureView, - }) : _closedCaptionFileFuture = closedCaptionFile, - dataSourceType = DataSourceType.asset, - formatHint = null, - httpHeaders = const {}, - super(const VideoPlayerValue(duration: Duration.zero)); + }) : _closedCaptionFileFuture = closedCaptionFile, + dataSourceType = DataSourceType.asset, + formatHint = null, + httpHeaders = const {}, + super(const VideoPlayerValue(duration: Duration.zero)); /// Constructs a [VideoPlayerController] playing a network video. /// @@ -308,10 +309,10 @@ class VideoPlayerController extends ValueNotifier { this.videoPlayerOptions, this.httpHeaders = const {}, this.viewType = VideoViewType.textureView, - }) : _closedCaptionFileFuture = closedCaptionFile, - dataSourceType = DataSourceType.network, - package = null, - super(const VideoPlayerValue(duration: Duration.zero)); + }) : _closedCaptionFileFuture = closedCaptionFile, + dataSourceType = DataSourceType.network, + package = null, + super(const VideoPlayerValue(duration: Duration.zero)); /// Constructs a [VideoPlayerController] playing a network video. /// @@ -329,11 +330,11 @@ class VideoPlayerController extends ValueNotifier { this.videoPlayerOptions, this.httpHeaders = const {}, this.viewType = VideoViewType.textureView, - }) : _closedCaptionFileFuture = closedCaptionFile, - dataSource = url.toString(), - dataSourceType = DataSourceType.network, - package = null, - super(const VideoPlayerValue(duration: Duration.zero)); + }) : _closedCaptionFileFuture = closedCaptionFile, + dataSource = url.toString(), + dataSourceType = DataSourceType.network, + package = null, + super(const VideoPlayerValue(duration: Duration.zero)); /// Constructs a [VideoPlayerController] playing a video from a file. /// @@ -345,12 +346,12 @@ class VideoPlayerController extends ValueNotifier { this.videoPlayerOptions, this.httpHeaders = const {}, this.viewType = VideoViewType.textureView, - }) : _closedCaptionFileFuture = closedCaptionFile, - dataSource = Uri.file(file.absolute.path).toString(), - dataSourceType = DataSourceType.file, - package = null, - formatHint = null, - super(const VideoPlayerValue(duration: Duration.zero)); + }) : _closedCaptionFileFuture = closedCaptionFile, + dataSource = Uri.file(file.absolute.path).toString(), + dataSourceType = DataSourceType.file, + package = null, + formatHint = null, + super(const VideoPlayerValue(duration: Duration.zero)); /// Constructs a [VideoPlayerController] playing a video from a contentUri. /// @@ -361,17 +362,17 @@ class VideoPlayerController extends ValueNotifier { Future? closedCaptionFile, this.videoPlayerOptions, this.viewType = VideoViewType.textureView, - }) : assert( - defaultTargetPlatform == TargetPlatform.android, - 'VideoPlayerController.contentUri is only supported on Android.', - ), - _closedCaptionFileFuture = closedCaptionFile, - dataSource = contentUri.toString(), - dataSourceType = DataSourceType.contentUri, - package = null, - formatHint = null, - httpHeaders = const {}, - super(const VideoPlayerValue(duration: Duration.zero)); + }) : assert( + defaultTargetPlatform == TargetPlatform.android, + 'VideoPlayerController.contentUri is only supported on Android.', + ), + _closedCaptionFileFuture = closedCaptionFile, + dataSource = contentUri.toString(), + dataSourceType = DataSourceType.contentUri, + package = null, + formatHint = null, + httpHeaders = const {}, + super(const VideoPlayerValue(duration: Duration.zero)); /// The URI to the video file. This will be in different formats depending on /// the [DataSourceType] of the original video. @@ -470,12 +471,13 @@ class VideoPlayerController extends ValueNotifier { if (videoPlayerOptions?.allowBackgroundPlayback != null) { await _videoPlayerPlatform.setAllowBackgroundPlayback( - videoPlayerOptions!.allowBackgroundPlayback); + videoPlayerOptions!.allowBackgroundPlayback, + ); } _playerId = (await _videoPlayerPlatform.createWithOptions(creationOptions)) ?? - kUninitializedPlayerId; + kUninitializedPlayerId; _creatingCompleter!.complete(null); final Completer initializingCompleter = Completer(); @@ -910,17 +912,17 @@ class _VideoPlayerState extends State { return _playerId == VideoPlayerController.kUninitializedPlayerId ? Container() : _VideoPlayerWithRotation( - rotation: widget.controller.value.rotationCorrection, - child: _videoPlayerPlatform.buildViewWithOptions( - VideoViewOptions(playerId: _playerId), - ), - ); + rotation: widget.controller.value.rotationCorrection, + child: _videoPlayerPlatform.buildViewWithOptions( + VideoViewOptions(playerId: _playerId), + ), + ); } } class _VideoPlayerWithRotation extends StatelessWidget { const _VideoPlayerWithRotation({required this.rotation, required this.child}) - : assert(rotation % 90 == 0, 'Rotation must be a multiple of 90'); + : assert(rotation % 90 == 0, 'Rotation must be a multiple of 90'); final int rotation; final Widget child; @@ -1214,7 +1216,8 @@ class ClosedCaption extends StatelessWidget { return const SizedBox.shrink(); } - final TextStyle effectiveTextStyle = textStyle ?? + final TextStyle effectiveTextStyle = + textStyle ?? DefaultTextStyle.of( context, ).style.copyWith(fontSize: 36.0, color: Colors.white); diff --git a/packages/video_player/video_player/test/video_player_test.dart b/packages/video_player/video_player/test/video_player_test.dart index e4fbe3c69df..e0e15194138 100644 --- a/packages/video_player/video_player/test/video_player_test.dart +++ b/packages/video_player/video_player/test/video_player_test.dart @@ -343,9 +343,9 @@ void main() { test('network url with hint', () async { final VideoPlayerController controller = VideoPlayerController.networkUrl( - Uri.parse('https://127.0.0.1'), - formatHint: VideoFormat.dash, - ); + Uri.parse('https://127.0.0.1'), + formatHint: VideoFormat.dash, + ); addTearDown(controller.dispose); await controller.initialize(); @@ -363,9 +363,9 @@ void main() { test('network url with some headers', () async { final VideoPlayerController controller = VideoPlayerController.networkUrl( - Uri.parse('https://127.0.0.1'), - httpHeaders: {'Authorization': 'Bearer token'}, - ); + Uri.parse('https://127.0.0.1'), + httpHeaders: {'Authorization': 'Bearer token'}, + ); addTearDown(controller.dispose); await controller.initialize(); @@ -773,9 +773,9 @@ void main() { test('works when position updates', () async { final VideoPlayerController controller = VideoPlayerController.networkUrl( - _localhostUri, - closedCaptionFile: _loadClosedCaption(), - ); + _localhostUri, + closedCaptionFile: _loadClosedCaption(), + ); await controller.initialize(); await controller.play(); @@ -813,9 +813,9 @@ void main() { test('works when seeking', () async { final VideoPlayerController controller = VideoPlayerController.networkUrl( - _localhostUri, - closedCaptionFile: _loadClosedCaption(), - ); + _localhostUri, + closedCaptionFile: _loadClosedCaption(), + ); addTearDown(controller.dispose); await controller.initialize(); @@ -847,9 +847,9 @@ void main() { test('works when seeking with captionOffset positive', () async { final VideoPlayerController controller = VideoPlayerController.networkUrl( - _localhostUri, - closedCaptionFile: _loadClosedCaption(), - ); + _localhostUri, + closedCaptionFile: _loadClosedCaption(), + ); addTearDown(controller.dispose); await controller.initialize(); @@ -885,9 +885,9 @@ void main() { test('works when seeking with captionOffset negative', () async { final VideoPlayerController controller = VideoPlayerController.networkUrl( - _localhostUri, - closedCaptionFile: _loadClosedCaption(), - ); + _localhostUri, + closedCaptionFile: _loadClosedCaption(), + ); addTearDown(controller.dispose); await controller.initialize(); @@ -941,9 +941,9 @@ void main() { test('setClosedCaptionFile removes/changes caption file', () async { final VideoPlayerController controller = VideoPlayerController.networkUrl( - _localhostUri, - closedCaptionFile: _loadClosedCaption(), - ); + _localhostUri, + closedCaptionFile: _loadClosedCaption(), + ); addTearDown(controller.dispose); await controller.initialize(); diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java index 6fffb98d15a..33addca8f15 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java @@ -40,32 +40,20 @@ public final class TextureVideoPlayer extends VideoPlayer implements SurfaceProd * @return a video player instance. */ @NonNull - public static TextureVideoPlayer create( - @NonNull Context context, - @NonNull VideoPlayerCallbacks events, - @NonNull SurfaceProducer surfaceProducer, - @NonNull VideoAsset asset, - @NonNull VideoPlayerOptions options) { - return new TextureVideoPlayer( - events, - surfaceProducer, - asset.getMediaItem(), - options, - () -> { - ExoPlayer.Builder builder = - new ExoPlayer.Builder(context) - .setMediaSourceFactory(asset.getMediaSourceFactory(context)); - return builder.build(); - }); + public static TextureVideoPlayer create(@NonNull Context context, + @NonNull VideoPlayerCallbacks events, @NonNull SurfaceProducer surfaceProducer, + @NonNull VideoAsset asset, @NonNull VideoPlayerOptions options) { + return new TextureVideoPlayer(events, surfaceProducer, asset.getMediaItem(), options, () -> { + ExoPlayer.Builder builder = new ExoPlayer.Builder(context).setMediaSourceFactory( + asset.getMediaSourceFactory(context)); + return builder.build(); + }); } @VisibleForTesting - public TextureVideoPlayer( - @NonNull VideoPlayerCallbacks events, - @NonNull SurfaceProducer surfaceProducer, - @NonNull MediaItem mediaItem, - @NonNull VideoPlayerOptions options, - @NonNull ExoPlayerProvider exoPlayerProvider) { + public TextureVideoPlayer(@NonNull VideoPlayerCallbacks events, + @NonNull SurfaceProducer surfaceProducer, @NonNull MediaItem mediaItem, + @NonNull VideoPlayerOptions options, @NonNull ExoPlayerProvider exoPlayerProvider) { super(events, mediaItem, options, surfaceProducer, exoPlayerProvider); surfaceProducer.setCallback(this); @@ -100,8 +88,8 @@ public void onSurfaceAvailable() { @RestrictTo(RestrictTo.Scope.LIBRARY) public void onSurfaceCleanup() { - exoPlayer.setVideoSurface(null); - needsSurface = true; + exoPlayer.setVideoSurface(null); + needsSurface = true; } public void dispose() { diff --git a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m index 20cf565177e..69bd51ed9aa 100644 --- a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m @@ -240,8 +240,7 @@ - (void)setMixWithOthers:(BOOL)mixWithOthers #endif } -- (void)setAllowBackgroundPlayback:(BOOL)allowBackgroundPlayback - error:(FlutterError **)error { +- (void)setAllowBackgroundPlayback:(BOOL)allowBackgroundPlayback error:(FlutterError **)error { #if TARGET_OS_IOS // Do nothing here, the background playback still works #endif diff --git a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/include/video_player_avfoundation/messages.g.h b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/include/video_player_avfoundation/messages.g.h index 842c525dcdd..7195df0a5fb 100644 --- a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/include/video_player_avfoundation/messages.g.h +++ b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/include/video_player_avfoundation/messages.g.h @@ -21,26 +21,25 @@ NS_ASSUME_NONNULL_BEGIN @interface FVPPlatformVideoViewCreationParams : NSObject /// `init` unavailable to enforce nonnull fields, see the `make` class method. - (instancetype)init NS_UNAVAILABLE; -+ (instancetype)makeWithPlayerId:(NSInteger )playerId; -@property(nonatomic, assign) NSInteger playerId; ++ (instancetype)makeWithPlayerId:(NSInteger)playerId; +@property(nonatomic, assign) NSInteger playerId; @end @interface FVPCreationOptions : NSObject /// `init` unavailable to enforce nonnull fields, see the `make` class method. - (instancetype)init NS_UNAVAILABLE; + (instancetype)makeWithUri:(NSString *)uri - httpHeaders:(NSDictionary *)httpHeaders; -@property(nonatomic, copy) NSString * uri; -@property(nonatomic, copy) NSDictionary * httpHeaders; + httpHeaders:(NSDictionary *)httpHeaders; +@property(nonatomic, copy) NSString *uri; +@property(nonatomic, copy) NSDictionary *httpHeaders; @end @interface FVPTexturePlayerIds : NSObject /// `init` unavailable to enforce nonnull fields, see the `make` class method. - (instancetype)init NS_UNAVAILABLE; -+ (instancetype)makeWithPlayerId:(NSInteger )playerId - textureId:(NSInteger )textureId; -@property(nonatomic, assign) NSInteger playerId; -@property(nonatomic, assign) NSInteger textureId; ++ (instancetype)makeWithPlayerId:(NSInteger)playerId textureId:(NSInteger)textureId; +@property(nonatomic, assign) NSInteger playerId; +@property(nonatomic, assign) NSInteger textureId; @end /// The codec used by all APIs. @@ -49,18 +48,27 @@ NSObject *FVPGetMessagesCodec(void); @protocol FVPAVFoundationVideoPlayerApi - (void)initialize:(FlutterError *_Nullable *_Nonnull)error; /// @return `nil` only when `error != nil`. -- (nullable NSNumber *)createPlatformViewPlayerWithOptions:(FVPCreationOptions *)params error:(FlutterError *_Nullable *_Nonnull)error; +- (nullable NSNumber *)createPlatformViewPlayerWithOptions:(FVPCreationOptions *)params + error:(FlutterError *_Nullable *_Nonnull)error; /// @return `nil` only when `error != nil`. -- (nullable FVPTexturePlayerIds *)createTexturePlayerWithOptions:(FVPCreationOptions *)creationOptions error:(FlutterError *_Nullable *_Nonnull)error; +- (nullable FVPTexturePlayerIds *) + createTexturePlayerWithOptions:(FVPCreationOptions *)creationOptions + error:(FlutterError *_Nullable *_Nonnull)error; - (void)setMixWithOthers:(BOOL)mixWithOthers error:(FlutterError *_Nullable *_Nonnull)error; -- (void)setAllowBackgroundPlayback:(BOOL)allowBackgroundPlayback error:(FlutterError *_Nullable *_Nonnull)error; -- (nullable NSString *)fileURLForAssetWithName:(NSString *)asset package:(nullable NSString *)package error:(FlutterError *_Nullable *_Nonnull)error; +- (void)setAllowBackgroundPlayback:(BOOL)allowBackgroundPlayback + error:(FlutterError *_Nullable *_Nonnull)error; +- (nullable NSString *)fileURLForAssetWithName:(NSString *)asset + package:(nullable NSString *)package + error:(FlutterError *_Nullable *_Nonnull)error; @end -extern void SetUpFVPAVFoundationVideoPlayerApi(id binaryMessenger, NSObject *_Nullable api); - -extern void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id binaryMessenger, NSObject *_Nullable api, NSString *messageChannelSuffix); +extern void SetUpFVPAVFoundationVideoPlayerApi( + id binaryMessenger, + NSObject *_Nullable api); +extern void SetUpFVPAVFoundationVideoPlayerApiWithSuffix( + id binaryMessenger, + NSObject *_Nullable api, NSString *messageChannelSuffix); @protocol FVPVideoPlayerInstanceApi - (void)setLooping:(BOOL)looping error:(FlutterError *_Nullable *_Nonnull)error; @@ -74,8 +82,11 @@ extern void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id binaryMessenger, NSObject *_Nullable api); +extern void SetUpFVPVideoPlayerInstanceApi(id binaryMessenger, + NSObject *_Nullable api); -extern void SetUpFVPVideoPlayerInstanceApiWithSuffix(id binaryMessenger, NSObject *_Nullable api, NSString *messageChannelSuffix); +extern void SetUpFVPVideoPlayerInstanceApiWithSuffix( + id binaryMessenger, NSObject *_Nullable api, + NSString *messageChannelSuffix); NS_ASSUME_NONNULL_END diff --git a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/messages.g.m b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/messages.g.m index b485b4494fa..fa70a98e83d 100644 --- a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/messages.g.m +++ b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/messages.g.m @@ -49,13 +49,15 @@ + (nullable FVPTexturePlayerIds *)nullableFromList:(NSArray *)list; @end @implementation FVPPlatformVideoViewCreationParams -+ (instancetype)makeWithPlayerId:(NSInteger )playerId { - FVPPlatformVideoViewCreationParams* pigeonResult = [[FVPPlatformVideoViewCreationParams alloc] init]; ++ (instancetype)makeWithPlayerId:(NSInteger)playerId { + FVPPlatformVideoViewCreationParams *pigeonResult = + [[FVPPlatformVideoViewCreationParams alloc] init]; pigeonResult.playerId = playerId; return pigeonResult; } + (FVPPlatformVideoViewCreationParams *)fromList:(NSArray *)list { - FVPPlatformVideoViewCreationParams *pigeonResult = [[FVPPlatformVideoViewCreationParams alloc] init]; + FVPPlatformVideoViewCreationParams *pigeonResult = + [[FVPPlatformVideoViewCreationParams alloc] init]; pigeonResult.playerId = [GetNullableObjectAtIndex(list, 0) integerValue]; return pigeonResult; } @@ -71,8 +73,8 @@ + (nullable FVPPlatformVideoViewCreationParams *)nullableFromList:(NSArray * @implementation FVPCreationOptions + (instancetype)makeWithUri:(NSString *)uri - httpHeaders:(NSDictionary *)httpHeaders { - FVPCreationOptions* pigeonResult = [[FVPCreationOptions alloc] init]; + httpHeaders:(NSDictionary *)httpHeaders { + FVPCreationOptions *pigeonResult = [[FVPCreationOptions alloc] init]; pigeonResult.uri = uri; pigeonResult.httpHeaders = httpHeaders; return pigeonResult; @@ -95,9 +97,8 @@ + (nullable FVPCreationOptions *)nullableFromList:(NSArray *)list { @end @implementation FVPTexturePlayerIds -+ (instancetype)makeWithPlayerId:(NSInteger )playerId - textureId:(NSInteger )textureId { - FVPTexturePlayerIds* pigeonResult = [[FVPTexturePlayerIds alloc] init]; ++ (instancetype)makeWithPlayerId:(NSInteger)playerId textureId:(NSInteger)textureId { + FVPTexturePlayerIds *pigeonResult = [[FVPTexturePlayerIds alloc] init]; pigeonResult.playerId = playerId; pigeonResult.textureId = textureId; return pigeonResult; @@ -124,11 +125,11 @@ @interface FVPMessagesPigeonCodecReader : FlutterStandardReader @implementation FVPMessagesPigeonCodecReader - (nullable id)readValueOfType:(UInt8)type { switch (type) { - case 129: + case 129: return [FVPPlatformVideoViewCreationParams fromList:[self readValue]]; - case 130: + case 130: return [FVPCreationOptions fromList:[self readValue]]; - case 131: + case 131: return [FVPTexturePlayerIds fromList:[self readValue]]; default: return [super readValueOfType:type]; @@ -170,25 +171,35 @@ - (FlutterStandardReader *)readerWithData:(NSData *)data { static FlutterStandardMessageCodec *sSharedObject = nil; static dispatch_once_t sPred = 0; dispatch_once(&sPred, ^{ - FVPMessagesPigeonCodecReaderWriter *readerWriter = [[FVPMessagesPigeonCodecReaderWriter alloc] init]; + FVPMessagesPigeonCodecReaderWriter *readerWriter = + [[FVPMessagesPigeonCodecReaderWriter alloc] init]; sSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter]; }); return sSharedObject; } -void SetUpFVPAVFoundationVideoPlayerApi(id binaryMessenger, NSObject *api) { +void SetUpFVPAVFoundationVideoPlayerApi(id binaryMessenger, + NSObject *api) { SetUpFVPAVFoundationVideoPlayerApiWithSuffix(binaryMessenger, api, @""); } -void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id binaryMessenger, NSObject *api, NSString *messageChannelSuffix) { - messageChannelSuffix = messageChannelSuffix.length > 0 ? [NSString stringWithFormat: @".%@", messageChannelSuffix] : @""; +void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.initialize", messageChannelSuffix] + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.video_player_avfoundation." + @"AVFoundationVideoPlayerApi.initialize", + messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(initialize:)], @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to @selector(initialize:)", api); + NSCAssert([api respondsToSelector:@selector(initialize:)], + @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to @selector(initialize:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { FlutterError *error; [api initialize:&error]; @@ -199,13 +210,19 @@ void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id bin } } { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.createForPlatformView", messageChannelSuffix] + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.video_player_avfoundation." + @"AVFoundationVideoPlayerApi.createForPlatformView", + messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(createPlatformViewPlayerWithOptions:error:)], @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to @selector(createPlatformViewPlayerWithOptions:error:)", api); + NSCAssert([api respondsToSelector:@selector(createPlatformViewPlayerWithOptions:error:)], + @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to " + @"@selector(createPlatformViewPlayerWithOptions:error:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FVPCreationOptions *arg_params = GetNullableObjectAtIndex(args, 0); @@ -218,18 +235,25 @@ void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id bin } } { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.createForTextureView", messageChannelSuffix] + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.video_player_avfoundation." + @"AVFoundationVideoPlayerApi.createForTextureView", + messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(createTexturePlayerWithOptions:error:)], @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to @selector(createTexturePlayerWithOptions:error:)", api); + NSCAssert([api respondsToSelector:@selector(createTexturePlayerWithOptions:error:)], + @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to " + @"@selector(createTexturePlayerWithOptions:error:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; FVPCreationOptions *arg_creationOptions = GetNullableObjectAtIndex(args, 0); FlutterError *error; - FVPTexturePlayerIds *output = [api createTexturePlayerWithOptions:arg_creationOptions error:&error]; + FVPTexturePlayerIds *output = [api createTexturePlayerWithOptions:arg_creationOptions + error:&error]; callback(wrapResult(output, error)); }]; } else { @@ -237,13 +261,18 @@ void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id bin } } { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.setMixWithOthers", messageChannelSuffix] + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.video_player_avfoundation." + @"AVFoundationVideoPlayerApi.setMixWithOthers", + messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(setMixWithOthers:error:)], @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to @selector(setMixWithOthers:error:)", api); + NSCAssert([api respondsToSelector:@selector(setMixWithOthers:error:)], + @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to " + @"@selector(setMixWithOthers:error:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; BOOL arg_mixWithOthers = [GetNullableObjectAtIndex(args, 0) boolValue]; @@ -256,13 +285,19 @@ void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id bin } } { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.setAllowBackgroundPlayback", messageChannelSuffix] + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName: + [NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.video_player_avfoundation." + @"AVFoundationVideoPlayerApi.setAllowBackgroundPlayback", + messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(setAllowBackgroundPlayback:error:)], @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to @selector(setAllowBackgroundPlayback:error:)", api); + NSCAssert([api respondsToSelector:@selector(setAllowBackgroundPlayback:error:)], + @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to " + @"@selector(setAllowBackgroundPlayback:error:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; BOOL arg_allowBackgroundPlayback = [GetNullableObjectAtIndex(args, 0) boolValue]; @@ -275,13 +310,18 @@ void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id bin } } { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.getAssetUrl", messageChannelSuffix] + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.video_player_avfoundation." + @"AVFoundationVideoPlayerApi.getAssetUrl", + messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(fileURLForAssetWithName:package:error:)], @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to @selector(fileURLForAssetWithName:package:error:)", api); + NSCAssert([api respondsToSelector:@selector(fileURLForAssetWithName:package:error:)], + @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to " + @"@selector(fileURLForAssetWithName:package:error:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; NSString *arg_asset = GetNullableObjectAtIndex(args, 0); @@ -295,20 +335,30 @@ void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id bin } } } -void SetUpFVPVideoPlayerInstanceApi(id binaryMessenger, NSObject *api) { +void SetUpFVPVideoPlayerInstanceApi(id binaryMessenger, + NSObject *api) { SetUpFVPVideoPlayerInstanceApiWithSuffix(binaryMessenger, api, @""); } -void SetUpFVPVideoPlayerInstanceApiWithSuffix(id binaryMessenger, NSObject *api, NSString *messageChannelSuffix) { - messageChannelSuffix = messageChannelSuffix.length > 0 ? [NSString stringWithFormat: @".%@", messageChannelSuffix] : @""; +void SetUpFVPVideoPlayerInstanceApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.setLooping", messageChannelSuffix] + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.video_player_avfoundation." + @"VideoPlayerInstanceApi.setLooping", + messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(setLooping:error:)], @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(setLooping:error:)", api); + NSCAssert( + [api respondsToSelector:@selector(setLooping:error:)], + @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(setLooping:error:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; BOOL arg_looping = [GetNullableObjectAtIndex(args, 0) boolValue]; @@ -321,13 +371,18 @@ void SetUpFVPVideoPlayerInstanceApiWithSuffix(id binaryM } } { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.setVolume", messageChannelSuffix] + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.video_player_avfoundation." + @"VideoPlayerInstanceApi.setVolume", + messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(setVolume:error:)], @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(setVolume:error:)", api); + NSCAssert( + [api respondsToSelector:@selector(setVolume:error:)], + @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(setVolume:error:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; double arg_volume = [GetNullableObjectAtIndex(args, 0) doubleValue]; @@ -340,13 +395,18 @@ void SetUpFVPVideoPlayerInstanceApiWithSuffix(id binaryM } } { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.setPlaybackSpeed", messageChannelSuffix] + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.video_player_avfoundation." + @"VideoPlayerInstanceApi.setPlaybackSpeed", + messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(setPlaybackSpeed:error:)], @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(setPlaybackSpeed:error:)", api); + NSCAssert([api respondsToSelector:@selector(setPlaybackSpeed:error:)], + @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to " + @"@selector(setPlaybackSpeed:error:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; double arg_speed = [GetNullableObjectAtIndex(args, 0) doubleValue]; @@ -359,13 +419,17 @@ void SetUpFVPVideoPlayerInstanceApiWithSuffix(id binaryM } } { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.play", messageChannelSuffix] + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.video_player_avfoundation." + @"VideoPlayerInstanceApi.play", + messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(playWithError:)], @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(playWithError:)", api); + NSCAssert([api respondsToSelector:@selector(playWithError:)], + @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(playWithError:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { FlutterError *error; [api playWithError:&error]; @@ -376,13 +440,16 @@ void SetUpFVPVideoPlayerInstanceApiWithSuffix(id binaryM } } { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.getPosition", messageChannelSuffix] + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.video_player_avfoundation." + @"VideoPlayerInstanceApi.getPosition", + messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(position:)], @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(position:)", api); + NSCAssert([api respondsToSelector:@selector(position:)], + @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(position:)", api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { FlutterError *error; NSNumber *output = [api position:&error]; @@ -393,32 +460,42 @@ void SetUpFVPVideoPlayerInstanceApiWithSuffix(id binaryM } } { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.seekTo", messageChannelSuffix] + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.video_player_avfoundation." + @"VideoPlayerInstanceApi.seekTo", + messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(seekTo:completion:)], @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(seekTo:completion:)", api); + NSCAssert( + [api respondsToSelector:@selector(seekTo:completion:)], + @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(seekTo:completion:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { NSArray *args = message; NSInteger arg_position = [GetNullableObjectAtIndex(args, 0) integerValue]; - [api seekTo:arg_position completion:^(FlutterError *_Nullable error) { - callback(wrapResult(nil, error)); - }]; + [api seekTo:arg_position + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; }]; } else { [channel setMessageHandler:nil]; } } { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.pause", messageChannelSuffix] + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.video_player_avfoundation." + @"VideoPlayerInstanceApi.pause", + messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(pauseWithError:)], @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(pauseWithError:)", api); + NSCAssert([api respondsToSelector:@selector(pauseWithError:)], + @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(pauseWithError:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { FlutterError *error; [api pauseWithError:&error]; @@ -429,13 +506,18 @@ void SetUpFVPVideoPlayerInstanceApiWithSuffix(id binaryM } } { - FlutterBasicMessageChannel *channel = - [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.video_player_avfoundation.VideoPlayerInstanceApi.dispose", messageChannelSuffix] + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.video_player_avfoundation." + @"VideoPlayerInstanceApi.dispose", + messageChannelSuffix] binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; + codec:FVPGetMessagesCodec()]; if (api) { - NSCAssert([api respondsToSelector:@selector(disposeWithError:)], @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(disposeWithError:)", api); + NSCAssert( + [api respondsToSelector:@selector(disposeWithError:)], + @"FVPVideoPlayerInstanceApi api (%@) doesn't respond to @selector(disposeWithError:)", + api); [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { FlutterError *error; [api disposeWithError:&error]; diff --git a/packages/video_player/video_player_web/example/integration_test/pkg_web_tweaks.dart b/packages/video_player/video_player_web/example/integration_test/pkg_web_tweaks.dart index 5ec37344c88..91ae5eabd1b 100644 --- a/packages/video_player/video_player_web/example/integration_test/pkg_web_tweaks.dart +++ b/packages/video_player/video_player_web/example/integration_test/pkg_web_tweaks.dart @@ -57,8 +57,7 @@ extension type Descriptor._(JSObject _) implements JSObject { factory Descriptor.accessor({ void Function(JSAny? value)? set, JSAny? Function()? get, - }) => - Descriptor._accessor(set: set?.toJS, get: get?.toJS); + }) => Descriptor._accessor(set: set?.toJS, get: get?.toJS); external factory Descriptor._accessor({ // JSBoolean configurable, diff --git a/packages/video_player/video_player_web/example/integration_test/video_player_test.dart b/packages/video_player/video_player_web/example/integration_test/video_player_test.dart index 2e7c1a44f50..c183c6c076e 100644 --- a/packages/video_player/video_player_web/example/integration_test/video_player_test.dart +++ b/packages/video_player/video_player_web/example/integration_test/video_player_test.dart @@ -24,17 +24,19 @@ void main() { setUp(() { // Never set "src" on the video, so this test doesn't hit the network! - video = web.HTMLVideoElement() - ..controls = true - ..playsInline = false; + video = + web.HTMLVideoElement() + ..controls = true + ..playsInline = false; }); testWidgets('initialize() calls load', (WidgetTester _) async { bool loadCalled = false; - video['load'] = () { - loadCalled = true; - }.toJS; + video['load'] = + () { + loadCalled = true; + }.toJS; VideoPlayer(videoElement: video).initialize(); @@ -191,15 +193,17 @@ void main() { WidgetTester tester, ) async { // Take all the "buffering" events that we see during the next few seconds - final Future> stream = timedStream - .where( - (VideoEvent event) => bufferingEvents.contains(event.eventType), - ) - .map( - (VideoEvent event) => - event.eventType == VideoEventType.bufferingStart, - ) - .toList(); + final Future> stream = + timedStream + .where( + (VideoEvent event) => + bufferingEvents.contains(event.eventType), + ) + .map( + (VideoEvent event) => + event.eventType == VideoEventType.bufferingStart, + ) + .toList(); // Simulate some events coming from the player... player.setBuffering(true); @@ -222,15 +226,17 @@ void main() { WidgetTester tester, ) async { // Take all the "buffering" events that we see during the next few seconds - final Future> stream = timedStream - .where( - (VideoEvent event) => bufferingEvents.contains(event.eventType), - ) - .map( - (VideoEvent event) => - event.eventType == VideoEventType.bufferingStart, - ) - .toList(); + final Future> stream = + timedStream + .where( + (VideoEvent event) => + bufferingEvents.contains(event.eventType), + ) + .map( + (VideoEvent event) => + event.eventType == VideoEventType.bufferingStart, + ) + .toList(); player.setBuffering(true); @@ -247,15 +253,17 @@ void main() { WidgetTester tester, ) async { // Take all the "buffering" events that we see during the next few seconds - final Future> stream = timedStream - .where( - (VideoEvent event) => bufferingEvents.contains(event.eventType), - ) - .map( - (VideoEvent event) => - event.eventType == VideoEventType.bufferingStart, - ) - .toList(); + final Future> stream = + timedStream + .where( + (VideoEvent event) => + bufferingEvents.contains(event.eventType), + ) + .map( + (VideoEvent event) => + event.eventType == VideoEventType.bufferingStart, + ) + .toList(); player.setBuffering(true); @@ -277,12 +285,13 @@ void main() { video.dispatchEvent(web.Event('canplay')); // Take all the "initialized" events that we see during the next few seconds - final Future> stream = timedStream - .where( - (VideoEvent event) => - event.eventType == VideoEventType.initialized, - ) - .toList(); + final Future> stream = + timedStream + .where( + (VideoEvent event) => + event.eventType == VideoEventType.initialized, + ) + .toList(); video.dispatchEvent(web.Event('canplay')); video.dispatchEvent(web.Event('canplay')); @@ -300,12 +309,13 @@ void main() { video.dispatchEvent(web.Event('loadedmetadata')); video.dispatchEvent(web.Event('loadedmetadata')); - final Future> stream = timedStream - .where( - (VideoEvent event) => - event.eventType == VideoEventType.initialized, - ) - .toList(); + final Future> stream = + timedStream + .where( + (VideoEvent event) => + event.eventType == VideoEventType.initialized, + ) + .toList(); final List events = await stream; @@ -318,12 +328,13 @@ void main() { video.dispatchEvent(web.Event('loadeddata')); video.dispatchEvent(web.Event('loadeddata')); - final Future> stream = timedStream - .where( - (VideoEvent event) => - event.eventType == VideoEventType.initialized, - ) - .toList(); + final Future> stream = + timedStream + .where( + (VideoEvent event) => + event.eventType == VideoEventType.initialized, + ) + .toList(); final List events = await stream; @@ -335,12 +346,13 @@ void main() { setInfinityDuration(video); expect(video.duration.isInfinite, isTrue); - final Future> stream = timedStream - .where( - (VideoEvent event) => - event.eventType == VideoEventType.initialized, - ) - .toList(); + final Future> stream = + timedStream + .where( + (VideoEvent event) => + event.eventType == VideoEventType.initialized, + ) + .toList(); video.dispatchEvent(web.Event('canplay')); diff --git a/packages/video_player/video_player_web/example/integration_test/video_player_web_test.dart b/packages/video_player/video_player_web/example/integration_test/video_player_web_test.dart index 818f56a2288..4cc6e408530 100644 --- a/packages/video_player/video_player_web/example/integration_test/video_player_web_test.dart +++ b/packages/video_player/video_player_web/example/integration_test/video_player_web_test.dart @@ -124,19 +124,19 @@ void main() { ) async { final int videoPlayerId = (await VideoPlayerPlatform.instance.createWithOptions( - VideoCreationOptions( - dataSource: DataSource( - sourceType: DataSourceType.network, - uri: getUrlForAssetAsNetworkSource( - 'assets/__non_existent.webm', + VideoCreationOptions( + dataSource: DataSource( + sourceType: DataSourceType.network, + uri: getUrlForAssetAsNetworkSource( + 'assets/__non_existent.webm', + ), + ), + viewType: VideoViewType.platformView, ), - ), - viewType: VideoViewType.platformView, - ), - ))!; + ))!; - final Stream eventStream = - VideoPlayerPlatform.instance.videoEventsFor(videoPlayerId); + final Stream eventStream = VideoPlayerPlatform.instance + .videoEventsFor(videoPlayerId); // Mute video to allow autoplay (See https://goo.gl/xX8pDD) await VideoPlayerPlatform.instance.setVolume(videoPlayerId, 0); @@ -203,27 +203,35 @@ void main() { expect(VideoPlayerPlatform.instance.setMixWithOthers(false), completes); }); - testWidgets('ignores setting allowBackgroundPlayback', - (WidgetTester tester) async { - expect(VideoPlayerPlatform.instance.setAllowBackgroundPlayback(true), - completes); - expect(VideoPlayerPlatform.instance.setAllowBackgroundPlayback(false), - completes); + testWidgets('ignores setting allowBackgroundPlayback', ( + WidgetTester tester, + ) async { + expect( + VideoPlayerPlatform.instance.setAllowBackgroundPlayback(true), + completes, + ); + expect( + VideoPlayerPlatform.instance.setAllowBackgroundPlayback(false), + completes, + ); }); testWidgets( 'double call to play will emit a single isPlayingStateUpdate event', (WidgetTester tester) async { final int videoPlayerId = await playerId; - final Stream eventStream = - VideoPlayerPlatform.instance.videoEventsFor(videoPlayerId); - - final Future> stream = eventStream.timeout( - const Duration(seconds: 2), - onTimeout: (EventSink sink) { - sink.close(); - }, - ).toList(); + final Stream eventStream = VideoPlayerPlatform.instance + .videoEventsFor(videoPlayerId); + + final Future> stream = + eventStream + .timeout( + const Duration(seconds: 2), + onTimeout: (EventSink sink) { + sink.close(); + }, + ) + .toList(); await VideoPlayerPlatform.instance.setVolume(videoPlayerId, 0); await VideoPlayerPlatform.instance.play(videoPlayerId); @@ -255,15 +263,18 @@ void main() { 'video playback lifecycle', (WidgetTester tester) async { final int videoPlayerId = await playerId; - final Stream eventStream = - VideoPlayerPlatform.instance.videoEventsFor(videoPlayerId); - - final Future> stream = eventStream.timeout( - const Duration(seconds: 2), - onTimeout: (EventSink sink) { - sink.close(); - }, - ).toList(); + final Stream eventStream = VideoPlayerPlatform.instance + .videoEventsFor(videoPlayerId); + + final Future> stream = + eventStream + .timeout( + const Duration(seconds: 2), + onTimeout: (EventSink sink) { + sink.close(); + }, + ) + .toList(); await VideoPlayerPlatform.instance.setVolume(videoPlayerId, 0); await VideoPlayerPlatform.instance.play(videoPlayerId); diff --git a/packages/video_player/video_player_web/lib/src/video_player.dart b/packages/video_player/video_player_web/lib/src/video_player.dart index 6db581cde28..af7dfcd5920 100644 --- a/packages/video_player/video_player_web/lib/src/video_player.dart +++ b/packages/video_player/video_player_web/lib/src/video_player.dart @@ -42,8 +42,8 @@ class VideoPlayer { VideoPlayer({ required web.HTMLVideoElement videoElement, @visibleForTesting StreamController? eventController, - }) : _videoElement = videoElement, - _eventController = eventController ?? StreamController(); + }) : _videoElement = videoElement, + _eventController = eventController ?? StreamController(); final StreamController _eventController; final web.HTMLVideoElement _videoElement; @@ -313,12 +313,13 @@ class VideoPlayer { _videoElement.duration, ); - final Size? size = _videoElement.videoHeight.isFinite - ? Size( - _videoElement.videoWidth.toDouble(), - _videoElement.videoHeight.toDouble(), - ) - : null; + final Size? size = + _videoElement.videoHeight.isFinite + ? Size( + _videoElement.videoWidth.toDouble(), + _videoElement.videoHeight.toDouble(), + ) + : null; _eventController.add( VideoEvent( @@ -339,9 +340,10 @@ class VideoPlayer { _isBuffering = buffering; _eventController.add( VideoEvent( - eventType: _isBuffering - ? VideoEventType.bufferingStart - : VideoEventType.bufferingEnd, + eventType: + _isBuffering + ? VideoEventType.bufferingStart + : VideoEventType.bufferingEnd, ), ); } diff --git a/packages/video_player/video_player_web/lib/video_player_web.dart b/packages/video_player/video_player_web/lib/video_player_web.dart index 0b05380c0a2..2ec3981120c 100644 --- a/packages/video_player/video_player_web/lib/video_player_web.dart +++ b/packages/video_player/video_player_web/lib/video_player_web.dart @@ -90,11 +90,12 @@ class VideoPlayerPlugin extends VideoPlayerPlatform { ); } - final web.HTMLVideoElement videoElement = web.HTMLVideoElement() - ..id = 'videoElement-$playerId' - ..style.border = 'none' - ..style.height = '100%' - ..style.width = '100%'; + final web.HTMLVideoElement videoElement = + web.HTMLVideoElement() + ..id = 'videoElement-$playerId' + ..style.border = 'none' + ..style.height = '100%' + ..style.width = '100%'; // TODO(hterkelsen): Use initialization parameters once they are available ui_web.platformViewRegistry.registerViewFactory( From d338d1cba948f0ad57b3ec965783dede81189196 Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Fri, 17 Oct 2025 00:42:54 +0200 Subject: [PATCH 19/23] Revert dependency versions to published versions in video_player package --- packages/video_player/video_player/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index f9eefa8f1bf..ecfe58b40ec 100644 --- a/packages/video_player/video_player/pubspec.yaml +++ b/packages/video_player/video_player/pubspec.yaml @@ -26,9 +26,9 @@ dependencies: sdk: flutter html: ^0.15.0 video_player_android: ^2.8.1 - video_player_avfoundation: ^2.9.0 + video_player_avfoundation: ^2.7.0 video_player_platform_interface: ^6.3.0 - video_player_web: ^2.5.0 + video_player_web: ^2.1.0 dev_dependencies: flutter_test: From df5b91fb6e8f119317f0a85a6bd81bb8932b0e49 Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Fri, 17 Oct 2025 01:08:20 +0200 Subject: [PATCH 20/23] Fix TextureVideoPlayer formatting and update video_player_platform_interface dependency to version 6.5.0 across all packages --- .../video_player/video_player/pubspec.yaml | 2 +- .../texture/TextureVideoPlayer.java | 34 +++++++++++++------ .../video_player_android/example/pubspec.yaml | 2 +- .../example/pubspec.yaml | 2 +- .../video_player_web/example/pubspec.yaml | 2 +- 5 files changed, 27 insertions(+), 15 deletions(-) diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index ecfe58b40ec..0a1ef2ca883 100644 --- a/packages/video_player/video_player/pubspec.yaml +++ b/packages/video_player/video_player/pubspec.yaml @@ -27,7 +27,7 @@ dependencies: html: ^0.15.0 video_player_android: ^2.8.1 video_player_avfoundation: ^2.7.0 - video_player_platform_interface: ^6.3.0 + video_player_platform_interface: ^6.5.0 video_player_web: ^2.1.0 dev_dependencies: diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java index 33addca8f15..57ed030f564 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/texture/TextureVideoPlayer.java @@ -40,20 +40,32 @@ public final class TextureVideoPlayer extends VideoPlayer implements SurfaceProd * @return a video player instance. */ @NonNull - public static TextureVideoPlayer create(@NonNull Context context, - @NonNull VideoPlayerCallbacks events, @NonNull SurfaceProducer surfaceProducer, - @NonNull VideoAsset asset, @NonNull VideoPlayerOptions options) { - return new TextureVideoPlayer(events, surfaceProducer, asset.getMediaItem(), options, () -> { - ExoPlayer.Builder builder = new ExoPlayer.Builder(context).setMediaSourceFactory( - asset.getMediaSourceFactory(context)); - return builder.build(); - }); + public static TextureVideoPlayer create( + @NonNull Context context, + @NonNull VideoPlayerCallbacks events, + @NonNull SurfaceProducer surfaceProducer, + @NonNull VideoAsset asset, + @NonNull VideoPlayerOptions options) { + return new TextureVideoPlayer( + events, + surfaceProducer, + asset.getMediaItem(), + options, + () -> { + ExoPlayer.Builder builder = + new ExoPlayer.Builder(context) + .setMediaSourceFactory(asset.getMediaSourceFactory(context)); + return builder.build(); + }); } @VisibleForTesting - public TextureVideoPlayer(@NonNull VideoPlayerCallbacks events, - @NonNull SurfaceProducer surfaceProducer, @NonNull MediaItem mediaItem, - @NonNull VideoPlayerOptions options, @NonNull ExoPlayerProvider exoPlayerProvider) { + public TextureVideoPlayer( + @NonNull VideoPlayerCallbacks events, + @NonNull SurfaceProducer surfaceProducer, + @NonNull MediaItem mediaItem, + @NonNull VideoPlayerOptions options, + @NonNull ExoPlayerProvider exoPlayerProvider) { super(events, mediaItem, options, surfaceProducer, exoPlayerProvider); surfaceProducer.setCallback(this); diff --git a/packages/video_player/video_player_android/example/pubspec.yaml b/packages/video_player/video_player_android/example/pubspec.yaml index 4afc63d4990..9b9f8a21cca 100644 --- a/packages/video_player/video_player_android/example/pubspec.yaml +++ b/packages/video_player/video_player_android/example/pubspec.yaml @@ -18,7 +18,7 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ - video_player_platform_interface: ^6.3.0 + video_player_platform_interface: ^6.5.0 dev_dependencies: espresso: ^0.4.0 diff --git a/packages/video_player/video_player_avfoundation/example/pubspec.yaml b/packages/video_player/video_player_avfoundation/example/pubspec.yaml index 8d52a355e9d..46e8e18f515 100644 --- a/packages/video_player/video_player_avfoundation/example/pubspec.yaml +++ b/packages/video_player/video_player_avfoundation/example/pubspec.yaml @@ -16,7 +16,7 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ - video_player_platform_interface: ^6.3.0 + video_player_platform_interface: ^6.5.0 dev_dependencies: flutter_test: diff --git a/packages/video_player/video_player_web/example/pubspec.yaml b/packages/video_player/video_player_web/example/pubspec.yaml index e3bce694990..58d6cd09045 100644 --- a/packages/video_player/video_player_web/example/pubspec.yaml +++ b/packages/video_player/video_player_web/example/pubspec.yaml @@ -8,7 +8,7 @@ environment: dependencies: flutter: sdk: flutter - video_player_platform_interface: ^6.3.0 + video_player_platform_interface: ^6.5.0 video_player_web: path: ../ web: ^1.0.0 From fddf6043941dd3edc44d3fd4ad466538fc679a4b Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Mon, 20 Oct 2025 20:02:04 +0200 Subject: [PATCH 21/23] Remove no-op setAllowBackgroundPlayback method and related references for iOS; update comments for background playback handling --- .../plugins/videoplayer/VideoPlayer.java | 2 ++ .../FVPVideoPlayerPlugin.m | 6 ----- .../video_player_avfoundation/messages.g.h | 2 -- .../video_player_avfoundation/messages.g.m | 25 ----------------- .../lib/src/avfoundation_video_player.dart | 3 ++- .../lib/src/messages.g.dart | 27 ------------------- .../pigeons/messages.dart | 2 -- 7 files changed, 4 insertions(+), 63 deletions(-) diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java index 8b34632ea4e..92c2903ae73 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java @@ -58,6 +58,8 @@ public VideoPlayer( setAudioAttributes(exoPlayer, options.mixWithOthers); if (options.allowBackgroundPlayback) { + // This flag allows playback to continue when the device is in Doze mode. + // WAKE_MODE_NETWORK is used to allow network streaming to continue. exoPlayer.setWakeMode(C.WAKE_MODE_NETWORK); exoPlayer.setAudioAttributes( new AudioAttributes.Builder().setUsage(C.USAGE_MEDIA).build(), diff --git a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m index 69bd51ed9aa..d1914d9f7c1 100644 --- a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayerPlugin.m @@ -240,12 +240,6 @@ - (void)setMixWithOthers:(BOOL)mixWithOthers #endif } -- (void)setAllowBackgroundPlayback:(BOOL)allowBackgroundPlayback error:(FlutterError **)error { -#if TARGET_OS_IOS - // Do nothing here, the background playback still works -#endif -} - - (nullable NSString *)fileURLForAssetWithName:(NSString *)asset package:(nullable NSString *)package error:(FlutterError *_Nullable *_Nonnull)error { diff --git a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/include/video_player_avfoundation/messages.g.h b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/include/video_player_avfoundation/messages.g.h index 7195df0a5fb..becb97700e9 100644 --- a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/include/video_player_avfoundation/messages.g.h +++ b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/include/video_player_avfoundation/messages.g.h @@ -55,8 +55,6 @@ NSObject *FVPGetMessagesCodec(void); createTexturePlayerWithOptions:(FVPCreationOptions *)creationOptions error:(FlutterError *_Nullable *_Nonnull)error; - (void)setMixWithOthers:(BOOL)mixWithOthers error:(FlutterError *_Nullable *_Nonnull)error; -- (void)setAllowBackgroundPlayback:(BOOL)allowBackgroundPlayback - error:(FlutterError *_Nullable *_Nonnull)error; - (nullable NSString *)fileURLForAssetWithName:(NSString *)asset package:(nullable NSString *)package error:(FlutterError *_Nullable *_Nonnull)error; diff --git a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/messages.g.m b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/messages.g.m index fa70a98e83d..5caf390b96a 100644 --- a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/messages.g.m +++ b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/messages.g.m @@ -284,31 +284,6 @@ void SetUpFVPAVFoundationVideoPlayerApiWithSuffix(id bin [channel setMessageHandler:nil]; } } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName: - [NSString stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.video_player_avfoundation." - @"AVFoundationVideoPlayerApi.setAllowBackgroundPlayback", - messageChannelSuffix] - binaryMessenger:binaryMessenger - codec:FVPGetMessagesCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(setAllowBackgroundPlayback:error:)], - @"FVPAVFoundationVideoPlayerApi api (%@) doesn't respond to " - @"@selector(setAllowBackgroundPlayback:error:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - BOOL arg_allowBackgroundPlayback = [GetNullableObjectAtIndex(args, 0) boolValue]; - FlutterError *error; - [api setAllowBackgroundPlayback:arg_allowBackgroundPlayback error:&error]; - callback(wrapResult(nil, error)); - }]; - } else { - [channel setMessageHandler:nil]; - } - } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] initWithName:[NSString stringWithFormat:@"%@%@", diff --git a/packages/video_player/video_player_avfoundation/lib/src/avfoundation_video_player.dart b/packages/video_player/video_player_avfoundation/lib/src/avfoundation_video_player.dart index e87861447c7..2cd5be0b1c7 100644 --- a/packages/video_player/video_player_avfoundation/lib/src/avfoundation_video_player.dart +++ b/packages/video_player/video_player_avfoundation/lib/src/avfoundation_video_player.dart @@ -214,7 +214,8 @@ class AVFoundationVideoPlayer extends VideoPlayerPlatform { @override Future setAllowBackgroundPlayback(bool allowBackgroundPlayback) { - return _api.setAllowBackgroundPlayback(allowBackgroundPlayback); + // No-op on iOS as background playback already works + return Future.value(); } @override diff --git a/packages/video_player/video_player_avfoundation/lib/src/messages.g.dart b/packages/video_player/video_player_avfoundation/lib/src/messages.g.dart index ef3ce35c7b6..842210ef11e 100644 --- a/packages/video_player/video_player_avfoundation/lib/src/messages.g.dart +++ b/packages/video_player/video_player_avfoundation/lib/src/messages.g.dart @@ -324,33 +324,6 @@ class AVFoundationVideoPlayerApi { } } - Future setAllowBackgroundPlayback(bool allowBackgroundPlayback) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.setAllowBackgroundPlayback$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send( - [allowBackgroundPlayback], - ); - final List? pigeonVar_replyList = - await pigeonVar_sendFuture as List?; - if (pigeonVar_replyList == null) { - throw _createConnectionError(pigeonVar_channelName); - } else if (pigeonVar_replyList.length > 1) { - throw PlatformException( - code: pigeonVar_replyList[0]! as String, - message: pigeonVar_replyList[1] as String?, - details: pigeonVar_replyList[2], - ); - } else { - return; - } - } - Future getAssetUrl(String asset, String? package) async { final String pigeonVar_channelName = 'dev.flutter.pigeon.video_player_avfoundation.AVFoundationVideoPlayerApi.getAssetUrl$pigeonVar_messageChannelSuffix'; diff --git a/packages/video_player/video_player_avfoundation/pigeons/messages.dart b/packages/video_player/video_player_avfoundation/pigeons/messages.dart index 086a2538add..6e872dec145 100644 --- a/packages/video_player/video_player_avfoundation/pigeons/messages.dart +++ b/packages/video_player/video_player_avfoundation/pigeons/messages.dart @@ -52,8 +52,6 @@ abstract class AVFoundationVideoPlayerApi { TexturePlayerIds createForTextureView(CreationOptions creationOptions); @ObjCSelector('setMixWithOthers:') void setMixWithOthers(bool mixWithOthers); - @ObjCSelector('setAllowBackgroundPlayback:') - void setAllowBackgroundPlayback(bool allowBackgroundPlayback); @ObjCSelector('fileURLForAssetWithName:package:') String? getAssetUrl(String asset, String? package); } From 513f2e0aeb083f5bbe428d75a059a5569ed73f63 Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Mon, 20 Oct 2025 21:12:38 +0200 Subject: [PATCH 22/23] Refactor setAllowBackgroundPlayback method to use primitive boolean type; update related API interface and message handling --- .../videoplayer/VideoPlayerPlugin.java | 2 +- .../flutter/plugins/videoplayer/Messages.kt | 27 ++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java index e2fc3bda968..1391e9db201 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java @@ -189,7 +189,7 @@ public void setMixWithOthers(boolean mixWithOthers) { } @Override - public void setAllowBackgroundPlayback(@NonNull Boolean allowBackgroundPlayback) { + public void setAllowBackgroundPlayback(boolean allowBackgroundPlayback) { sharedOptions.allowBackgroundPlayback = allowBackgroundPlayback; } diff --git a/packages/video_player/video_player_android/android/src/main/kotlin/io/flutter/plugins/videoplayer/Messages.kt b/packages/video_player/video_player_android/android/src/main/kotlin/io/flutter/plugins/videoplayer/Messages.kt index 800026ab4d8..80723c4fa1a 100644 --- a/packages/video_player/video_player_android/android/src/main/kotlin/io/flutter/plugins/videoplayer/Messages.kt +++ b/packages/video_player/video_player_android/android/src/main/kotlin/io/flutter/plugins/videoplayer/Messages.kt @@ -55,7 +55,7 @@ private object MessagesPigeonUtils { } if (a is Map<*, *> && b is Map<*, *>) { return a.size == b.size && - a.all { (b as Map).contains(it.key) && deepEquals(it.value, b[it.key]) } + a.all { (b as Map).containsKey(it.key) && deepEquals(it.value, b[it.key]) } } return a == b } @@ -412,6 +412,8 @@ interface AndroidVideoPlayerApi { fun setMixWithOthers(mixWithOthers: Boolean) + fun setAllowBackgroundPlayback(allowBackgroundPlayback: Boolean) + fun getLookupKeyForAsset(asset: String, packageName: String?): String companion object { @@ -540,6 +542,29 @@ interface AndroidVideoPlayerApi { channel.setMessageHandler(null) } } + run { + val channel = + BasicMessageChannel( + binaryMessenger, + "dev.flutter.pigeon.video_player_android.AndroidVideoPlayerApi.setAllowBackgroundPlayback$separatedMessageChannelSuffix", + codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val allowBackgroundPlaybackArg = args[0] as Boolean + val wrapped: List = + try { + api.setAllowBackgroundPlayback(allowBackgroundPlaybackArg) + listOf(null) + } catch (exception: Throwable) { + MessagesPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } run { val channel = BasicMessageChannel( From b6417cf094857a5c301926f0938a35d7b8f79055 Mon Sep 17 00:00:00 2001 From: ArvidNy Date: Mon, 20 Oct 2025 23:42:50 +0200 Subject: [PATCH 23/23] Fix use contains instead of containsKey for map comparison --- .../src/main/kotlin/io/flutter/plugins/videoplayer/Messages.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/video_player/video_player_android/android/src/main/kotlin/io/flutter/plugins/videoplayer/Messages.kt b/packages/video_player/video_player_android/android/src/main/kotlin/io/flutter/plugins/videoplayer/Messages.kt index 80723c4fa1a..da58aa3c719 100644 --- a/packages/video_player/video_player_android/android/src/main/kotlin/io/flutter/plugins/videoplayer/Messages.kt +++ b/packages/video_player/video_player_android/android/src/main/kotlin/io/flutter/plugins/videoplayer/Messages.kt @@ -55,7 +55,7 @@ private object MessagesPigeonUtils { } if (a is Map<*, *> && b is Map<*, *>) { return a.size == b.size && - a.all { (b as Map).containsKey(it.key) && deepEquals(it.value, b[it.key]) } + a.all { (b as Map).contains(it.key) && deepEquals(it.value, b[it.key]) } } return a == b }