Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit 68e9918

Browse files
committed
Add stream of VideoEvent
1 parent 2d54db2 commit 68e9918

File tree

3 files changed

+69
-1
lines changed

3 files changed

+69
-1
lines changed

packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,31 @@ class MethodChannelVideoPlayer extends VideoPlayerPlatform {
9393
),
9494
);
9595
}
96+
97+
@override
98+
Stream<VideoEvent> videoEventsFor(int textureId) {
99+
return _eventChannelFor(textureId)
100+
.receiveBroadcastStream()
101+
.map((dynamic event) {
102+
final Map<dynamic, dynamic> map = event;
103+
switch (map['event']) {
104+
case 'initialized':
105+
return VideoEvent.initialized;
106+
case 'completed':
107+
return VideoEvent.completed;
108+
case 'bufferingUpdate':
109+
return VideoEvent.bufferingUpdate;
110+
case 'bufferingStart':
111+
return VideoEvent.bufferingStart;
112+
case 'bufferingEnd':
113+
return VideoEvent.bufferingEnd;
114+
default:
115+
return VideoEvent.unknown;
116+
}
117+
});
118+
}
119+
120+
EventChannel _eventChannelFor(int textureId) {
121+
return EventChannel('flutter.io/videoPlayer/videoEvents$textureId');
122+
}
96123
}

packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,18 @@ abstract class VideoPlayerPlatform {
6969
///
7070
/// For assets the [asset] key is mandatory. Optionally you can specify
7171
/// the [package].
72-
/// TODO (cbenhagen): create a [DataSourceDescription] class
72+
/// TODO (cbenhagen): create a [DataSource] class
7373
Future<int> create(
7474
Map<String, dynamic> dataSourceDescription,
7575
) {
7676
throw UnimplementedError('create() has not been implemented.');
7777
}
7878

79+
/// Returns a Stream of [VideoEvent]s.
80+
Stream<VideoEvent> videoEventsFor(int textureId) {
81+
throw UnimplementedError('videoEventsFor() has not been implemented.');
82+
}
83+
7984
/// Sets the looping attribute of the video.
8085
Future<void> setLooping(int textureId, bool looping) {
8186
throw UnimplementedError('setLooping() has not been implemented.');
@@ -114,3 +119,12 @@ abstract class VideoPlayerPlatform {
114119
// implemented with `implements`.
115120
void _verifyProvidesDefaultImplementations() {}
116121
}
122+
123+
enum VideoEvent {
124+
initialized,
125+
completed,
126+
bufferingUpdate,
127+
bufferingStart,
128+
bufferingEnd,
129+
unknown,
130+
}

packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5+
import 'dart:async';
6+
57
import 'package:mockito/mockito.dart';
68
import 'package:flutter/services.dart';
79
import 'package:flutter_test/flutter_test.dart';
@@ -212,6 +214,31 @@ void main() {
212214
);
213215
expect(position, const Duration(milliseconds: 234));
214216
});
217+
218+
test('videoEventsFor', () async {
219+
defaultBinaryMessenger.setMockMessageHandler(
220+
"flutter.io/videoPlayer/videoEvents123",
221+
(ByteData message) async {
222+
final MethodCall methodCall =
223+
const StandardMethodCodec().decodeMethodCall(message);
224+
if (methodCall.method == 'listen') {
225+
defaultBinaryMessenger.handlePlatformMessage(
226+
"flutter.io/videoPlayer/videoEvents123",
227+
const StandardMethodCodec().encodeSuccessEnvelope(
228+
<String, dynamic>{'event': 'initialized'}),
229+
(ByteData data) {});
230+
231+
return const StandardMethodCodec().encodeSuccessEnvelope(null);
232+
} else if (methodCall.method == 'cancel') {
233+
return const StandardMethodCodec().encodeSuccessEnvelope(null);
234+
} else {
235+
fail('Expected listen or cancel');
236+
}
237+
},
238+
);
239+
final Stream<VideoEvent> videoEvents = player.videoEventsFor(123);
240+
expect(await videoEvents.first, VideoEvent.initialized);
241+
});
215242
});
216243
}
217244

0 commit comments

Comments
 (0)