Commit 10174693 by aquilescanta Committed by Oliver Woodman

Guard repeatMode masking against regular status updates

PiperOrigin-RevId: 276035838
parent 62e3ac3e
...@@ -99,12 +99,12 @@ public final class CastPlayer extends BasePlayer { ...@@ -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 { ...@@ -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 { ...@@ -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>() {
if (remoteMediaClient != null) { @Override
updateRepeatModeAndNotifyIfChanged(); public void onResult(MediaChannelResult mediaChannelResult) {
flushNotifications(); if (remoteMediaClient != null) {
} updateRepeatModeAndNotifyIfChanged(this);
}); 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 { ...@@ -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 { ...@@ -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 { ...@@ -628,8 +632,11 @@ public final class CastPlayer extends BasePlayer {
} }
@RequiresNonNull("remoteMediaClient") @RequiresNonNull("remoteMediaClient")
private void updateRepeatModeAndNotifyIfChanged() { private void updateRepeatModeAndNotifyIfChanged(@Nullable ResultCallback<?> resultCallback) {
setRepeatModeAndNotifyIfChanged(fetchRepeatMode(remoteMediaClient)); if (repeatMode.acceptsUpdate(resultCallback)) {
setRepeatModeAndNotifyIfChanged(fetchRepeatMode(remoteMediaClient));
repeatMode.clearPendingResultCallback();
}
} }
private void updateTimelineAndNotifyIfChanged() { private void updateTimelineAndNotifyIfChanged() {
...@@ -707,8 +714,8 @@ public final class CastPlayer extends BasePlayer { ...@@ -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 { ...@@ -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. *
* <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. * @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;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment