-
Notifications
You must be signed in to change notification settings - Fork 3.3k
Refactor VideoPlayer
to be less exposed to EventChannel
& related
#6908
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
2627784
ee4f836
0334e53
4303968
e27eace
f1f7581
d97a4ad
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
// Copyright 2013 The Flutter Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
package io.flutter.plugins.videoplayer; | ||
|
||
import androidx.annotation.NonNull; | ||
import androidx.annotation.Nullable; | ||
|
||
/** | ||
* Callbacks representing events invoked by {@link VideoPlayer}. | ||
* | ||
* <p>In the actual plugin, this will always be {@link VideoPlayerEventCallbacks}, which creates the | ||
* expected events to send back through the plugin channel. In tests methods can be overridden in | ||
* order to assert results. | ||
* | ||
* <p>See {@link androidx.media3.common.Player.Listener} for details. | ||
*/ | ||
interface VideoPlayerCallbacks { | ||
void onInitialized(int width, int height, long durationInMs, int rotationCorrectionInDegrees); | ||
|
||
void onBufferingStart(); | ||
|
||
void onBufferingUpdate(long bufferedPosition); | ||
|
||
void onBufferingEnd(); | ||
|
||
void onCompleted(); | ||
|
||
void onError(@NonNull String code, @Nullable String message, @Nullable Object details); | ||
|
||
void onIsPlayingStateUpdate(boolean isPlaying); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
// Copyright 2013 The Flutter Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
package io.flutter.plugins.videoplayer; | ||
|
||
import androidx.annotation.NonNull; | ||
import androidx.annotation.Nullable; | ||
import androidx.annotation.VisibleForTesting; | ||
import io.flutter.plugin.common.EventChannel; | ||
import java.util.Collections; | ||
import java.util.HashMap; | ||
import java.util.Map; | ||
|
||
final class VideoPlayerEventCallbacks implements VideoPlayerCallbacks { | ||
private final EventChannel.EventSink eventSink; | ||
|
||
static VideoPlayerEventCallbacks bindTo(EventChannel eventChannel) { | ||
QueuingEventSink eventSink = new QueuingEventSink(); | ||
eventChannel.setStreamHandler( | ||
new EventChannel.StreamHandler() { | ||
@Override | ||
public void onListen(Object arguments, EventChannel.EventSink events) { | ||
eventSink.setDelegate(events); | ||
} | ||
|
||
@Override | ||
public void onCancel(Object arguments) { | ||
eventSink.setDelegate(null); | ||
} | ||
}); | ||
return VideoPlayerEventCallbacks.withSink(eventSink); | ||
} | ||
|
||
@VisibleForTesting | ||
static VideoPlayerEventCallbacks withSink(EventChannel.EventSink eventSink) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done! |
||
return new VideoPlayerEventCallbacks(eventSink); | ||
} | ||
|
||
private VideoPlayerEventCallbacks(EventChannel.EventSink eventSink) { | ||
this.eventSink = eventSink; | ||
} | ||
|
||
@Override | ||
public void onInitialized( | ||
int width, int height, long durationInMs, int rotationCorrectionInDegrees) { | ||
Map<String, Object> event = new HashMap<>(); | ||
event.put("event", "initialized"); | ||
event.put("width", width); | ||
event.put("height", height); | ||
event.put("duration", durationInMs); | ||
if (rotationCorrectionInDegrees != 0) { | ||
event.put("rotationCorrection", rotationCorrectionInDegrees); | ||
} | ||
eventSink.success(event); | ||
} | ||
|
||
@Override | ||
public void onBufferingStart() { | ||
Map<String, Object> event = new HashMap<>(); | ||
event.put("event", "bufferingStart"); | ||
eventSink.success(event); | ||
} | ||
|
||
@Override | ||
public void onBufferingUpdate(long bufferedPosition) { | ||
// iOS supports a list of buffered ranges, so we send as a list with a single range. | ||
Map<String, Object> event = new HashMap<>(); | ||
event.put("values", Collections.singletonList(bufferedPosition)); | ||
eventSink.success(event); | ||
} | ||
|
||
@Override | ||
public void onBufferingEnd() { | ||
Map<String, Object> event = new HashMap<>(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nit: All of these events are allocating new HashMap with the same value. They could be private constants to avoid generating garbage. None of them seem that chatty though. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm going to leave it as-is for now, hopefully we can use |
||
event.put("event", "bufferingEnd"); | ||
eventSink.success(event); | ||
} | ||
|
||
@Override | ||
public void onCompleted() { | ||
Map<String, Object> event = new HashMap<>(); | ||
event.put("event", "completed"); | ||
eventSink.success(event); | ||
} | ||
|
||
@Override | ||
public void onError(@NonNull String code, @Nullable String message, @Nullable Object details) { | ||
eventSink.error(code, message, details); | ||
} | ||
|
||
@Override | ||
public void onIsPlayingStateUpdate(boolean isPlaying) { | ||
Map<String, Object> event = new HashMap<>(); | ||
event.put("isPlaying", isPlaying); | ||
eventSink.success(event); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe link the
Player.Listener
docs to the callbacks that directly map to one of those events?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done!