Use serialized listener notification for all listener notifications.

This ensures that all callbacks use the same notification mechanism.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=222226913
This commit is contained in:
tonihei 2018-11-20 04:46:42 -08:00 committed by Oliver Woodman
parent 771db2c9fc
commit b7ab570094
2 changed files with 23 additions and 37 deletions

View File

@ -238,8 +238,8 @@ import java.util.concurrent.CopyOnWriteArraySet;
} }
if (this.playWhenReady != playWhenReady) { if (this.playWhenReady != playWhenReady) {
this.playWhenReady = playWhenReady; this.playWhenReady = playWhenReady;
notifyListeners( int playbackState = playbackInfo.playbackState;
new PlayWhenReadyUpdate(listeners, playWhenReady, playbackInfo.playbackState)); notifyListeners(listener -> listener.onPlayerStateChanged(playWhenReady, playbackState));
} }
} }
@ -253,9 +253,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
if (this.repeatMode != repeatMode) { if (this.repeatMode != repeatMode) {
this.repeatMode = repeatMode; this.repeatMode = repeatMode;
internalPlayer.setRepeatMode(repeatMode); internalPlayer.setRepeatMode(repeatMode);
for (Player.EventListener listener : listeners) { notifyListeners(listener -> listener.onRepeatModeChanged(repeatMode));
listener.onRepeatModeChanged(repeatMode);
}
} }
} }
@ -269,9 +267,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
if (this.shuffleModeEnabled != shuffleModeEnabled) { if (this.shuffleModeEnabled != shuffleModeEnabled) {
this.shuffleModeEnabled = shuffleModeEnabled; this.shuffleModeEnabled = shuffleModeEnabled;
internalPlayer.setShuffleModeEnabled(shuffleModeEnabled); internalPlayer.setShuffleModeEnabled(shuffleModeEnabled);
for (Player.EventListener listener : listeners) { notifyListeners(listener -> listener.onShuffleModeEnabledChanged(shuffleModeEnabled));
listener.onShuffleModeEnabledChanged(shuffleModeEnabled);
}
} }
} }
@ -320,9 +316,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
maskingPeriodIndex = timeline.getIndexOfPeriod(periodUidAndPosition.first); maskingPeriodIndex = timeline.getIndexOfPeriod(periodUidAndPosition.first);
} }
internalPlayer.seekTo(timeline, windowIndex, C.msToUs(positionMs)); internalPlayer.seekTo(timeline, windowIndex, C.msToUs(positionMs));
for (Player.EventListener listener : listeners) { notifyListeners(listener -> listener.onPositionDiscontinuity(DISCONTINUITY_REASON_SEEK));
listener.onPositionDiscontinuity(DISCONTINUITY_REASON_SEEK);
}
} }
@Override @Override
@ -594,17 +588,13 @@ import java.util.concurrent.CopyOnWriteArraySet;
PlaybackParameters playbackParameters = (PlaybackParameters) msg.obj; PlaybackParameters playbackParameters = (PlaybackParameters) msg.obj;
if (!this.playbackParameters.equals(playbackParameters)) { if (!this.playbackParameters.equals(playbackParameters)) {
this.playbackParameters = playbackParameters; this.playbackParameters = playbackParameters;
for (Player.EventListener listener : listeners) { notifyListeners(listener -> listener.onPlaybackParametersChanged(playbackParameters));
listener.onPlaybackParametersChanged(playbackParameters);
}
} }
break; break;
case ExoPlayerImplInternal.MSG_ERROR: case ExoPlayerImplInternal.MSG_ERROR:
ExoPlaybackException playbackError = (ExoPlaybackException) msg.obj; ExoPlaybackException playbackError = (ExoPlaybackException) msg.obj;
this.playbackError = playbackError; this.playbackError = playbackError;
for (Player.EventListener listener : listeners) { notifyListeners(listener -> listener.onPlayerError(playbackError));
listener.onPlayerError(playbackError);
}
break; break;
default: default:
throw new IllegalStateException(); throw new IllegalStateException();
@ -703,6 +693,15 @@ import java.util.concurrent.CopyOnWriteArraySet;
playWhenReady)); playWhenReady));
} }
private void notifyListeners(ListenerInvocation listenerInvocation) {
notifyListeners(
() -> {
for (Player.EventListener listener : listeners) {
listenerInvocation.invokeListener(listener);
}
});
}
private void notifyListeners(Runnable listenerNotificationRunnable) { private void notifyListeners(Runnable listenerNotificationRunnable) {
boolean isRunningRecursiveListenerNotification = !pendingListenerNotifications.isEmpty(); boolean isRunningRecursiveListenerNotification = !pendingListenerNotifications.isEmpty();
pendingListenerNotifications.addLast(listenerNotificationRunnable); pendingListenerNotifications.addLast(listenerNotificationRunnable);
@ -806,24 +805,8 @@ import java.util.concurrent.CopyOnWriteArraySet;
} }
} }
private static final class PlayWhenReadyUpdate implements Runnable { private interface ListenerInvocation {
private final Set<Player.EventListener> listeners; void invokeListener(Player.EventListener listener);
private final boolean playWhenReady;
private final int playbackState;
public PlayWhenReadyUpdate(
Set<Player.EventListener> listeners, boolean playWhenReady, int playbackState) {
this.listeners = listeners;
this.playWhenReady = playWhenReady;
this.playbackState = playbackState;
}
@Override
public void run() {
for (Player.EventListener listener : listeners) {
listener.onPlayerStateChanged(playWhenReady, playbackState);
}
}
} }
} }

View File

@ -498,12 +498,12 @@ public final class ExoPlayerTest {
.waitForPlaybackState(Player.STATE_READY) .waitForPlaybackState(Player.STATE_READY)
.seek(10) .seek(10)
// Start playback and wait until playback reaches second window. // Start playback and wait until playback reaches second window.
.play() .playUntilStartOfWindow(/* windowIndex= */ 1)
.waitForPositionDiscontinuity()
// Seek twice in concession, expecting the first seek to be replaced (and thus except // Seek twice in concession, expecting the first seek to be replaced (and thus except
// only on seek processed callback). // only on seek processed callback).
.seek(5) .seek(5)
.seek(60) .seek(60)
.play()
.build(); .build();
final List<Integer> playbackStatesWhenSeekProcessed = new ArrayList<>(); final List<Integer> playbackStatesWhenSeekProcessed = new ArrayList<>();
EventListener eventListener = EventListener eventListener =
@ -2058,8 +2058,11 @@ public final class ExoPlayerTest {
.pause() .pause()
.waitForPlaybackState(Player.STATE_READY) .waitForPlaybackState(Player.STATE_READY)
.seek(/* windowIndex= */ 0, /* positionMs= */ 9999) .seek(/* windowIndex= */ 0, /* positionMs= */ 9999)
.waitForSeekProcessed()
.seek(/* windowIndex= */ 0, /* positionMs= */ 1) .seek(/* windowIndex= */ 0, /* positionMs= */ 1)
.waitForSeekProcessed()
.seek(/* windowIndex= */ 0, /* positionMs= */ 9999) .seek(/* windowIndex= */ 0, /* positionMs= */ 9999)
.waitForSeekProcessed()
.play() .play()
.build(); .build();
ExoPlayerTestRunner testRunner = ExoPlayerTestRunner testRunner =