Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/video_player/video_player_web/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,18 @@ void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();

group('VideoPlayerWeb plugin (hits network)', () {
late Future<int> textureId;
late Future<int> 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 {
Expand Down Expand Up @@ -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',
Expand All @@ -122,45 +122,45 @@ 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,
);
});

testWidgets('can seek to position', (WidgetTester tester) async {
expect(
VideoPlayerPlatform.instance.seekTo(
await textureId,
await playerId,
const Duration(seconds: 1),
),
completes,
);
});

testWidgets('can get position', (WidgetTester tester) async {
expect(VideoPlayerPlatform.instance.getPosition(await textureId),
expect(VideoPlayerPlatform.instance.getPosition(await playerId),
completion(isInstanceOf<Duration>()));
});

testWidgets('can get video event stream', (WidgetTester tester) async {
expect(VideoPlayerPlatform.instance.videoEventsFor(await textureId),
expect(VideoPlayerPlatform.instance.videoEventsFor(await playerId),
isInstanceOf<Stream<VideoEvent>>());
});

testWidgets('can build view', (WidgetTester tester) async {
expect(VideoPlayerPlatform.instance.buildView(await textureId),
expect(VideoPlayerPlatform.instance.buildView(await playerId),
isInstanceOf<Widget>());
});

Expand All @@ -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<VideoEvent> eventStream =
VideoPlayerPlatform.instance.videoEventsFor(videoPlayerId);

Expand Down Expand Up @@ -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<VideoEvent> eventStream =
VideoPlayerPlatform.instance.videoEventsFor(videoPlayerId);

Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
82 changes: 46 additions & 36 deletions packages/video_player/video_player_web/lib/video_player_web.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -24,21 +21,20 @@ class VideoPlayerPlugin extends VideoPlayerPlatform {
VideoPlayerPlatform.instance = VideoPlayerPlugin();
}

// Map of textureId -> VideoPlayer instances
// Map of playerId -> VideoPlayer instances.
final Map<int, VideoPlayer> _videoPlayers = <int, VideoPlayer>{};

// Simulate the native "textureId".
int _textureCounter = 1;
int _playerCounter = 1;

@override
Future<void> init() async {
return _disposeAllPlayers();
}

@override
Future<void> dispose(int textureId) async {
_player(textureId).dispose();
_videoPlayers.remove(textureId);
Future<void> dispose(int playerId) async {
_player(playerId).dispose();
_videoPlayers.remove(playerId);
return;
}

Expand All @@ -50,8 +46,22 @@ class VideoPlayerPlugin extends VideoPlayerPlatform {
}

@override
Future<int> create(DataSource dataSource) async {
final int textureId = _textureCounter++;
Future<int> create(DataSource dataSource) {
return createWithOptions(
VideoCreationOptions(
dataSource: dataSource,
// Web only supports platform views.
viewType: VideoViewType.platformView,
),
);
}

@override
Future<int> createWithOptions(VideoCreationOptions options) async {
// Parameter options.viewType is ignored because web only supports platform views.

final DataSource dataSource = options.dataSource;
final int playerId = _playerCounter++;

late String uri;
switch (dataSource.sourceType) {
Expand All @@ -75,68 +85,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<void> setLooping(int textureId, bool looping) async {
return _player(textureId).setLooping(looping);
Future<void> setLooping(int playerId, bool looping) async {
return _player(playerId).setLooping(looping);
}

@override
Future<void> play(int textureId) async {
return _player(textureId).play();
Future<void> play(int playerId) async {
return _player(playerId).play();
}

@override
Future<void> pause(int textureId) async {
return _player(textureId).pause();
Future<void> pause(int playerId) async {
return _player(playerId).pause();
}

@override
Future<void> setVolume(int textureId, double volume) async {
return _player(textureId).setVolume(volume);
Future<void> setVolume(int playerId, double volume) async {
return _player(playerId).setVolume(volume);
}

@override
Future<void> setPlaybackSpeed(int textureId, double speed) async {
return _player(textureId).setPlaybackSpeed(speed);
Future<void> setPlaybackSpeed(int playerId, double speed) async {
return _player(playerId).setPlaybackSpeed(speed);
}

@override
Future<void> seekTo(int textureId, Duration position) async {
return _player(textureId).seekTo(position);
Future<void> seekTo(int playerId, Duration position) async {
return _player(playerId).seekTo(position);
}

@override
Future<Duration> getPosition(int textureId) async {
return _player(textureId).getPosition();
Future<Duration> getPosition(int playerId) async {
return _player(playerId).getPosition();
}

@override
Stream<VideoEvent> videoEventsFor(int textureId) {
return _player(textureId).events;
Stream<VideoEvent> videoEventsFor(int playerId) {
return _player(playerId).events;
}

@override
Future<void> setWebOptions(int textureId, VideoPlayerWebOptions options) {
return _player(textureId).setOptions(options);
Future<void> setWebOptions(int playerId, VideoPlayerWebOptions options) {
return _player(playerId).setOptions(options);
}

// Retrieves a [VideoPlayer] by its internal `id`.
Expand All @@ -146,11 +156,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<void> setMixWithOthers(bool mixWithOthers) => Future<void>.value();
}
4 changes: 2 additions & 2 deletions packages/video_player/video_player_web/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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:
Expand Down