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