mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Guard repeatMode masking against regular status updates
PiperOrigin-RevId: 276035838
This commit is contained in:
parent
62e3ac3e9e
commit
101746934f
1 changed files with 34 additions and 22 deletions
|
|
@ -99,12 +99,12 @@ public final class CastPlayer extends BasePlayer {
|
||||||
|
|
||||||
// Internal state.
|
// Internal state.
|
||||||
private final StateHolder<Boolean> playWhenReady;
|
private final StateHolder<Boolean> playWhenReady;
|
||||||
|
private final StateHolder<Integer> repeatMode;
|
||||||
@Nullable private RemoteMediaClient remoteMediaClient;
|
@Nullable private RemoteMediaClient remoteMediaClient;
|
||||||
private CastTimeline currentTimeline;
|
private CastTimeline currentTimeline;
|
||||||
private TrackGroupArray currentTrackGroups;
|
private TrackGroupArray currentTrackGroups;
|
||||||
private TrackSelectionArray currentTrackSelection;
|
private TrackSelectionArray currentTrackSelection;
|
||||||
@Player.State private int playbackState;
|
@Player.State private int playbackState;
|
||||||
private int repeatMode;
|
|
||||||
private int currentWindowIndex;
|
private int currentWindowIndex;
|
||||||
private long lastReportedPositionMs;
|
private long lastReportedPositionMs;
|
||||||
private int pendingSeekCount;
|
private int pendingSeekCount;
|
||||||
|
|
@ -131,8 +131,8 @@ public final class CastPlayer extends BasePlayer {
|
||||||
remoteMediaClient = session != null ? session.getRemoteMediaClient() : null;
|
remoteMediaClient = session != null ? session.getRemoteMediaClient() : null;
|
||||||
|
|
||||||
playWhenReady = new StateHolder<>(false);
|
playWhenReady = new StateHolder<>(false);
|
||||||
|
repeatMode = new StateHolder<>(REPEAT_MODE_OFF);
|
||||||
playbackState = STATE_IDLE;
|
playbackState = STATE_IDLE;
|
||||||
repeatMode = REPEAT_MODE_OFF;
|
|
||||||
currentTimeline = CastTimeline.EMPTY_CAST_TIMELINE;
|
currentTimeline = CastTimeline.EMPTY_CAST_TIMELINE;
|
||||||
currentTrackGroups = TrackGroupArray.EMPTY;
|
currentTrackGroups = TrackGroupArray.EMPTY;
|
||||||
currentTrackSelection = EMPTY_TRACK_SELECTION_ARRAY;
|
currentTrackSelection = EMPTY_TRACK_SELECTION_ARRAY;
|
||||||
|
|
@ -456,20 +456,24 @@ public final class CastPlayer extends BasePlayer {
|
||||||
// the local state will be updated to reflect the state reported by the Cast SDK.
|
// the local state will be updated to reflect the state reported by the Cast SDK.
|
||||||
setRepeatModeAndNotifyIfChanged(repeatMode);
|
setRepeatModeAndNotifyIfChanged(repeatMode);
|
||||||
flushNotifications();
|
flushNotifications();
|
||||||
remoteMediaClient
|
PendingResult<MediaChannelResult> pendingResult =
|
||||||
.queueSetRepeatMode(getCastRepeatMode(repeatMode), /* jsonObject= */ null)
|
remoteMediaClient.queueSetRepeatMode(getCastRepeatMode(repeatMode), /* jsonObject= */ null);
|
||||||
.setResultCallback(
|
this.repeatMode.pendingResultCallback =
|
||||||
mediaChannelResult -> {
|
new ResultCallback<MediaChannelResult>() {
|
||||||
|
@Override
|
||||||
|
public void onResult(MediaChannelResult mediaChannelResult) {
|
||||||
if (remoteMediaClient != null) {
|
if (remoteMediaClient != null) {
|
||||||
updateRepeatModeAndNotifyIfChanged();
|
updateRepeatModeAndNotifyIfChanged(this);
|
||||||
flushNotifications();
|
flushNotifications();
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
};
|
||||||
|
pendingResult.setResultCallback(this.repeatMode.pendingResultCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@RepeatMode public int getRepeatMode() {
|
@RepeatMode public int getRepeatMode() {
|
||||||
return repeatMode;
|
return repeatMode.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -582,7 +586,7 @@ public final class CastPlayer extends BasePlayer {
|
||||||
notificationsBatch.add(
|
notificationsBatch.add(
|
||||||
new ListenerNotificationTask(listener -> listener.onIsPlayingChanged(isPlaying)));
|
new ListenerNotificationTask(listener -> listener.onIsPlayingChanged(isPlaying)));
|
||||||
}
|
}
|
||||||
updateRepeatModeAndNotifyIfChanged();
|
updateRepeatModeAndNotifyIfChanged(/* resultCallback= */ null);
|
||||||
updateTimelineAndNotifyIfChanged();
|
updateTimelineAndNotifyIfChanged();
|
||||||
|
|
||||||
int currentWindowIndex = C.INDEX_UNSET;
|
int currentWindowIndex = C.INDEX_UNSET;
|
||||||
|
|
@ -617,7 +621,7 @@ public final class CastPlayer extends BasePlayer {
|
||||||
* the given {@code resultCallback}.
|
* the given {@code resultCallback}.
|
||||||
*/
|
*/
|
||||||
@RequiresNonNull("remoteMediaClient")
|
@RequiresNonNull("remoteMediaClient")
|
||||||
private void updatePlayerStateAndNotifyIfChanged(ResultCallback<?> resultCallback) {
|
private void updatePlayerStateAndNotifyIfChanged(@Nullable ResultCallback<?> resultCallback) {
|
||||||
boolean newPlayWhenReadyValue = playWhenReady.value;
|
boolean newPlayWhenReadyValue = playWhenReady.value;
|
||||||
if (playWhenReady.acceptsUpdate(resultCallback)) {
|
if (playWhenReady.acceptsUpdate(resultCallback)) {
|
||||||
newPlayWhenReadyValue = !remoteMediaClient.isPaused();
|
newPlayWhenReadyValue = !remoteMediaClient.isPaused();
|
||||||
|
|
@ -628,8 +632,11 @@ public final class CastPlayer extends BasePlayer {
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequiresNonNull("remoteMediaClient")
|
@RequiresNonNull("remoteMediaClient")
|
||||||
private void updateRepeatModeAndNotifyIfChanged() {
|
private void updateRepeatModeAndNotifyIfChanged(@Nullable ResultCallback<?> resultCallback) {
|
||||||
|
if (repeatMode.acceptsUpdate(resultCallback)) {
|
||||||
setRepeatModeAndNotifyIfChanged(fetchRepeatMode(remoteMediaClient));
|
setRepeatModeAndNotifyIfChanged(fetchRepeatMode(remoteMediaClient));
|
||||||
|
repeatMode.clearPendingResultCallback();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateTimelineAndNotifyIfChanged() {
|
private void updateTimelineAndNotifyIfChanged() {
|
||||||
|
|
@ -707,8 +714,8 @@ public final class CastPlayer extends BasePlayer {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setRepeatModeAndNotifyIfChanged(@Player.RepeatMode int repeatMode) {
|
private void setRepeatModeAndNotifyIfChanged(@Player.RepeatMode int repeatMode) {
|
||||||
if (this.repeatMode != repeatMode) {
|
if (this.repeatMode.value != repeatMode) {
|
||||||
this.repeatMode = repeatMode;
|
this.repeatMode.value = repeatMode;
|
||||||
notificationsBatch.add(
|
notificationsBatch.add(
|
||||||
new ListenerNotificationTask(listener -> listener.onRepeatModeChanged(repeatMode)));
|
new ListenerNotificationTask(listener -> listener.onRepeatModeChanged(repeatMode)));
|
||||||
}
|
}
|
||||||
|
|
@ -970,12 +977,17 @@ public final class CastPlayer extends BasePlayer {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether {@link #value} is being masked by the operation associated to the given
|
* Returns whether this state holder accepts updates coming from the given result callback.
|
||||||
* result callback.
|
|
||||||
*
|
*
|
||||||
* @param resultCallback A result callback.
|
* <p>A null {@code resultCallback} means that the update is a regular receiver state update, in
|
||||||
|
* which case the update will only be accepted if {@link #value} is not being masked. If {@link
|
||||||
|
* #value} is being masked, the update will only be accepted if {@code resultCallback} is the
|
||||||
|
* same as the {@link #pendingResultCallback}.
|
||||||
|
*
|
||||||
|
* @param resultCallback A result callback. May be null if the update comes from a regular
|
||||||
|
* receiver status update.
|
||||||
*/
|
*/
|
||||||
public boolean acceptsUpdate(ResultCallback<?> resultCallback) {
|
public boolean acceptsUpdate(@Nullable ResultCallback<?> resultCallback) {
|
||||||
return pendingResultCallback == resultCallback;
|
return pendingResultCallback == resultCallback;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue