From 52de36c5ebd52b61f01347ca258fe5336b04b815 Mon Sep 17 00:00:00 2001 From: tonihei Date: Wed, 27 Sep 2017 03:43:18 -0700 Subject: [PATCH] Add abstract, default Player event listener. This allows simplified listener implementations as most listeners will not listen to all possible notifications. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=170177821 --- .../exoplayer2/demo/PlayerActivity.java | 192 ++++++++---------- .../exoplayer2/ext/flac/FlacPlaybackTest.java | 59 +----- .../exoplayer2/ext/ima/ImaAdsLoader.java | 32 +-- .../ext/leanback/LeanbackPlayerAdapter.java | 30 +-- .../mediasession/MediaSessionConnector.java | 14 +- .../exoplayer2/ext/opus/OpusPlaybackTest.java | 59 +----- .../exoplayer2/ext/vp9/VpxPlaybackTest.java | 59 +----- .../com/google/android/exoplayer2/Player.java | 52 +++++ .../exoplayer2/ui/DebugTextViewHelper.java | 42 +--- .../exoplayer2/ui/PlaybackControlView.java | 28 +-- .../exoplayer2/ui/SimpleExoPlayerView.java | 42 +--- .../android/exoplayer2/testutil/Action.java | 60 +----- .../exoplayer2/testutil/ExoHostedTest.java | 41 +--- .../testutil/ExoPlayerTestRunner.java | 23 +-- 14 files changed, 176 insertions(+), 557 deletions(-) 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 0efb04782d..c0838390ed 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 @@ -37,11 +37,8 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DefaultRenderersFactory; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayerFactory; -import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.Player.EventListener; import com.google.android.exoplayer2.SimpleExoPlayer; -import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.drm.DefaultDrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; @@ -83,7 +80,7 @@ import java.util.UUID; /** * An activity that plays media using {@link SimpleExoPlayer}. */ -public class PlayerActivity extends Activity implements OnClickListener, EventListener, +public class PlayerActivity extends Activity implements OnClickListener, PlaybackControlView.VisibilityListener { public static final String DRM_SCHEME_UUID_EXTRA = "drm_scheme_uuid"; @@ -294,7 +291,7 @@ public class PlayerActivity extends Activity implements OnClickListener, EventLi drmSessionManager, extensionRendererMode); player = ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector); - player.addListener(this); + player.addListener(new PlayerEventListener()); player.addListener(eventLogger); player.addMetadataOutput(eventLogger); player.setAudioDebugListener(eventLogger); @@ -472,110 +469,6 @@ public class PlayerActivity extends Activity implements OnClickListener, EventLi } } - // Player.EventListener implementation - - @Override - public void onLoadingChanged(boolean isLoading) { - // Do nothing. - } - - @Override - public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { - if (playbackState == Player.STATE_ENDED) { - showControls(); - } - updateButtonVisibilities(); - } - - @Override - public void onRepeatModeChanged(int repeatMode) { - // Do nothing. - } - - @Override - public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { - // Do nothing. - } - - @Override - public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { - if (inErrorState) { - // This will only occur if the user has performed a seek whilst in the error state. Update the - // resume position so that if the user then retries, playback will resume from the position to - // which they seeked. - updateResumePosition(); - } - } - - @Override - public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { - // Do nothing. - } - - @Override - public void onTimelineChanged(Timeline timeline, Object manifest) { - // Do nothing. - } - - @Override - public void onPlayerError(ExoPlaybackException e) { - String errorString = null; - if (e.type == ExoPlaybackException.TYPE_RENDERER) { - Exception cause = e.getRendererException(); - if (cause instanceof DecoderInitializationException) { - // Special case for decoder initialization failures. - DecoderInitializationException decoderInitializationException = - (DecoderInitializationException) cause; - if (decoderInitializationException.decoderName == null) { - if (decoderInitializationException.getCause() instanceof DecoderQueryException) { - errorString = getString(R.string.error_querying_decoders); - } else if (decoderInitializationException.secureDecoderRequired) { - errorString = getString(R.string.error_no_secure_decoder, - decoderInitializationException.mimeType); - } else { - errorString = getString(R.string.error_no_decoder, - decoderInitializationException.mimeType); - } - } else { - errorString = getString(R.string.error_instantiating_decoder, - decoderInitializationException.decoderName); - } - } - } - if (errorString != null) { - showToast(errorString); - } - inErrorState = true; - if (isBehindLiveWindow(e)) { - clearResumePosition(); - initializePlayer(); - } else { - updateResumePosition(); - updateButtonVisibilities(); - showControls(); - } - } - - @Override - @SuppressWarnings("ReferenceEquality") - public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { - updateButtonVisibilities(); - if (trackGroups != lastSeenTrackGroupArray) { - MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo(); - if (mappedTrackInfo != null) { - if (mappedTrackInfo.getTrackTypeRendererSupport(C.TRACK_TYPE_VIDEO) - == MappedTrackInfo.RENDERER_SUPPORT_UNSUPPORTED_TRACKS) { - showToast(R.string.error_unsupported_video); - } - if (mappedTrackInfo.getTrackTypeRendererSupport(C.TRACK_TYPE_AUDIO) - == MappedTrackInfo.RENDERER_SUPPORT_UNSUPPORTED_TRACKS) { - showToast(R.string.error_unsupported_audio); - } - } - lastSeenTrackGroupArray = trackGroups; - } - } - // User controls private void updateButtonVisibilities() { @@ -645,4 +538,85 @@ public class PlayerActivity extends Activity implements OnClickListener, EventLi return false; } + private class PlayerEventListener extends Player.DefaultEventListener { + + @Override + public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { + if (playbackState == Player.STATE_ENDED) { + showControls(); + } + updateButtonVisibilities(); + } + + @Override + public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { + if (inErrorState) { + // This will only occur if the user has performed a seek whilst in the error state. Update + // the resume position so that if the user then retries, playback will resume from the + // position to which they seeked. + updateResumePosition(); + } + } + + @Override + public void onPlayerError(ExoPlaybackException e) { + String errorString = null; + if (e.type == ExoPlaybackException.TYPE_RENDERER) { + Exception cause = e.getRendererException(); + if (cause instanceof DecoderInitializationException) { + // Special case for decoder initialization failures. + DecoderInitializationException decoderInitializationException = + (DecoderInitializationException) cause; + if (decoderInitializationException.decoderName == null) { + if (decoderInitializationException.getCause() instanceof DecoderQueryException) { + errorString = getString(R.string.error_querying_decoders); + } else if (decoderInitializationException.secureDecoderRequired) { + errorString = getString(R.string.error_no_secure_decoder, + decoderInitializationException.mimeType); + } else { + errorString = getString(R.string.error_no_decoder, + decoderInitializationException.mimeType); + } + } else { + errorString = getString(R.string.error_instantiating_decoder, + decoderInitializationException.decoderName); + } + } + } + if (errorString != null) { + showToast(errorString); + } + inErrorState = true; + if (isBehindLiveWindow(e)) { + clearResumePosition(); + initializePlayer(); + } else { + updateResumePosition(); + updateButtonVisibilities(); + showControls(); + } + } + + @Override + @SuppressWarnings("ReferenceEquality") + public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { + updateButtonVisibilities(); + if (trackGroups != lastSeenTrackGroupArray) { + MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo(); + if (mappedTrackInfo != null) { + if (mappedTrackInfo.getTrackTypeRendererSupport(C.TRACK_TYPE_VIDEO) + == MappedTrackInfo.RENDERER_SUPPORT_UNSUPPORTED_TRACKS) { + showToast(R.string.error_unsupported_video); + } + if (mappedTrackInfo.getTrackTypeRendererSupport(C.TRACK_TYPE_AUDIO) + == MappedTrackInfo.RENDERER_SUPPORT_UNSUPPORTED_TRACKS) { + showToast(R.string.error_unsupported_audio); + } + } + lastSeenTrackGroupArray = trackGroups; + } + } + + } + } 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 8e1926ab3b..65fb4c8195 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 @@ -22,15 +22,11 @@ import android.test.InstrumentationTestCase; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerFactory; -import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Renderer; -import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.source.ExtractorMediaSource; -import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; /** @@ -45,20 +41,22 @@ public class FlacPlaybackTest extends InstrumentationTestCase { } private void playUri(String uri) throws ExoPlaybackException { - TestPlaybackThread thread = new TestPlaybackThread(Uri.parse(uri), + TestPlaybackRunnable testPlaybackRunnable = new TestPlaybackRunnable(Uri.parse(uri), getInstrumentation().getContext()); + Thread thread = new Thread(testPlaybackRunnable); thread.start(); try { thread.join(); } catch (InterruptedException e) { fail(); // Should never happen. } - if (thread.playbackException != null) { - throw thread.playbackException; + if (testPlaybackRunnable.playbackException != null) { + throw testPlaybackRunnable.playbackException; } } - private static class TestPlaybackThread extends Thread implements Player.EventListener { + private static class TestPlaybackRunnable extends Player.DefaultEventListener + implements Runnable { private final Context context; private final Uri uri; @@ -66,7 +64,7 @@ public class FlacPlaybackTest extends InstrumentationTestCase { private ExoPlayer player; private ExoPlaybackException playbackException; - public TestPlaybackThread(Uri uri, Context context) { + public TestPlaybackRunnable(Uri uri, Context context) { this.uri = uri; this.context = context; } @@ -89,31 +87,6 @@ public class FlacPlaybackTest extends InstrumentationTestCase { Looper.loop(); } - @Override - public void onLoadingChanged(boolean isLoading) { - // Do nothing. - } - - @Override - public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { - // Do nothing. - } - - @Override - public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { - // Do nothing. - } - - @Override - public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { - // Do nothing. - } - - @Override - public void onTimelineChanged(Timeline timeline, Object manifest) { - // Do nothing. - } - @Override public void onPlayerError(ExoPlaybackException error) { playbackException = error; @@ -123,25 +96,11 @@ public class FlacPlaybackTest extends InstrumentationTestCase { public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { if (playbackState == Player.STATE_ENDED || (playbackState == Player.STATE_IDLE && playbackException != null)) { - releasePlayerAndQuitLooper(); + player.release(); + Looper.myLooper().quit(); } } - @Override - public void onRepeatModeChanged(int repeatMode) { - // Do nothing. - } - - @Override - public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { - // Do nothing. - } - - private void releasePlayerAndQuitLooper() { - player.release(); - Looper.myLooper().quit(); - } - } } 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 7e5912ed28..a411da0133 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 @@ -43,13 +43,10 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; -import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Timeline; -import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.ads.AdPlaybackState; import com.google.android.exoplayer2.source.ads.AdsLoader; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.util.Assertions; import java.io.IOException; import java.util.ArrayList; @@ -59,8 +56,8 @@ import java.util.Map; /** * Loads ads using the IMA SDK. All methods are called on the main thread. */ -public final class ImaAdsLoader implements AdsLoader, Player.EventListener, VideoAdPlayer, - ContentProgressProvider, AdErrorListener, AdsLoadedListener, AdEventListener { +public final class ImaAdsLoader extends Player.DefaultEventListener implements AdsLoader, + VideoAdPlayer, ContentProgressProvider, AdErrorListener, AdsLoadedListener, AdEventListener { static { ExoPlayerLibraryInfo.registerModule("goog.exo.ima"); @@ -511,16 +508,6 @@ public final class ImaAdsLoader implements AdsLoader, Player.EventListener, Vide updateImaStateForPlayerState(); } - @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) { if (adsManager == null) { @@ -538,16 +525,6 @@ public final class ImaAdsLoader implements AdsLoader, Player.EventListener, Vide } } - @Override - public void onRepeatModeChanged(int repeatMode) { - // Do nothing. - } - - @Override - public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { - // Do nothing. - } - @Override public void onPlayerError(ExoPlaybackException error) { if (playingAd) { @@ -584,11 +561,6 @@ public final class ImaAdsLoader implements AdsLoader, Player.EventListener, Vide } } - @Override - public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { - // Do nothing. - } - // Internal methods. private void requestAds() { 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 93583f7d24..510ed9cf4f 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 @@ -30,13 +30,10 @@ import com.google.android.exoplayer2.ControlDispatcher; import com.google.android.exoplayer2.DefaultControlDispatcher; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; -import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.DiscontinuityReason; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; -import com.google.android.exoplayer2.source.TrackGroupArray; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.util.ErrorMessageProvider; /** @@ -221,7 +218,7 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter { } } - private final class ComponentListener implements Player.EventListener, + private final class ComponentListener extends Player.DefaultEventListener implements SimpleExoPlayer.VideoListener, SurfaceHolder.Callback { // SurfaceHolder.Callback implementation. @@ -260,11 +257,6 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter { } } - @Override - public void onLoadingChanged(boolean isLoading) { - // Do nothing. - } - @Override public void onTimelineChanged(Timeline timeline, Object manifest) { Callback callback = getCallback(); @@ -273,11 +265,6 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter { callback.onBufferedPositionChanged(LeanbackPlayerAdapter.this); } - @Override - public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { - // Do nothing. - } - @Override public void onPositionDiscontinuity(@DiscontinuityReason int reason) { Callback callback = getCallback(); @@ -285,21 +272,6 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter { callback.onBufferedPositionChanged(LeanbackPlayerAdapter.this); } - @Override - public void onPlaybackParametersChanged(PlaybackParameters params) { - // Do nothing. - } - - @Override - public void onRepeatModeChanged(int repeatMode) { - // Do nothing. - } - - @Override - public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { - // Do nothing. - } - // SimpleExoplayerView.Callback implementation. @Override 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 61e3772750..565b9c0084 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 @@ -36,8 +36,6 @@ import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Timeline; -import com.google.android.exoplayer2.source.TrackGroupArray; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.util.ErrorMessageProvider; import com.google.android.exoplayer2.util.RepeatModeUtil; import java.util.Collections; @@ -624,7 +622,7 @@ public final class MediaSessionConnector { & QueueEditor.ACTIONS & action) != 0; } - private class ExoPlayerEventListener implements Player.EventListener { + private class ExoPlayerEventListener extends Player.DefaultEventListener { private int currentWindowIndex; private int currentWindowCount; @@ -649,16 +647,6 @@ public final class MediaSessionConnector { updateMediaSessionMetadata(); } - @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) { updateMediaSessionPlaybackState(); 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 8f82a9fdc0..591f43f38a 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 @@ -22,15 +22,11 @@ import android.test.InstrumentationTestCase; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerFactory; -import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Renderer; -import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.source.ExtractorMediaSource; -import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; /** @@ -45,20 +41,22 @@ public class OpusPlaybackTest extends InstrumentationTestCase { } private void playUri(String uri) throws ExoPlaybackException { - TestPlaybackThread thread = new TestPlaybackThread(Uri.parse(uri), + TestPlaybackRunnable testPlaybackRunnable = new TestPlaybackRunnable(Uri.parse(uri), getInstrumentation().getContext()); + Thread thread = new Thread(testPlaybackRunnable); thread.start(); try { thread.join(); } catch (InterruptedException e) { fail(); // Should never happen. } - if (thread.playbackException != null) { - throw thread.playbackException; + if (testPlaybackRunnable.playbackException != null) { + throw testPlaybackRunnable.playbackException; } } - private static class TestPlaybackThread extends Thread implements Player.EventListener { + private static class TestPlaybackRunnable extends Player.DefaultEventListener + implements Runnable { private final Context context; private final Uri uri; @@ -66,7 +64,7 @@ public class OpusPlaybackTest extends InstrumentationTestCase { private ExoPlayer player; private ExoPlaybackException playbackException; - public TestPlaybackThread(Uri uri, Context context) { + public TestPlaybackRunnable(Uri uri, Context context) { this.uri = uri; this.context = context; } @@ -89,31 +87,6 @@ public class OpusPlaybackTest extends InstrumentationTestCase { Looper.loop(); } - @Override - public void onLoadingChanged(boolean isLoading) { - // Do nothing. - } - - @Override - public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { - // Do nothing. - } - - @Override - public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { - // Do nothing. - } - - @Override - public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { - // Do nothing. - } - - @Override - public void onTimelineChanged(Timeline timeline, Object manifest) { - // Do nothing. - } - @Override public void onPlayerError(ExoPlaybackException error) { playbackException = error; @@ -123,25 +96,11 @@ public class OpusPlaybackTest extends InstrumentationTestCase { public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { if (playbackState == Player.STATE_ENDED || (playbackState == Player.STATE_IDLE && playbackException != null)) { - releasePlayerAndQuitLooper(); + player.release(); + Looper.myLooper().quit(); } } - @Override - public void onRepeatModeChanged(int repeatMode) { - // Do nothing. - } - - @Override - public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { - // Do nothing. - } - - private void releasePlayerAndQuitLooper() { - player.release(); - Looper.myLooper().quit(); - } - } } 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 52b6670c09..c2c1867a90 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 @@ -23,15 +23,11 @@ import android.util.Log; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerFactory; -import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Renderer; -import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.source.ExtractorMediaSource; -import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; /** @@ -74,20 +70,22 @@ public class VpxPlaybackTest extends InstrumentationTestCase { } private void playUri(String uri) throws ExoPlaybackException { - TestPlaybackThread thread = new TestPlaybackThread(Uri.parse(uri), + TestPlaybackRunnable testPlaybackRunnable = new TestPlaybackRunnable(Uri.parse(uri), getInstrumentation().getContext()); + Thread thread = new Thread(testPlaybackRunnable); thread.start(); try { thread.join(); } catch (InterruptedException e) { fail(); // Should never happen. } - if (thread.playbackException != null) { - throw thread.playbackException; + if (testPlaybackRunnable.playbackException != null) { + throw testPlaybackRunnable.playbackException; } } - private static class TestPlaybackThread extends Thread implements Player.EventListener { + private static class TestPlaybackRunnable extends Player.DefaultEventListener + implements Runnable { private final Context context; private final Uri uri; @@ -95,7 +93,7 @@ public class VpxPlaybackTest extends InstrumentationTestCase { private ExoPlayer player; private ExoPlaybackException playbackException; - public TestPlaybackThread(Uri uri, Context context) { + public TestPlaybackRunnable(Uri uri, Context context) { this.uri = uri; this.context = context; } @@ -121,31 +119,6 @@ public class VpxPlaybackTest extends InstrumentationTestCase { Looper.loop(); } - @Override - public void onLoadingChanged(boolean isLoading) { - // Do nothing. - } - - @Override - public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { - // Do nothing. - } - - @Override - public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { - // Do nothing. - } - - @Override - public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { - // Do nothing. - } - - @Override - public void onTimelineChanged(Timeline timeline, Object manifest) { - // Do nothing. - } - @Override public void onPlayerError(ExoPlaybackException error) { playbackException = error; @@ -155,25 +128,11 @@ public class VpxPlaybackTest extends InstrumentationTestCase { public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { if (playbackState == Player.STATE_ENDED || (playbackState == Player.STATE_IDLE && playbackException != null)) { - releasePlayerAndQuitLooper(); + player.release(); + Looper.myLooper().quit(); } } - @Override - public void onRepeatModeChanged(int repeatMode) { - // Do nothing. - } - - @Override - public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { - // Do nothing. - } - - private void releasePlayerAndQuitLooper() { - player.release(); - Looper.myLooper().quit(); - } - } } 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 795b7249c8..3dd702b85f 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 @@ -136,6 +136,58 @@ public interface Player { } + /** + * {@link EventListener} allowing selective overrides. All methods are implemented as no-ops. + */ + abstract class DefaultEventListener implements EventListener { + + @Override + public void onTimelineChanged(Timeline timeline, Object manifest) { + // Do nothing. + } + + @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(int repeatMode) { + // Do nothing. + } + + @Override + public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { + // Do nothing. + } + + @Override + public void onPlayerError(ExoPlaybackException error) { + // Do nothing. + } + + @Override + public void onPositionDiscontinuity(int reason) { + // Do nothing. + } + + @Override + public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { + // Do nothing. + } + + } + /** * The player does not have any media to play. */ 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 cff860b671..f443c2a06f 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 @@ -17,22 +17,17 @@ package com.google.android.exoplayer2.ui; import android.annotation.SuppressLint; import android.widget.TextView; -import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; -import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.decoder.DecoderCounters; -import com.google.android.exoplayer2.source.TrackGroupArray; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import java.util.Locale; /** * A helper class for periodically updating a {@link TextView} with debug information obtained from * a {@link SimpleExoPlayer}. */ -public final class DebugTextViewHelper implements Runnable, Player.EventListener { +public final class DebugTextViewHelper extends Player.DefaultEventListener implements Runnable { private static final int REFRESH_INTERVAL_MS = 1000; @@ -78,51 +73,16 @@ public final class DebugTextViewHelper implements Runnable, Player.EventListener // Player.EventListener implementation. - @Override - public void onLoadingChanged(boolean isLoading) { - // Do nothing. - } - @Override public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { updateAndPost(); } - @Override - public void onRepeatModeChanged(int repeatMode) { - // Do nothing. - } - - @Override - public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { - // Do nothing. - } - @Override public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { updateAndPost(); } - @Override - public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { - // Do nothing. - } - - @Override - public void onTimelineChanged(Timeline timeline, Object manifest) { - // Do nothing. - } - - @Override - public void onPlayerError(ExoPlaybackException error) { - // Do nothing. - } - - @Override - public void onTracksChanged(TrackGroupArray tracks, TrackSelectionArray selections) { - // Do nothing. - } - // Runnable implementation. @Override diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlaybackControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlaybackControlView.java index 848aabc258..f47ac8695c 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlaybackControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlaybackControlView.java @@ -30,13 +30,9 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; -import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Timeline; -import com.google.android.exoplayer2.source.TrackGroupArray; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.RepeatModeUtil; import com.google.android.exoplayer2.util.Util; @@ -1046,8 +1042,8 @@ public class PlaybackControlView extends FrameLayout { return true; } - private final class ComponentListener implements Player.EventListener, TimeBar.OnScrubListener, - OnClickListener { + private final class ComponentListener extends Player.DefaultEventListener implements + TimeBar.OnScrubListener, OnClickListener { @Override public void onScrubStart(TimeBar timeBar, long position) { @@ -1095,11 +1091,6 @@ public class PlaybackControlView extends FrameLayout { updateProgress(); } - @Override - public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { - // Do nothing. - } - @Override public void onTimelineChanged(Timeline timeline, Object manifest) { updateNavigation(); @@ -1107,21 +1098,6 @@ public class PlaybackControlView extends FrameLayout { updateProgress(); } - @Override - public void onLoadingChanged(boolean isLoading) { - // Do nothing. - } - - @Override - public void onTracksChanged(TrackGroupArray tracks, TrackSelectionArray selections) { - // Do nothing. - } - - @Override - public void onPlayerError(ExoPlaybackException error) { - // Do nothing. - } - @Override public void onClick(View view) { if (player != null) { diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/SimpleExoPlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/SimpleExoPlayerView.java index b6f0677871..053bc26a6e 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/SimpleExoPlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/SimpleExoPlayerView.java @@ -36,11 +36,8 @@ import android.widget.ImageView; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; import com.google.android.exoplayer2.DefaultControlDispatcher; -import com.google.android.exoplayer2.ExoPlaybackException; -import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; -import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.id3.ApicFrame; import com.google.android.exoplayer2.source.TrackGroupArray; @@ -871,8 +868,8 @@ public final class SimpleExoPlayerView extends FrameLayout { aspectRatioFrame.setResizeMode(resizeMode); } - private final class ComponentListener implements TextOutput, SimpleExoPlayer.VideoListener, - Player.EventListener { + private final class ComponentListener extends Player.DefaultEventListener implements TextOutput, + SimpleExoPlayer.VideoListener { // TextOutput implementation @@ -908,46 +905,11 @@ public final class SimpleExoPlayerView extends FrameLayout { // Player.EventListener implementation - @Override - public void onLoadingChanged(boolean isLoading) { - // Do nothing. - } - @Override public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { maybeShowController(false); } - @Override - public void onRepeatModeChanged(int repeatMode) { - // Do nothing. - } - - @Override - public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { - // Do nothing. - } - - @Override - public void onPlayerError(ExoPlaybackException e) { - // Do nothing. - } - - @Override - public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { - // Do nothing. - } - - @Override - public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { - // Do nothing. - } - - @Override - public void onTimelineChanged(Timeline timeline, Object manifest) { - // Do nothing. - } - } } 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 b41d44d016..76e39525b4 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 @@ -18,17 +18,13 @@ package com.google.android.exoplayer2.testutil; import android.os.Handler; import android.util.Log; import android.view.Surface; -import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; -import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.source.MediaSource; -import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode; import com.google.android.exoplayer2.trackselection.MappingTrackSelector; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; /** * Base class for actions to perform during playback tests. @@ -326,7 +322,7 @@ public abstract class Action { protected void doActionAndScheduleNextImpl(final SimpleExoPlayer player, final MappingTrackSelector trackSelector, final Surface surface, final Handler handler, final ActionNode nextAction) { - PlayerListener listener = new PlayerListener() { + Player.EventListener listener = new Player.DefaultEventListener() { @Override public void onTimelineChanged(Timeline timeline, Object manifest) { if (timeline.equals(expectedTimeline)) { @@ -351,7 +347,7 @@ public abstract class Action { } /** - * Waits for {@link Player.EventListener#onPositionDiscontinuity()}. + * Waits for {@link Player.EventListener#onPositionDiscontinuity(int)}. */ public static final class WaitForPositionDiscontinuity extends Action { @@ -366,7 +362,7 @@ public abstract class Action { protected void doActionAndScheduleNextImpl(final SimpleExoPlayer player, final MappingTrackSelector trackSelector, final Surface surface, final Handler handler, final ActionNode nextAction) { - player.addListener(new PlayerListener() { + player.addListener(new Player.DefaultEventListener() { @Override public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { player.removeListener(this); @@ -406,54 +402,4 @@ public abstract class Action { } - /** Listener implementation used for overriding. Does nothing. */ - private static class PlayerListener implements Player.EventListener { - - @Override - public void onTimelineChanged(Timeline timeline, Object manifest) { - - } - - @Override - public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { - - } - - @Override - public void onLoadingChanged(boolean isLoading) { - - } - - @Override - public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { - - } - - @Override - public void onRepeatModeChanged(@ExoPlayer.RepeatMode int repeatMode) { - - } - - @Override - public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { - - } - - @Override - public void onPlayerError(ExoPlaybackException error) { - - } - - @Override - public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { - - } - - @Override - public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { - - } - - } - } 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 d3186e475d..142c5060b5 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 @@ -25,23 +25,19 @@ import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.SimpleExoPlayer; -import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AudioTrack; import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; import com.google.android.exoplayer2.source.MediaSource; -import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.testutil.HostActivity.HostedTest; import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.MappingTrackSelector; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; @@ -53,7 +49,7 @@ import junit.framework.Assert; /** * A {@link HostedTest} for {@link ExoPlayer} playback tests. */ -public abstract class ExoHostedTest implements HostedTest, Player.EventListener, +public abstract class ExoHostedTest extends Player.DefaultEventListener implements HostedTest, AudioRendererEventListener, VideoRendererEventListener { static { @@ -203,16 +199,6 @@ public abstract class ExoHostedTest implements HostedTest, Player.EventListener, // Player.EventListener - @Override - public void onLoadingChanged(boolean isLoading) { - // Do nothing. - } - - @Override - public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { - // Do nothing. - } - @Override public final void onPlayerStateChanged(boolean playWhenReady, int playbackState) { Log.d(tag, "state [" + playWhenReady + ", " + playbackState + "]"); @@ -230,16 +216,6 @@ public abstract class ExoHostedTest implements HostedTest, Player.EventListener, this.playing = playing; } - @Override - public void onRepeatModeChanged(int repeatMode) { - // Do nothing. - } - - @Override - public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { - // Do nothing. - } - @Override public final void onPlayerError(ExoPlaybackException error) { playerWasPrepared = true; @@ -247,21 +223,6 @@ public abstract class ExoHostedTest implements HostedTest, Player.EventListener, onPlayerErrorInternal(error); } - @Override - public final void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { - // Do nothing. - } - - @Override - public final void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { - // Do nothing. - } - - @Override - public final void onTimelineChanged(Timeline timeline, Object manifest) { - // Do nothing. - } - // AudioRendererEventListener @Override 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 b8c0846f8e..a87066415d 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 @@ -22,7 +22,6 @@ import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.LoadControl; -import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RenderersFactory; @@ -49,7 +48,7 @@ import junit.framework.Assert; /** * Helper class to run an ExoPlayer test. */ -public final class ExoPlayerTestRunner implements Player.EventListener { +public final class ExoPlayerTestRunner extends Player.DefaultEventListener { /** * Builder to set-up a {@link ExoPlayerTestRunner}. Default fake implementations will be used for @@ -341,11 +340,6 @@ public final class ExoPlayerTestRunner implements Player.EventListener { this.trackGroups = trackGroups; } - @Override - public void onLoadingChanged(boolean isLoading) { - // Do nothing. - } - @Override public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { if (periodIndices.isEmpty() && playbackState == Player.STATE_READY) { @@ -358,16 +352,6 @@ public final class ExoPlayerTestRunner implements Player.EventListener { } } - @Override - public void onRepeatModeChanged(@Player.RepeatMode int repeatMode) { - // Do nothing. - } - - @Override - public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { - // Do nothing. - } - @Override public void onPlayerError(ExoPlaybackException error) { handleException(exception); @@ -379,9 +363,4 @@ public final class ExoPlayerTestRunner implements Player.EventListener { periodIndices.add(player.getCurrentPeriodIndex()); } - @Override - public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { - // Do nothing. - } - }