From 8384b8bf495e427a200a1661f4c7ea3e6ee17b3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jakubowski?= Date: Wed, 29 Jan 2025 16:17:39 +0100 Subject: [PATCH 1/4] Rename textureId to playerId for Web --- .../video_player_web_test.dart | 34 ++++---- .../lib/video_player_web.dart | 80 ++++++++++--------- 2 files changed, 61 insertions(+), 53 deletions(-) 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 7c8f1c9acef..f2d5193640e 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 @@ -20,18 +20,18 @@ void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); group('VideoPlayerWeb plugin (hits network)', () { - late Future textureId; + late Future playerId; setUp(() { VideoPlayerPlatform.instance = VideoPlayerPlugin(); - textureId = VideoPlayerPlatform.instance + playerId = VideoPlayerPlatform.instance .create( DataSource( sourceType: DataSourceType.network, uri: getUrlForAssetAsNetworkSource(_videoAssetKey), ), ) - .then((int? textureId) => textureId!); + .then((int? playerId) => playerId!); }); testWidgets('can init', (WidgetTester tester) async { @@ -84,20 +84,20 @@ void main() { }); testWidgets('can dispose', (WidgetTester tester) async { - expect(VideoPlayerPlatform.instance.dispose(await textureId), completes); + expect(VideoPlayerPlatform.instance.dispose(await playerId), completes); }); testWidgets('can set looping', (WidgetTester tester) async { expect( - VideoPlayerPlatform.instance.setLooping(await textureId, true), + VideoPlayerPlatform.instance.setLooping(await playerId, true), completes, ); }); testWidgets('can play', (WidgetTester tester) async { // Mute video to allow autoplay (See https://goo.gl/xX8pDD) - await VideoPlayerPlatform.instance.setVolume(await textureId, 0); - expect(VideoPlayerPlatform.instance.play(await textureId), completes); + await VideoPlayerPlatform.instance.setVolume(await playerId, 0); + expect(VideoPlayerPlatform.instance.play(await playerId), completes); }); testWidgets('throws PlatformException when playing bad media', @@ -122,19 +122,19 @@ void main() { }); testWidgets('can pause', (WidgetTester tester) async { - expect(VideoPlayerPlatform.instance.pause(await textureId), completes); + expect(VideoPlayerPlatform.instance.pause(await playerId), completes); }); testWidgets('can set volume', (WidgetTester tester) async { expect( - VideoPlayerPlatform.instance.setVolume(await textureId, 0.8), + VideoPlayerPlatform.instance.setVolume(await playerId, 0.8), completes, ); }); testWidgets('can set playback speed', (WidgetTester tester) async { expect( - VideoPlayerPlatform.instance.setPlaybackSpeed(await textureId, 2.0), + VideoPlayerPlatform.instance.setPlaybackSpeed(await playerId, 2.0), completes, ); }); @@ -142,7 +142,7 @@ void main() { testWidgets('can seek to position', (WidgetTester tester) async { expect( VideoPlayerPlatform.instance.seekTo( - await textureId, + await playerId, const Duration(seconds: 1), ), completes, @@ -150,17 +150,17 @@ void main() { }); testWidgets('can get position', (WidgetTester tester) async { - expect(VideoPlayerPlatform.instance.getPosition(await textureId), + expect(VideoPlayerPlatform.instance.getPosition(await playerId), completion(isInstanceOf())); }); testWidgets('can get video event stream', (WidgetTester tester) async { - expect(VideoPlayerPlatform.instance.videoEventsFor(await textureId), + expect(VideoPlayerPlatform.instance.videoEventsFor(await playerId), isInstanceOf>()); }); testWidgets('can build view', (WidgetTester tester) async { - expect(VideoPlayerPlatform.instance.buildView(await textureId), + expect(VideoPlayerPlatform.instance.buildView(await playerId), isInstanceOf()); }); @@ -172,7 +172,7 @@ void main() { testWidgets( 'double call to play will emit a single isPlayingStateUpdate event', (WidgetTester tester) async { - final int videoPlayerId = await textureId; + final int videoPlayerId = await playerId; final Stream eventStream = VideoPlayerPlatform.instance.videoEventsFor(videoPlayerId); @@ -204,7 +204,7 @@ void main() { }); testWidgets('video playback lifecycle', (WidgetTester tester) async { - final int videoPlayerId = await textureId; + final int videoPlayerId = await playerId; final Stream eventStream = VideoPlayerPlatform.instance.videoEventsFor(videoPlayerId); @@ -243,7 +243,7 @@ void main() { testWidgets('can set web options', (WidgetTester tester) async { expect( VideoPlayerPlatform.instance.setWebOptions( - await textureId, + await playerId, const VideoPlayerWebOptions(), ), completes, 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 45a7285bb56..0f68c264cd4 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 @@ -12,9 +12,6 @@ import 'package:web/web.dart' as web; import 'src/video_player.dart'; -// TODO(FirentisTFW): Remove the ignore and rename parameters when adding support for platform views. -// ignore_for_file: avoid_renaming_method_parameters - /// The web implementation of [VideoPlayerPlatform]. /// /// This class implements the `package:video_player` functionality for the web. @@ -24,11 +21,10 @@ class VideoPlayerPlugin extends VideoPlayerPlatform { VideoPlayerPlatform.instance = VideoPlayerPlugin(); } - // Map of textureId -> VideoPlayer instances + // Map of playerId -> VideoPlayer instances. final Map _videoPlayers = {}; - // Simulate the native "textureId". - int _textureCounter = 1; + int _playerCounter = 1; @override Future init() async { @@ -36,9 +32,9 @@ class VideoPlayerPlugin extends VideoPlayerPlatform { } @override - Future dispose(int textureId) async { - _player(textureId).dispose(); - _videoPlayers.remove(textureId); + Future dispose(int playerId) async { + _player(playerId).dispose(); + _videoPlayers.remove(playerId); return; } @@ -50,8 +46,20 @@ class VideoPlayerPlugin extends VideoPlayerPlatform { } @override - Future create(DataSource dataSource) async { - final int textureId = _textureCounter++; + Future create(DataSource dataSource) { + return createWithOptions( + VideoCreationOptions( + dataSource: dataSource, + // Web only supports platform views. + viewType: VideoViewType.platformView, + ), + ); + } + + @override + Future createWithOptions(VideoCreationOptions options) async { + final DataSource dataSource = options.dataSource; + final int playerId = _playerCounter++; late String uri; switch (dataSource.sourceType) { @@ -75,68 +83,68 @@ class VideoPlayerPlugin extends VideoPlayerPlatform { } final web.HTMLVideoElement videoElement = web.HTMLVideoElement() - ..id = 'videoElement-$textureId' + ..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( - 'videoPlayer-$textureId', (int viewId) => videoElement); + 'videoPlayer-$playerId', (int viewId) => videoElement); final VideoPlayer player = VideoPlayer(videoElement: videoElement) ..initialize( src: uri, ); - _videoPlayers[textureId] = player; + _videoPlayers[playerId] = player; - return textureId; + return playerId; } @override - Future setLooping(int textureId, bool looping) async { - return _player(textureId).setLooping(looping); + Future setLooping(int playerId, bool looping) async { + return _player(playerId).setLooping(looping); } @override - Future play(int textureId) async { - return _player(textureId).play(); + Future play(int playerId) async { + return _player(playerId).play(); } @override - Future pause(int textureId) async { - return _player(textureId).pause(); + Future pause(int playerId) async { + return _player(playerId).pause(); } @override - Future setVolume(int textureId, double volume) async { - return _player(textureId).setVolume(volume); + Future setVolume(int playerId, double volume) async { + return _player(playerId).setVolume(volume); } @override - Future setPlaybackSpeed(int textureId, double speed) async { - return _player(textureId).setPlaybackSpeed(speed); + Future setPlaybackSpeed(int playerId, double speed) async { + return _player(playerId).setPlaybackSpeed(speed); } @override - Future seekTo(int textureId, Duration position) async { - return _player(textureId).seekTo(position); + Future seekTo(int playerId, Duration position) async { + return _player(playerId).seekTo(position); } @override - Future getPosition(int textureId) async { - return _player(textureId).getPosition(); + Future getPosition(int playerId) async { + return _player(playerId).getPosition(); } @override - Stream videoEventsFor(int textureId) { - return _player(textureId).events; + Stream videoEventsFor(int playerId) { + return _player(playerId).events; } @override - Future setWebOptions(int textureId, VideoPlayerWebOptions options) { - return _player(textureId).setOptions(options); + Future setWebOptions(int playerId, VideoPlayerWebOptions options) { + return _player(playerId).setOptions(options); } // Retrieves a [VideoPlayer] by its internal `id`. @@ -146,11 +154,11 @@ class VideoPlayerPlugin extends VideoPlayerPlatform { } @override - Widget buildView(int textureId) { - return HtmlElementView(viewType: 'videoPlayer-$textureId'); + Widget buildView(int playerId) { + return HtmlElementView(viewType: 'videoPlayer-$playerId'); } - /// Sets the audio mode to mix with other sources (ignored) + /// Sets the audio mode to mix with other sources (ignored). @override Future setMixWithOthers(bool mixWithOthers) => Future.value(); } From 4d867405d82595ae357094e25fa7a707aafb0434 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jakubowski?= Date: Wed, 29 Jan 2025 16:24:10 +0100 Subject: [PATCH 2/4] Add a comment explaining ignoring view type on Web --- .../video_player/video_player_web/lib/video_player_web.dart | 3 +++ 1 file changed, 3 insertions(+) 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 0f68c264cd4..0505e871f96 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 @@ -58,6 +58,9 @@ class VideoPlayerPlugin extends VideoPlayerPlatform { @override Future createWithOptions(VideoCreationOptions options) async { + // Parameter options.viewType is ignored because web only supports platform views. + // If texture view type was passed in, it is just ignored. + final DataSource dataSource = options.dataSource; final int playerId = _playerCounter++; From 8b3658efa607077682d47246f9cd3d08f593f64a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jakubowski?= Date: Wed, 29 Jan 2025 16:24:33 +0100 Subject: [PATCH 3/4] Bump platform interface dependency and package version --- packages/video_player/video_player_web/CHANGELOG.md | 4 ++++ packages/video_player/video_player_web/example/pubspec.yaml | 2 +- packages/video_player/video_player_web/pubspec.yaml | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/video_player/video_player_web/CHANGELOG.md b/packages/video_player/video_player_web/CHANGELOG.md index 20635077c16..252f5e75f73 100644 --- a/packages/video_player/video_player_web/CHANGELOG.md +++ b/packages/video_player/video_player_web/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.3.4 + +* Adjusts the code to the new platform interface. + ## 2.3.3 * Updates minimum supported SDK version to Flutter 3.22/Dart 3.4. diff --git a/packages/video_player/video_player_web/example/pubspec.yaml b/packages/video_player/video_player_web/example/pubspec.yaml index 56662e0764e..1ebae929e19 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.1.0 + video_player_platform_interface: ^6.3.0 video_player_web: path: ../ web: ^1.0.0 diff --git a/packages/video_player/video_player_web/pubspec.yaml b/packages/video_player/video_player_web/pubspec.yaml index 0985ee1297b..c13a7578ba2 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.3.3 +version: 2.3.4 environment: sdk: ^3.4.0 @@ -21,7 +21,7 @@ dependencies: sdk: flutter flutter_web_plugins: sdk: flutter - video_player_platform_interface: ^6.2.0 + video_player_platform_interface: ^6.3.0 web: ">=0.5.1 <2.0.0" dev_dependencies: From 3e79a301cb471a007210ec368504d1f90b925dbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jakubowski?= Date: Wed, 29 Jan 2025 18:24:28 +0100 Subject: [PATCH 4/4] Remove redundant sentence from a comment --- packages/video_player/video_player_web/lib/video_player_web.dart | 1 - 1 file changed, 1 deletion(-) 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 0505e871f96..d65eabacfcc 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 @@ -59,7 +59,6 @@ class VideoPlayerPlugin extends VideoPlayerPlatform { @override Future createWithOptions(VideoCreationOptions options) async { // Parameter options.viewType is ignored because web only supports platform views. - // If texture view type was passed in, it is just ignored. final DataSource dataSource = options.dataSource; final int playerId = _playerCounter++;