From 156e2317cca99e9e1f114e75cd90f501d5c8df2a Mon Sep 17 00:00:00 2001 From: tonihei Date: Fri, 22 Jun 2018 09:24:28 -0700 Subject: [PATCH] Deprecate Player.DefaultEventListener in favor of default no-ops in interface. The DefaultEventListener was added for selective overrides. Now that Java 8 support is enabled, these selective listener overrides can be implemented more easily and more flexible using default methods. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=201695490 --- RELEASENOTES.md | 2 + .../exoplayer2/castdemo/PlayerManager.java | 10 +- .../exoplayer2/demo/PlayerActivity.java | 2 +- .../exoplayer2/ext/flac/FlacPlaybackTest.java | 3 +- .../exoplayer2/ext/ima/ImaAdsLoader.java | 14 ++- .../ext/leanback/LeanbackPlayerAdapter.java | 4 +- .../mediasession/MediaSessionConnector.java | 2 +- .../exoplayer2/ext/opus/OpusPlaybackTest.java | 3 +- .../exoplayer2/ext/vp9/VpxPlaybackTest.java | 3 +- .../com/google/android/exoplayer2/Player.java | 107 +++++------------- .../android/exoplayer2/ExoPlayerTest.java | 11 +- .../exoplayer2/ui/DebugTextViewHelper.java | 2 +- .../exoplayer2/ui/PlayerControlView.java | 4 +- .../ui/PlayerNotificationManager.java | 2 +- .../android/exoplayer2/ui/PlayerView.java | 4 +- .../android/exoplayer2/testutil/Action.java | 51 +++++---- .../exoplayer2/testutil/ExoHostedTest.java | 11 +- .../testutil/ExoPlayerTestRunner.java | 7 +- 18 files changed, 99 insertions(+), 143 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index c308bc7547..f0f9e034a0 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -40,6 +40,8 @@ `ExoPlayerFactory` ([#4278](https://github.com/google/ExoPlayer/issues/4278)). * Fix a bug where download cancellation was ignored ([#4403](https://github.com/google/ExoPlayer/issues/4403)). +* Deprecate `Player.DefaultEventListener` as selective listener overrides can + be directly made with the `Player.EventListener` interface. ### 2.8.2 ### diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java index 63b18b0aa7..eeee101478 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java @@ -23,8 +23,8 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DefaultRenderersFactory; import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.Player.DefaultEventListener; import com.google.android.exoplayer2.Player.DiscontinuityReason; +import com.google.android.exoplayer2.Player.EventListener; import com.google.android.exoplayer2.Player.TimelineChangeReason; import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.SimpleExoPlayer; @@ -51,11 +51,9 @@ import com.google.android.gms.cast.MediaQueueItem; import com.google.android.gms.cast.framework.CastContext; import java.util.ArrayList; -/** - * Manages players and an internal media queue for the ExoPlayer/Cast demo app. - */ -/* package */ final class PlayerManager extends DefaultEventListener - implements CastPlayer.SessionAvailabilityListener { +/** Manages players and an internal media queue for the ExoPlayer/Cast demo app. */ +/* package */ final class PlayerManager + implements EventListener, CastPlayer.SessionAvailabilityListener { /** * Listener for changes in the media queue playback position. diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index f6b7852c3c..641bcca86b 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -655,7 +655,7 @@ public class PlayerActivity extends Activity return false; } - private class PlayerEventListener extends Player.DefaultEventListener { + private class PlayerEventListener implements Player.EventListener { @Override public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { diff --git a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java index b236b706b8..07b7a0ccdb 100644 --- a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java +++ b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java @@ -64,8 +64,7 @@ public class FlacPlaybackTest extends InstrumentationTestCase { } } - private static class TestPlaybackRunnable extends Player.DefaultEventListener - implements Runnable { + private static class TestPlaybackRunnable implements Player.EventListener, Runnable { private final Context context; private final Uri uri; diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java index b02869fbe4..fe6d50a068 100644 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java @@ -66,11 +66,15 @@ import java.util.Collections; import java.util.List; import java.util.Map; -/** - * Loads ads using the IMA SDK. All methods are called on the main thread. - */ -public final class ImaAdsLoader extends Player.DefaultEventListener implements AdsLoader, - VideoAdPlayer, ContentProgressProvider, AdErrorListener, AdsLoadedListener, AdEventListener { +/** Loads ads using the IMA SDK. All methods are called on the main thread. */ +public final class ImaAdsLoader + implements Player.EventListener, + AdsLoader, + VideoAdPlayer, + ContentProgressProvider, + AdErrorListener, + AdsLoadedListener, + AdEventListener { static { ExoPlayerLibraryInfo.registerModule("goog.exo.ima"); diff --git a/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java b/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java index 9937bb7ca0..73bea20849 100644 --- a/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java +++ b/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java @@ -248,8 +248,8 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter implements Runnab surfaceHolderGlueHost.setSurfaceHolderCallback(null); } - private final class ComponentListener extends Player.DefaultEventListener - implements SurfaceHolder.Callback, VideoListener { + private final class ComponentListener + implements Player.EventListener, SurfaceHolder.Callback, VideoListener { // SurfaceHolder.Callback implementation. diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java index da94799147..dd74da6766 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java @@ -716,7 +716,7 @@ public final class MediaSessionConnector { } } - private class ExoPlayerEventListener extends Player.DefaultEventListener { + private class ExoPlayerEventListener implements Player.EventListener { private int currentWindowIndex; private int currentWindowCount; diff --git a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java index c547cff434..8e3a213af1 100644 --- a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java +++ b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java @@ -64,8 +64,7 @@ public class OpusPlaybackTest extends InstrumentationTestCase { } } - private static class TestPlaybackRunnable extends Player.DefaultEventListener - implements Runnable { + private static class TestPlaybackRunnable implements Player.EventListener, Runnable { private final Context context; private final Uri uri; diff --git a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java index 09701f9542..bab7cb6fd7 100644 --- a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java +++ b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java @@ -95,8 +95,7 @@ public class VpxPlaybackTest extends InstrumentationTestCase { } } - private static class TestPlaybackRunnable extends Player.DefaultEventListener - implements Runnable { + private static class TestPlaybackRunnable implements Player.EventListener, Runnable { private final Context context; private final Uri uri; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Player.java b/library/core/src/main/java/com/google/android/exoplayer2/Player.java index aa053ae147..e311b904ca 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Player.java @@ -215,23 +215,25 @@ public interface Player { } /** - * Listener of changes in player state. + * Listener of changes in player state. All methods have no-op default implementations to allow + * selective overrides. */ interface EventListener { /** * Called when the timeline and/or manifest has been refreshed. - *

- * Note that if the timeline has changed then a position discontinuity may also have occurred. - * For example, the current period index may have changed as a result of periods being added or - * removed from the timeline. This will not be reported via a separate call to + * + *

Note that if the timeline has changed then a position discontinuity may also have + * occurred. For example, the current period index may have changed as a result of periods being + * added or removed from the timeline. This will not be reported via a separate call to * {@link #onPositionDiscontinuity(int)}. * * @param timeline The latest timeline. Never null, but may be empty. * @param manifest The latest manifest. May be null. * @param reason The {@link TimelineChangeReason} responsible for this timeline change. */ - void onTimelineChanged(Timeline timeline, Object manifest, @TimelineChangeReason int reason); + default void onTimelineChanged( + Timeline timeline, Object manifest, @TimelineChangeReason int reason) {} /** * Called when the available or selected tracks change. @@ -240,46 +242,47 @@ public interface Player { * @param trackSelections The track selections for each renderer. Never null and always of * length {@link #getRendererCount()}, but may contain null elements. */ - void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections); + default void onTracksChanged( + TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {} /** * Called when the player starts or stops loading the source. * * @param isLoading Whether the source is currently being loaded. */ - void onLoadingChanged(boolean isLoading); + default void onLoadingChanged(boolean isLoading) {} /** - * Called when the value returned from either {@link #getPlayWhenReady()} or - * {@link #getPlaybackState()} changes. + * Called when the value returned from either {@link #getPlayWhenReady()} or {@link + * #getPlaybackState()} changes. * * @param playWhenReady Whether playback will proceed when ready. * @param playbackState One of the {@code STATE} constants. */ - void onPlayerStateChanged(boolean playWhenReady, int playbackState); + default void onPlayerStateChanged(boolean playWhenReady, int playbackState) {} /** * Called when the value of {@link #getRepeatMode()} changes. * * @param repeatMode The {@link RepeatMode} used for playback. */ - void onRepeatModeChanged(@RepeatMode int repeatMode); + default void onRepeatModeChanged(@RepeatMode int repeatMode) {} /** * Called when the value of {@link #getShuffleModeEnabled()} changes. * * @param shuffleModeEnabled Whether shuffling of windows is enabled. */ - void onShuffleModeEnabledChanged(boolean shuffleModeEnabled); + default void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {} /** * Called when an error occurs. The playback state will transition to {@link #STATE_IDLE} - * immediately after this method is called. The player instance can still be used, and - * {@link #release()} must still be called on the player should it no longer be required. + * immediately after this method is called. The player instance can still be used, and {@link + * #release()} must still be called on the player should it no longer be required. * * @param error The error. */ - void onPlayerError(ExoPlaybackException error); + default void onPlayerError(ExoPlaybackException error) {} /** * Called when a position discontinuity occurs without a change to the timeline. A position @@ -287,14 +290,14 @@ public interface Player { * transitioning from one period in the timeline to the next), or when the playback position * jumps within the period currently being played (as a result of a seek being performed, or * when the source introduces a discontinuity internally). - *

- * When a position discontinuity occurs as a result of a change to the timeline this method is - * not called. {@link #onTimelineChanged(Timeline, Object, int)} is called in this + * + *

When a position discontinuity occurs as a result of a change to the timeline this method + * is not called. {@link #onTimelineChanged(Timeline, Object, int)} is called in this * case. * * @param reason The {@link DiscontinuityReason} responsible for the discontinuity. */ - void onPositionDiscontinuity(@DiscontinuityReason int reason); + default void onPositionDiscontinuity(@DiscontinuityReason int reason) {} /** * Called when the current playback parameters change. The playback parameters may change due to @@ -304,20 +307,21 @@ public interface Player { * * @param playbackParameters The playback parameters. */ - void onPlaybackParametersChanged(PlaybackParameters playbackParameters); + default void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {} /** * Called when all pending seek requests have been processed by the player. This is guaranteed - * to happen after any necessary changes to the player state were reported to - * {@link #onPlayerStateChanged(boolean, int)}. + * to happen after any necessary changes to the player state were reported to {@link + * #onPlayerStateChanged(boolean, int)}. */ - void onSeekProcessed(); - + default void onSeekProcessed() {} } /** - * {@link EventListener} allowing selective overrides. All methods are implemented as no-ops. + * @deprecated Use {@link EventListener} interface directly for selective overrides as all methods + * are implemented as no-op default methods. */ + @Deprecated abstract class DefaultEventListener implements EventListener { @Override @@ -327,60 +331,11 @@ public interface Player { onTimelineChanged(timeline, manifest); } - @Override - public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { - // Do nothing. - } - - @Override - public void onLoadingChanged(boolean isLoading) { - // Do nothing. - } - - @Override - public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { - // Do nothing. - } - - @Override - public void onRepeatModeChanged(@RepeatMode int repeatMode) { - // Do nothing. - } - - @Override - public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { - // Do nothing. - } - - @Override - public void onPlayerError(ExoPlaybackException error) { - // Do nothing. - } - - @Override - public void onPositionDiscontinuity(@DiscontinuityReason int reason) { - // Do nothing. - } - - @Override - public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { - // Do nothing. - } - - @Override - public void onSeekProcessed() { - // Do nothing. - } - - /** - * @deprecated Use {@link DefaultEventListener#onTimelineChanged(Timeline, Object, int)} - * instead. - */ + /** @deprecated Use {@link EventListener#onTimelineChanged(Timeline, Object, int)} instead. */ @Deprecated public void onTimelineChanged(Timeline timeline, Object manifest) { // Do nothing. } - } /** diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index 1afaf92059..4264b3dd59 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -19,7 +19,6 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; import android.view.Surface; -import com.google.android.exoplayer2.Player.DefaultEventListener; import com.google.android.exoplayer2.Player.EventListener; import com.google.android.exoplayer2.Timeline.Window; import com.google.android.exoplayer2.source.ConcatenatingMediaSource; @@ -483,7 +482,7 @@ public final class ExoPlayerTest { .build(); final List playbackStatesWhenSeekProcessed = new ArrayList<>(); EventListener eventListener = - new DefaultEventListener() { + new EventListener() { private int currentPlaybackState = Player.STATE_IDLE; @Override @@ -535,7 +534,7 @@ public final class ExoPlayerTest { .build(); final boolean[] onSeekProcessedCalled = new boolean[1]; EventListener listener = - new DefaultEventListener() { + new EventListener() { @Override public void onSeekProcessed() { onSeekProcessedCalled[0] = true; @@ -1988,7 +1987,7 @@ public final class ExoPlayerTest { final List eventListener1States = new ArrayList<>(); final List eventListener2States = new ArrayList<>(); final EventListener eventListener1 = - new DefaultEventListener() { + new EventListener() { @Override public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { eventListener1States.add(playbackState); @@ -1998,7 +1997,7 @@ public final class ExoPlayerTest { } }; final EventListener eventListener2 = - new DefaultEventListener() { + new EventListener() { @Override public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { eventListener2States.add(playbackState); @@ -2038,7 +2037,7 @@ public final class ExoPlayerTest { final List eventListenerPlayWhenReady = new ArrayList<>(); final List eventListenerStates = new ArrayList<>(); final EventListener eventListener = - new DefaultEventListener() { + new EventListener() { @Override public void onTimelineChanged(Timeline timeline, Object manifest, int reason) { if (timeline.isEmpty()) { diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DebugTextViewHelper.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DebugTextViewHelper.java index 6066445e9d..f4ff239587 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DebugTextViewHelper.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DebugTextViewHelper.java @@ -27,7 +27,7 @@ import java.util.Locale; * A helper class for periodically updating a {@link TextView} with debug information obtained from * a {@link SimpleExoPlayer}. */ -public class DebugTextViewHelper extends Player.DefaultEventListener implements Runnable { +public class DebugTextViewHelper implements Player.EventListener, Runnable { private static final int REFRESH_INTERVAL_MS = 1000; diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java index e081a1d8ef..aac976088e 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java @@ -1030,8 +1030,8 @@ public class PlayerControlView extends FrameLayout { return true; } - private final class ComponentListener extends Player.DefaultEventListener - implements TimeBar.OnScrubListener, OnClickListener { + private final class ComponentListener + implements Player.EventListener, TimeBar.OnScrubListener, OnClickListener { @Override public void onScrubStart(TimeBar timeBar, long position) { diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java index c9c65956c0..76c74c665f 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java @@ -937,7 +937,7 @@ public class PlayerNotificationManager { return actions; } - private class PlayerListener extends Player.DefaultEventListener { + private class PlayerListener implements Player.EventListener { @Override public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java index 55e9900497..e8d5e48927 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java @@ -1179,8 +1179,8 @@ public class PlayerView extends FrameLayout { || keyCode == KeyEvent.KEYCODE_DPAD_CENTER; } - private final class ComponentListener extends Player.DefaultEventListener - implements TextOutput, VideoListener, OnLayoutChangeListener { + private final class ComponentListener + implements Player.EventListener, TextOutput, VideoListener, OnLayoutChangeListener { // TextOutput implementation diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java index a6c3438a52..5b3ede1c42 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java @@ -572,7 +572,7 @@ public abstract class Action { return; } Player.EventListener listener = - new Player.DefaultEventListener() { + new Player.EventListener() { @Override public void onTimelineChanged( Timeline timeline, Object manifest, @Player.TimelineChangeReason int reason) { @@ -618,13 +618,14 @@ public abstract class Action { if (nextAction == null) { return; } - player.addListener(new Player.DefaultEventListener() { - @Override - public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { - player.removeListener(this); - nextAction.schedule(player, trackSelector, surface, handler); - } - }); + player.addListener( + new Player.EventListener() { + @Override + public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { + player.removeListener(this); + nextAction.schedule(player, trackSelector, surface, handler); + } + }); } @Override @@ -663,15 +664,16 @@ public abstract class Action { if (targetPlaybackState == player.getPlaybackState()) { nextAction.schedule(player, trackSelector, surface, handler); } else { - player.addListener(new Player.DefaultEventListener() { - @Override - public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { - if (targetPlaybackState == playbackState) { - player.removeListener(this); - nextAction.schedule(player, trackSelector, surface, handler); - } - } - }); + player.addListener( + new Player.EventListener() { + @Override + public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { + if (targetPlaybackState == playbackState) { + player.removeListener(this); + nextAction.schedule(player, trackSelector, surface, handler); + } + } + }); } } @@ -704,13 +706,14 @@ public abstract class Action { if (nextAction == null) { return; } - player.addListener(new Player.DefaultEventListener() { - @Override - public void onSeekProcessed() { - player.removeListener(this); - nextAction.schedule(player, trackSelector, surface, handler); - } - }); + player.addListener( + new Player.EventListener() { + @Override + public void onSeekProcessed() { + player.removeListener(this); + nextAction.schedule(player, trackSelector, surface, handler); + } + }); } @Override diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java index 5c8e87d38f..2076885fba 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java @@ -49,11 +49,12 @@ import com.google.android.exoplayer2.util.HandlerWrapper; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoRendererEventListener; -/** - * A {@link HostedTest} for {@link ExoPlayer} playback tests. - */ -public abstract class ExoHostedTest extends Player.DefaultEventListener implements HostedTest, - AudioRendererEventListener, VideoRendererEventListener { +/** A {@link HostedTest} for {@link ExoPlayer} playback tests. */ +public abstract class ExoHostedTest + implements Player.EventListener, + HostedTest, + AudioRendererEventListener, + VideoRendererEventListener { static { // DefaultAudioSink is able to work around spurious timestamps reported by the platform (by diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java index b47ab16db6..1d6b38067d 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java @@ -51,11 +51,8 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -/** - * Helper class to run an ExoPlayer test. - */ -public final class ExoPlayerTestRunner extends Player.DefaultEventListener - implements ActionSchedule.Callback { +/** Helper class to run an ExoPlayer test. */ +public final class ExoPlayerTestRunner implements Player.EventListener, ActionSchedule.Callback { /** * Builder to set-up a {@link ExoPlayerTestRunner}. Default fake implementations will be used for