From 2a6472f93011dcd725d7adde8f5e288aa3557ba4 Mon Sep 17 00:00:00 2001 From: tonihei Date: Wed, 12 Apr 2023 10:54:04 +0100 Subject: [PATCH] Mark MediaController methods final to prevent accidental overrides It's currently not possible to even subclass MediaController because the constructor is package-private. To avoid any accidental usage or future indirect subclassing, all methods can be marked as final. PiperOrigin-RevId: 523648114 --- api.txt | 230 +++++++-------- .../media3/session/MediaController.java | 278 +++++++++--------- 2 files changed, 257 insertions(+), 251 deletions(-) diff --git a/api.txt b/api.txt index 869ecce560..55917dd7f6 100644 --- a/api.txt +++ b/api.txt @@ -1484,122 +1484,122 @@ package androidx.media3.session { field public static final String EXTRAS_KEY_SLOT_RESERVATION_SEEK_TO_PREV = "android.media.playback.ALWAYS_RESERVE_SPACE_FOR.ACTION_SKIP_TO_PREVIOUS"; } - public class MediaController implements androidx.media3.common.Player { - method public void addListener(androidx.media3.common.Player.Listener); - method public void addMediaItem(androidx.media3.common.MediaItem); - method public void addMediaItem(int, androidx.media3.common.MediaItem); - method public void addMediaItems(java.util.List); - method public void addMediaItems(int, java.util.List); - method public boolean canAdvertiseSession(); - method public void clearMediaItems(); - method public void clearVideoSurface(); - method public void clearVideoSurface(@Nullable android.view.Surface); - method public void clearVideoSurfaceHolder(@Nullable android.view.SurfaceHolder); - method public void clearVideoSurfaceView(@Nullable android.view.SurfaceView); - method public void clearVideoTextureView(@Nullable android.view.TextureView); - method public void decreaseDeviceVolume(); - method public android.os.Looper getApplicationLooper(); - method public androidx.media3.common.AudioAttributes getAudioAttributes(); - method public androidx.media3.common.Player.Commands getAvailableCommands(); - method public androidx.media3.session.SessionCommands getAvailableSessionCommands(); - method @IntRange(from=0, to=100) public int getBufferedPercentage(); - method public long getBufferedPosition(); - method @Nullable public androidx.media3.session.SessionToken getConnectedToken(); - method public long getContentBufferedPosition(); - method public long getContentDuration(); - method public long getContentPosition(); - method public int getCurrentAdGroupIndex(); - method public int getCurrentAdIndexInAdGroup(); - method public androidx.media3.common.text.CueGroup getCurrentCues(); - method public long getCurrentLiveOffset(); - method @Nullable public androidx.media3.common.MediaItem getCurrentMediaItem(); - method public int getCurrentMediaItemIndex(); - method public int getCurrentPeriodIndex(); - method public long getCurrentPosition(); - method public androidx.media3.common.Timeline getCurrentTimeline(); - method public androidx.media3.common.Tracks getCurrentTracks(); - method public androidx.media3.common.DeviceInfo getDeviceInfo(); - method @IntRange(from=0) public int getDeviceVolume(); - method public long getDuration(); - method public long getMaxSeekToPreviousPosition(); - method public androidx.media3.common.MediaItem getMediaItemAt(int); - method public int getMediaItemCount(); - method public androidx.media3.common.MediaMetadata getMediaMetadata(); - method public int getNextMediaItemIndex(); - method public boolean getPlayWhenReady(); - method public androidx.media3.common.PlaybackParameters getPlaybackParameters(); - method @androidx.media3.common.Player.State public int getPlaybackState(); - method @androidx.media3.common.Player.PlaybackSuppressionReason public int getPlaybackSuppressionReason(); - method @Nullable public androidx.media3.common.PlaybackException getPlayerError(); - method public androidx.media3.common.MediaMetadata getPlaylistMetadata(); - method public int getPreviousMediaItemIndex(); - method @androidx.media3.common.Player.RepeatMode public int getRepeatMode(); - method public long getSeekBackIncrement(); - method public long getSeekForwardIncrement(); - method @Nullable public android.app.PendingIntent getSessionActivity(); - method public boolean getShuffleModeEnabled(); - method public long getTotalBufferedDuration(); - method public androidx.media3.common.TrackSelectionParameters getTrackSelectionParameters(); - method public androidx.media3.common.VideoSize getVideoSize(); - method @FloatRange(from=0, to=1) public float getVolume(); - method public boolean hasNextMediaItem(); - method public boolean hasPreviousMediaItem(); - method public void increaseDeviceVolume(); - method public boolean isCommandAvailable(@androidx.media3.common.Player.Command int); - method public boolean isConnected(); - method public boolean isCurrentMediaItemDynamic(); - method public boolean isCurrentMediaItemLive(); - method public boolean isCurrentMediaItemSeekable(); - method public boolean isDeviceMuted(); - method public boolean isLoading(); - method public boolean isPlaying(); - method public boolean isPlayingAd(); - method public boolean isSessionCommandAvailable(@androidx.media3.session.SessionCommand.CommandCode int); - method public boolean isSessionCommandAvailable(androidx.media3.session.SessionCommand); - method public void moveMediaItem(int, int); - method public void moveMediaItems(int, int, int); - method public void pause(); - method public void play(); - method public void prepare(); - method public void release(); + @com.google.errorprone.annotations.DoNotMock public class MediaController implements androidx.media3.common.Player { + method public final void addListener(androidx.media3.common.Player.Listener); + method public final void addMediaItem(androidx.media3.common.MediaItem); + method public final void addMediaItem(int, androidx.media3.common.MediaItem); + method public final void addMediaItems(java.util.List); + method public final void addMediaItems(int, java.util.List); + method public final boolean canAdvertiseSession(); + method public final void clearMediaItems(); + method public final void clearVideoSurface(); + method public final void clearVideoSurface(@Nullable android.view.Surface); + method public final void clearVideoSurfaceHolder(@Nullable android.view.SurfaceHolder); + method public final void clearVideoSurfaceView(@Nullable android.view.SurfaceView); + method public final void clearVideoTextureView(@Nullable android.view.TextureView); + method public final void decreaseDeviceVolume(); + method public final android.os.Looper getApplicationLooper(); + method public final androidx.media3.common.AudioAttributes getAudioAttributes(); + method public final androidx.media3.common.Player.Commands getAvailableCommands(); + method public final androidx.media3.session.SessionCommands getAvailableSessionCommands(); + method @IntRange(from=0, to=100) public final int getBufferedPercentage(); + method public final long getBufferedPosition(); + method @Nullable public final androidx.media3.session.SessionToken getConnectedToken(); + method public final long getContentBufferedPosition(); + method public final long getContentDuration(); + method public final long getContentPosition(); + method public final int getCurrentAdGroupIndex(); + method public final int getCurrentAdIndexInAdGroup(); + method public final androidx.media3.common.text.CueGroup getCurrentCues(); + method public final long getCurrentLiveOffset(); + method @Nullable public final androidx.media3.common.MediaItem getCurrentMediaItem(); + method public final int getCurrentMediaItemIndex(); + method public final int getCurrentPeriodIndex(); + method public final long getCurrentPosition(); + method public final androidx.media3.common.Timeline getCurrentTimeline(); + method public final androidx.media3.common.Tracks getCurrentTracks(); + method public final androidx.media3.common.DeviceInfo getDeviceInfo(); + method @IntRange(from=0) public final int getDeviceVolume(); + method public final long getDuration(); + method public final long getMaxSeekToPreviousPosition(); + method public final androidx.media3.common.MediaItem getMediaItemAt(int); + method public final int getMediaItemCount(); + method public final androidx.media3.common.MediaMetadata getMediaMetadata(); + method public final int getNextMediaItemIndex(); + method public final boolean getPlayWhenReady(); + method public final androidx.media3.common.PlaybackParameters getPlaybackParameters(); + method @androidx.media3.common.Player.State public final int getPlaybackState(); + method @androidx.media3.common.Player.PlaybackSuppressionReason public final int getPlaybackSuppressionReason(); + method @Nullable public final androidx.media3.common.PlaybackException getPlayerError(); + method public final androidx.media3.common.MediaMetadata getPlaylistMetadata(); + method public final int getPreviousMediaItemIndex(); + method @androidx.media3.common.Player.RepeatMode public final int getRepeatMode(); + method public final long getSeekBackIncrement(); + method public final long getSeekForwardIncrement(); + method @Nullable public final android.app.PendingIntent getSessionActivity(); + method public final boolean getShuffleModeEnabled(); + method public final long getTotalBufferedDuration(); + method public final androidx.media3.common.TrackSelectionParameters getTrackSelectionParameters(); + method public final androidx.media3.common.VideoSize getVideoSize(); + method @FloatRange(from=0, to=1) public final float getVolume(); + method public final boolean hasNextMediaItem(); + method public final boolean hasPreviousMediaItem(); + method public final void increaseDeviceVolume(); + method public final boolean isCommandAvailable(@androidx.media3.common.Player.Command int); + method public final boolean isConnected(); + method public final boolean isCurrentMediaItemDynamic(); + method public final boolean isCurrentMediaItemLive(); + method public final boolean isCurrentMediaItemSeekable(); + method public final boolean isDeviceMuted(); + method public final boolean isLoading(); + method public final boolean isPlaying(); + method public final boolean isPlayingAd(); + method public final boolean isSessionCommandAvailable(@androidx.media3.session.SessionCommand.CommandCode int); + method public final boolean isSessionCommandAvailable(androidx.media3.session.SessionCommand); + method public final void moveMediaItem(int, int); + method public final void moveMediaItems(int, int, int); + method public final void pause(); + method public final void play(); + method public final void prepare(); + method public final void release(); method public static void releaseFuture(java.util.concurrent.Future); - method public void removeListener(androidx.media3.common.Player.Listener); - method public void removeMediaItem(int); - method public void removeMediaItems(int, int); - method public void seekBack(); - method public void seekForward(); - method public void seekTo(long); - method public void seekTo(int, long); - method public void seekToDefaultPosition(); - method public void seekToDefaultPosition(int); - method public void seekToNext(); - method public void seekToNextMediaItem(); - method public void seekToPrevious(); - method public void seekToPreviousMediaItem(); - method public com.google.common.util.concurrent.ListenableFuture sendCustomCommand(androidx.media3.session.SessionCommand, android.os.Bundle); - method public void setDeviceMuted(boolean); - method public void setDeviceVolume(@IntRange(from=0) int); - method public void setMediaItem(androidx.media3.common.MediaItem); - method public void setMediaItem(androidx.media3.common.MediaItem, long); - method public void setMediaItem(androidx.media3.common.MediaItem, boolean); - method public void setMediaItems(java.util.List); - method public void setMediaItems(java.util.List, boolean); - method public void setMediaItems(java.util.List, int, long); - method public void setPlayWhenReady(boolean); - method public void setPlaybackParameters(androidx.media3.common.PlaybackParameters); - method public void setPlaybackSpeed(float); - method public void setPlaylistMetadata(androidx.media3.common.MediaMetadata); - method public com.google.common.util.concurrent.ListenableFuture setRating(String, androidx.media3.common.Rating); - method public com.google.common.util.concurrent.ListenableFuture setRating(androidx.media3.common.Rating); - method public void setRepeatMode(@androidx.media3.common.Player.RepeatMode int); - method public void setShuffleModeEnabled(boolean); - method public void setTrackSelectionParameters(androidx.media3.common.TrackSelectionParameters); - method public void setVideoSurface(@Nullable android.view.Surface); - method public void setVideoSurfaceHolder(@Nullable android.view.SurfaceHolder); - method public void setVideoSurfaceView(@Nullable android.view.SurfaceView); - method public void setVideoTextureView(@Nullable android.view.TextureView); - method public void setVolume(@FloatRange(from=0, to=1) float); - method public void stop(); + method public final void removeListener(androidx.media3.common.Player.Listener); + method public final void removeMediaItem(int); + method public final void removeMediaItems(int, int); + method public final void seekBack(); + method public final void seekForward(); + method public final void seekTo(long); + method public final void seekTo(int, long); + method public final void seekToDefaultPosition(); + method public final void seekToDefaultPosition(int); + method public final void seekToNext(); + method public final void seekToNextMediaItem(); + method public final void seekToPrevious(); + method public final void seekToPreviousMediaItem(); + method public final com.google.common.util.concurrent.ListenableFuture sendCustomCommand(androidx.media3.session.SessionCommand, android.os.Bundle); + method public final void setDeviceMuted(boolean); + method public final void setDeviceVolume(@IntRange(from=0) int); + method public final void setMediaItem(androidx.media3.common.MediaItem); + method public final void setMediaItem(androidx.media3.common.MediaItem, long); + method public final void setMediaItem(androidx.media3.common.MediaItem, boolean); + method public final void setMediaItems(java.util.List); + method public final void setMediaItems(java.util.List, boolean); + method public final void setMediaItems(java.util.List, int, long); + method public final void setPlayWhenReady(boolean); + method public final void setPlaybackParameters(androidx.media3.common.PlaybackParameters); + method public final void setPlaybackSpeed(float); + method public final void setPlaylistMetadata(androidx.media3.common.MediaMetadata); + method public final com.google.common.util.concurrent.ListenableFuture setRating(String, androidx.media3.common.Rating); + method public final com.google.common.util.concurrent.ListenableFuture setRating(androidx.media3.common.Rating); + method public final void setRepeatMode(@androidx.media3.common.Player.RepeatMode int); + method public final void setShuffleModeEnabled(boolean); + method public final void setTrackSelectionParameters(androidx.media3.common.TrackSelectionParameters); + method public final void setVideoSurface(@Nullable android.view.Surface); + method public final void setVideoSurfaceHolder(@Nullable android.view.SurfaceHolder); + method public final void setVideoSurfaceView(@Nullable android.view.SurfaceView); + method public final void setVideoTextureView(@Nullable android.view.TextureView); + method public final void setVolume(@FloatRange(from=0, to=1) float); + method public final void stop(); } public static final class MediaController.Builder { diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaController.java b/libraries/session/src/main/java/androidx/media3/session/MediaController.java index c3c41dd522..dbbb9d04a2 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaController.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaController.java @@ -61,6 +61,7 @@ import androidx.media3.common.util.Util; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.errorprone.annotations.CanIgnoreReturnValue; +import com.google.errorprone.annotations.DoNotMock; import java.util.List; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; @@ -163,6 +164,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; * androidx.media3.common.Player.Command#COMMAND_CHANGE_MEDIA_ITEMS supported} by the legacy * session. */ +@DoNotMock public class MediaController implements Player { /** @@ -420,6 +422,7 @@ public class MediaController implements Player { /* package */ final ConnectionCallback connectionCallback; /** Creates a {@link MediaController} from the {@link SessionToken}. */ + // This constructor has to be package-private in order to prevent subclassing outside the package. /* package */ MediaController( Context context, SessionToken token, @@ -461,7 +464,7 @@ public class MediaController implements Player { } @Override - public void stop() { + public final void stop() { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring stop()."); @@ -478,7 +481,7 @@ public class MediaController implements Player { *

This method does not call {@link Player#release()} of the underlying player in the session. */ @Override - public void release() { + public final void release() { verifyApplicationThread(); if (released) { return; @@ -526,17 +529,17 @@ public class MediaController implements Player { * for the {@link MediaSession} in the service. */ @Nullable - public SessionToken getConnectedToken() { + public final SessionToken getConnectedToken() { return isConnected() ? impl.getConnectedToken() : null; } /** Returns whether this controller is connected to a {@link MediaSession} or not. */ - public boolean isConnected() { + public final boolean isConnected() { return impl.isConnected(); } @Override - public void play() { + public final void play() { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring play()."); @@ -546,7 +549,7 @@ public class MediaController implements Player { } @Override - public void pause() { + public final void pause() { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring pause()."); @@ -556,7 +559,7 @@ public class MediaController implements Player { } @Override - public void prepare() { + public final void prepare() { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring prepare()."); @@ -566,7 +569,7 @@ public class MediaController implements Player { } @Override - public void seekToDefaultPosition() { + public final void seekToDefaultPosition() { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring seekTo()."); @@ -576,7 +579,7 @@ public class MediaController implements Player { } @Override - public void seekToDefaultPosition(int mediaItemIndex) { + public final void seekToDefaultPosition(int mediaItemIndex) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring seekTo()."); @@ -586,7 +589,7 @@ public class MediaController implements Player { } @Override - public void seekTo(long positionMs) { + public final void seekTo(long positionMs) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring seekTo()."); @@ -596,7 +599,7 @@ public class MediaController implements Player { } @Override - public void seekTo(int mediaItemIndex, long positionMs) { + public final void seekTo(int mediaItemIndex, long positionMs) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring seekTo()."); @@ -611,7 +614,7 @@ public class MediaController implements Player { *

Interoperability: When connected to {@link MediaSessionCompat}, it returns {code 0}. */ @Override - public long getSeekBackIncrement() { + public final long getSeekBackIncrement() { verifyApplicationThread(); return isConnected() ? impl.getSeekBackIncrement() : 0; } @@ -623,7 +626,7 @@ public class MediaController implements Player { * MediaControllerCompat.TransportControls#rewind()}. */ @Override - public void seekBack() { + public final void seekBack() { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring seekBack()."); @@ -638,7 +641,7 @@ public class MediaController implements Player { *

Interoperability: When connected to {@link MediaSessionCompat}, it returns {code 0}. */ @Override - public long getSeekForwardIncrement() { + public final long getSeekForwardIncrement() { verifyApplicationThread(); return isConnected() ? impl.getSeekForwardIncrement() : 0; } @@ -650,7 +653,7 @@ public class MediaController implements Player { * MediaControllerCompat.TransportControls#fastForward()}. */ @Override - public void seekForward() { + public final void seekForward() { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring seekForward()."); @@ -661,19 +664,19 @@ public class MediaController implements Player { /** Returns an intent for launching UI associated with the session if exists, or {@code null}. */ @Nullable - public PendingIntent getSessionActivity() { + public final PendingIntent getSessionActivity() { return isConnected() ? impl.getSessionActivity() : null; } @Override @Nullable - public PlaybackException getPlayerError() { + public final PlaybackException getPlayerError() { verifyApplicationThread(); return isConnected() ? impl.getPlayerError() : null; } @Override - public void setPlayWhenReady(boolean playWhenReady) { + public final void setPlayWhenReady(boolean playWhenReady) { verifyApplicationThread(); if (isConnected()) { impl.setPlayWhenReady(playWhenReady); @@ -681,13 +684,13 @@ public class MediaController implements Player { } @Override - public boolean getPlayWhenReady() { + public final boolean getPlayWhenReady() { verifyApplicationThread(); return isConnected() && impl.getPlayWhenReady(); } @Override - public @PlaybackSuppressionReason int getPlaybackSuppressionReason() { + public final @PlaybackSuppressionReason int getPlaybackSuppressionReason() { verifyApplicationThread(); return isConnected() ? impl.getPlaybackSuppressionReason() @@ -695,56 +698,56 @@ public class MediaController implements Player { } @Override - public @State int getPlaybackState() { + public final @State int getPlaybackState() { verifyApplicationThread(); return isConnected() ? impl.getPlaybackState() : Player.STATE_IDLE; } @Override - public boolean isPlaying() { + public final boolean isPlaying() { verifyApplicationThread(); return isConnected() && impl.isPlaying(); } @Override - public boolean isLoading() { + public final boolean isLoading() { verifyApplicationThread(); return isConnected() && impl.isLoading(); } @Override - public long getDuration() { + public final long getDuration() { verifyApplicationThread(); return isConnected() ? impl.getDuration() : C.TIME_UNSET; } @Override - public long getCurrentPosition() { + public final long getCurrentPosition() { verifyApplicationThread(); return isConnected() ? impl.getCurrentPosition() : 0; } @Override - public long getBufferedPosition() { + public final long getBufferedPosition() { verifyApplicationThread(); return isConnected() ? impl.getBufferedPosition() : 0; } @Override @IntRange(from = 0, to = 100) - public int getBufferedPercentage() { + public final int getBufferedPercentage() { verifyApplicationThread(); return isConnected() ? impl.getBufferedPercentage() : 0; } @Override - public long getTotalBufferedDuration() { + public final long getTotalBufferedDuration() { verifyApplicationThread(); return isConnected() ? impl.getTotalBufferedDuration() : 0; } @Override - public long getCurrentLiveOffset() { + public final long getCurrentLiveOffset() { verifyApplicationThread(); return isConnected() ? impl.getCurrentLiveOffset() : C.TIME_UNSET; } @@ -758,7 +761,7 @@ public class MediaController implements Player { * #getContentBufferedPosition()}. */ @Override - public long getContentDuration() { + public final long getContentDuration() { verifyApplicationThread(); return isConnected() ? impl.getContentDuration() : C.TIME_UNSET; } @@ -771,7 +774,7 @@ public class MediaController implements Player { * #getCurrentPosition()} because content position isn't available. */ @Override - public long getContentPosition() { + public final long getContentPosition() { verifyApplicationThread(); return isConnected() ? impl.getContentPosition() : 0; } @@ -784,31 +787,31 @@ public class MediaController implements Player { * #getBufferedPosition()} because content buffered position isn't available. */ @Override - public long getContentBufferedPosition() { + public final long getContentBufferedPosition() { verifyApplicationThread(); return isConnected() ? impl.getContentBufferedPosition() : 0; } @Override - public boolean isPlayingAd() { + public final boolean isPlayingAd() { verifyApplicationThread(); return isConnected() && impl.isPlayingAd(); } @Override - public int getCurrentAdGroupIndex() { + public final int getCurrentAdGroupIndex() { verifyApplicationThread(); return isConnected() ? impl.getCurrentAdGroupIndex() : C.INDEX_UNSET; } @Override - public int getCurrentAdIndexInAdGroup() { + public final int getCurrentAdIndexInAdGroup() { verifyApplicationThread(); return isConnected() ? impl.getCurrentAdIndexInAdGroup() : C.INDEX_UNSET; } @Override - public void setPlaybackParameters(PlaybackParameters playbackParameters) { + public final void setPlaybackParameters(PlaybackParameters playbackParameters) { verifyApplicationThread(); checkNotNull(playbackParameters, "playbackParameters must not be null"); if (!isConnected()) { @@ -819,7 +822,7 @@ public class MediaController implements Player { } @Override - public void setPlaybackSpeed(float speed) { + public final void setPlaybackSpeed(float speed) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring setPlaybackSpeed()."); @@ -829,13 +832,13 @@ public class MediaController implements Player { } @Override - public PlaybackParameters getPlaybackParameters() { + public final PlaybackParameters getPlaybackParameters() { verifyApplicationThread(); return isConnected() ? impl.getPlaybackParameters() : PlaybackParameters.DEFAULT; } @Override - public AudioAttributes getAudioAttributes() { + public final AudioAttributes getAudioAttributes() { verifyApplicationThread(); if (!isConnected()) { return AudioAttributes.DEFAULT; @@ -856,7 +859,7 @@ public class MediaController implements Player { * @return A {@link ListenableFuture} of {@link SessionResult} representing the pending * completion. */ - public ListenableFuture setRating(String mediaId, Rating rating) { + public final ListenableFuture setRating(String mediaId, Rating rating) { verifyApplicationThread(); checkNotNull(mediaId, "mediaId must not be null"); checkNotEmpty(mediaId, "mediaId must not be empty"); @@ -879,7 +882,7 @@ public class MediaController implements Player { * @return A {@link ListenableFuture} of {@link SessionResult} representing the pending * completion. */ - public ListenableFuture setRating(Rating rating) { + public final ListenableFuture setRating(Rating rating) { verifyApplicationThread(); checkNotNull(rating, "rating must not be null"); if (isConnected()) { @@ -904,7 +907,8 @@ public class MediaController implements Player { * @return A {@link ListenableFuture} of {@link SessionResult} representing the pending * completion. */ - public ListenableFuture sendCustomCommand(SessionCommand command, Bundle args) { + public final ListenableFuture sendCustomCommand( + SessionCommand command, Bundle args) { verifyApplicationThread(); checkNotNull(command, "command must not be null"); checkArgument( @@ -920,7 +924,7 @@ public class MediaController implements Player { @UnstableApi @Override @Nullable - public Object getCurrentManifest() { + public final Object getCurrentManifest() { return null; } @@ -934,13 +938,13 @@ public class MediaController implements Player { * Timeline#CREATOR}. */ @Override - public Timeline getCurrentTimeline() { + public final Timeline getCurrentTimeline() { verifyApplicationThread(); return isConnected() ? impl.getCurrentTimeline() : Timeline.EMPTY; } @Override - public void setMediaItem(MediaItem mediaItem) { + public final void setMediaItem(MediaItem mediaItem) { verifyApplicationThread(); checkNotNull(mediaItem, "mediaItems must not be null"); if (!isConnected()) { @@ -951,7 +955,7 @@ public class MediaController implements Player { } @Override - public void setMediaItem(MediaItem mediaItem, long startPositionMs) { + public final void setMediaItem(MediaItem mediaItem, long startPositionMs) { verifyApplicationThread(); checkNotNull(mediaItem, "mediaItems must not be null"); if (!isConnected()) { @@ -962,7 +966,7 @@ public class MediaController implements Player { } @Override - public void setMediaItem(MediaItem mediaItem, boolean resetPosition) { + public final void setMediaItem(MediaItem mediaItem, boolean resetPosition) { verifyApplicationThread(); checkNotNull(mediaItem, "mediaItems must not be null"); if (!isConnected()) { @@ -973,7 +977,7 @@ public class MediaController implements Player { } @Override - public void setMediaItems(List mediaItems) { + public final void setMediaItems(List mediaItems) { verifyApplicationThread(); checkNotNull(mediaItems, "mediaItems must not be null"); for (int i = 0; i < mediaItems.size(); i++) { @@ -987,7 +991,7 @@ public class MediaController implements Player { } @Override - public void setMediaItems(List mediaItems, boolean resetPosition) { + public final void setMediaItems(List mediaItems, boolean resetPosition) { verifyApplicationThread(); checkNotNull(mediaItems, "mediaItems must not be null"); for (int i = 0; i < mediaItems.size(); i++) { @@ -1001,7 +1005,8 @@ public class MediaController implements Player { } @Override - public void setMediaItems(List mediaItems, int startIndex, long startPositionMs) { + public final void setMediaItems( + List mediaItems, int startIndex, long startPositionMs) { verifyApplicationThread(); checkNotNull(mediaItems, "mediaItems must not be null"); for (int i = 0; i < mediaItems.size(); i++) { @@ -1015,7 +1020,7 @@ public class MediaController implements Player { } @Override - public void setPlaylistMetadata(MediaMetadata playlistMetadata) { + public final void setPlaylistMetadata(MediaMetadata playlistMetadata) { verifyApplicationThread(); checkNotNull(playlistMetadata, "playlistMetadata must not be null"); if (!isConnected()) { @@ -1026,13 +1031,13 @@ public class MediaController implements Player { } @Override - public MediaMetadata getPlaylistMetadata() { + public final MediaMetadata getPlaylistMetadata() { verifyApplicationThread(); return isConnected() ? impl.getPlaylistMetadata() : MediaMetadata.EMPTY; } @Override - public void addMediaItem(MediaItem mediaItem) { + public final void addMediaItem(MediaItem mediaItem) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring addMediaItem()."); @@ -1042,7 +1047,7 @@ public class MediaController implements Player { } @Override - public void addMediaItem(int index, MediaItem mediaItem) { + public final void addMediaItem(int index, MediaItem mediaItem) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring addMediaItem()."); @@ -1058,7 +1063,7 @@ public class MediaController implements Player { * android.support.v4.media.session.MediaSessionCompat}, this doesn't atomically add items. */ @Override - public void addMediaItems(List mediaItems) { + public final void addMediaItems(List mediaItems) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring addMediaItems()."); @@ -1074,7 +1079,7 @@ public class MediaController implements Player { * android.support.v4.media.session.MediaSessionCompat}, this doesn't atomically add items. */ @Override - public void addMediaItems(int index, List mediaItems) { + public final void addMediaItems(int index, List mediaItems) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring addMediaItems()."); @@ -1084,7 +1089,7 @@ public class MediaController implements Player { } @Override - public void removeMediaItem(int index) { + public final void removeMediaItem(int index) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring removeMediaItem()."); @@ -1100,7 +1105,7 @@ public class MediaController implements Player { * android.support.v4.media.session.MediaSessionCompat}, this doesn't atomically remove items. */ @Override - public void removeMediaItems(int fromIndex, int toIndex) { + public final void removeMediaItems(int fromIndex, int toIndex) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring removeMediaItems()."); @@ -1116,7 +1121,7 @@ public class MediaController implements Player { * android.support.v4.media.session.MediaSessionCompat}, this doesn't atomically clear items. */ @Override - public void clearMediaItems() { + public final void clearMediaItems() { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring clearMediaItems()."); @@ -1132,7 +1137,7 @@ public class MediaController implements Player { * android.support.v4.media.session.MediaSessionCompat}, this doesn't atomically move items. */ @Override - public void moveMediaItem(int currentIndex, int newIndex) { + public final void moveMediaItem(int currentIndex, int newIndex) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring moveMediaItem()."); @@ -1148,7 +1153,7 @@ public class MediaController implements Player { * android.support.v4.media.session.MediaSessionCompat}, this doesn't atomically move items. */ @Override - public void moveMediaItems(int fromIndex, int toIndex, int newIndex) { + public final void moveMediaItems(int fromIndex, int toIndex, int newIndex) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring moveMediaItems()."); @@ -1163,12 +1168,12 @@ public class MediaController implements Player { @UnstableApi @Deprecated @Override - public boolean isCurrentWindowDynamic() { + public final boolean isCurrentWindowDynamic() { return isCurrentMediaItemDynamic(); } @Override - public boolean isCurrentMediaItemDynamic() { + public final boolean isCurrentMediaItemDynamic() { verifyApplicationThread(); Timeline timeline = getCurrentTimeline(); return !timeline.isEmpty() && timeline.getWindow(getCurrentMediaItemIndex(), window).isDynamic; @@ -1180,12 +1185,12 @@ public class MediaController implements Player { @UnstableApi @Deprecated @Override - public boolean isCurrentWindowLive() { + public final boolean isCurrentWindowLive() { return isCurrentMediaItemLive(); } @Override - public boolean isCurrentMediaItemLive() { + public final boolean isCurrentMediaItemLive() { verifyApplicationThread(); Timeline timeline = getCurrentTimeline(); return !timeline.isEmpty() && timeline.getWindow(getCurrentMediaItemIndex(), window).isLive(); @@ -1197,12 +1202,12 @@ public class MediaController implements Player { @UnstableApi @Deprecated @Override - public boolean isCurrentWindowSeekable() { + public final boolean isCurrentWindowSeekable() { return isCurrentMediaItemSeekable(); } @Override - public boolean isCurrentMediaItemSeekable() { + public final boolean isCurrentMediaItemSeekable() { verifyApplicationThread(); Timeline timeline = getCurrentTimeline(); return !timeline.isEmpty() && timeline.getWindow(getCurrentMediaItemIndex(), window).isSeekable; @@ -1214,13 +1219,13 @@ public class MediaController implements Player { *

The MediaController returns {@code false}. */ @Override - public boolean canAdvertiseSession() { + public final boolean canAdvertiseSession() { return false; } @Override @Nullable - public MediaItem getCurrentMediaItem() { + public final MediaItem getCurrentMediaItem() { Timeline timeline = getCurrentTimeline(); return timeline.isEmpty() ? null @@ -1228,17 +1233,17 @@ public class MediaController implements Player { } @Override - public int getMediaItemCount() { + public final int getMediaItemCount() { return getCurrentTimeline().getWindowCount(); } @Override - public MediaItem getMediaItemAt(int index) { + public final MediaItem getMediaItemAt(int index) { return getCurrentTimeline().getWindow(index, window).mediaItem; } @Override - public int getCurrentPeriodIndex() { + public final int getCurrentPeriodIndex() { verifyApplicationThread(); return isConnected() ? impl.getCurrentPeriodIndex() : C.INDEX_UNSET; } @@ -1249,12 +1254,12 @@ public class MediaController implements Player { @UnstableApi @Deprecated @Override - public int getCurrentWindowIndex() { + public final int getCurrentWindowIndex() { return getCurrentMediaItemIndex(); } @Override - public int getCurrentMediaItemIndex() { + public final int getCurrentMediaItemIndex() { verifyApplicationThread(); return isConnected() ? impl.getCurrentMediaItemIndex() : C.INDEX_UNSET; } @@ -1265,7 +1270,7 @@ public class MediaController implements Player { @UnstableApi @Deprecated @Override - public int getPreviousWindowIndex() { + public final int getPreviousWindowIndex() { return getPreviousMediaItemIndex(); } @@ -1277,7 +1282,7 @@ public class MediaController implements Player { * C#INDEX_UNSET} even when {@link #hasPreviousMediaItem()} is {@code true}. */ @Override - public int getPreviousMediaItemIndex() { + public final int getPreviousMediaItemIndex() { verifyApplicationThread(); return isConnected() ? impl.getPreviousMediaItemIndex() : C.INDEX_UNSET; } @@ -1288,7 +1293,7 @@ public class MediaController implements Player { @UnstableApi @Deprecated @Override - public int getNextWindowIndex() { + public final int getNextWindowIndex() { return getNextMediaItemIndex(); } @@ -1300,7 +1305,7 @@ public class MediaController implements Player { * C#INDEX_UNSET} even when {@link #hasNextMediaItem()} is {@code true}. */ @Override - public int getNextMediaItemIndex() { + public final int getNextMediaItemIndex() { verifyApplicationThread(); return isConnected() ? impl.getNextMediaItemIndex() : C.INDEX_UNSET; } @@ -1311,7 +1316,7 @@ public class MediaController implements Player { @UnstableApi @Deprecated @Override - public boolean hasPrevious() { + public final boolean hasPrevious() { return hasPreviousMediaItem(); } @@ -1321,7 +1326,7 @@ public class MediaController implements Player { @UnstableApi @Deprecated @Override - public boolean hasNext() { + public final boolean hasNext() { return hasNextMediaItem(); } @@ -1331,7 +1336,7 @@ public class MediaController implements Player { @UnstableApi @Deprecated @Override - public boolean hasPreviousWindow() { + public final boolean hasPreviousWindow() { return hasPreviousMediaItem(); } @@ -1341,18 +1346,18 @@ public class MediaController implements Player { @UnstableApi @Deprecated @Override - public boolean hasNextWindow() { + public final boolean hasNextWindow() { return hasNextMediaItem(); } @Override - public boolean hasPreviousMediaItem() { + public final boolean hasPreviousMediaItem() { verifyApplicationThread(); return isConnected() && impl.hasPreviousMediaItem(); } @Override - public boolean hasNextMediaItem() { + public final boolean hasNextMediaItem() { verifyApplicationThread(); return isConnected() && impl.hasNextMediaItem(); } @@ -1363,7 +1368,7 @@ public class MediaController implements Player { @UnstableApi @Deprecated @Override - public void previous() { + public final void previous() { seekToPreviousMediaItem(); } @@ -1373,7 +1378,7 @@ public class MediaController implements Player { @UnstableApi @Deprecated @Override - public void next() { + public final void next() { seekToNextMediaItem(); } @@ -1383,7 +1388,7 @@ public class MediaController implements Player { @UnstableApi @Deprecated @Override - public void seekToPreviousWindow() { + public final void seekToPreviousWindow() { seekToPreviousMediaItem(); } @@ -1394,7 +1399,7 @@ public class MediaController implements Player { * android.support.v4.media.session.MediaSessionCompat}, it's the same as {@link #seekToPrevious}. */ @Override - public void seekToPreviousMediaItem() { + public final void seekToPreviousMediaItem() { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring seekToPreviousMediaItem()."); @@ -1409,7 +1414,7 @@ public class MediaController implements Player { @UnstableApi @Deprecated @Override - public void seekToNextWindow() { + public final void seekToNextWindow() { seekToNextMediaItem(); } @@ -1420,7 +1425,7 @@ public class MediaController implements Player { * android.support.v4.media.session.MediaSessionCompat}, it's the same as {@link #seekToNext}. */ @Override - public void seekToNextMediaItem() { + public final void seekToNextMediaItem() { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring seekToNextMediaItem()."); @@ -1437,7 +1442,7 @@ public class MediaController implements Player { * index immediately because the previous media item index is unknown. */ @Override - public void seekToPrevious() { + public final void seekToPrevious() { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring seekToPrevious()."); @@ -1453,7 +1458,7 @@ public class MediaController implements Player { * android.support.v4.media.session.MediaSessionCompat}, it always returns {@code 0}. */ @Override - public long getMaxSeekToPreviousPosition() { + public final long getMaxSeekToPreviousPosition() { verifyApplicationThread(); return isConnected() ? impl.getMaxSeekToPreviousPosition() : 0L; } @@ -1466,7 +1471,7 @@ public class MediaController implements Player { * index immediately because the previous media item index is unknown. */ @Override - public void seekToNext() { + public final void seekToNext() { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring seekToNext()."); @@ -1476,13 +1481,13 @@ public class MediaController implements Player { } @Override - public @RepeatMode int getRepeatMode() { + public final @RepeatMode int getRepeatMode() { verifyApplicationThread(); return isConnected() ? impl.getRepeatMode() : Player.REPEAT_MODE_OFF; } @Override - public void setRepeatMode(@RepeatMode int repeatMode) { + public final void setRepeatMode(@RepeatMode int repeatMode) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring setRepeatMode()."); @@ -1492,13 +1497,13 @@ public class MediaController implements Player { } @Override - public boolean getShuffleModeEnabled() { + public final boolean getShuffleModeEnabled() { verifyApplicationThread(); return isConnected() && impl.getShuffleModeEnabled(); } @Override - public void setShuffleModeEnabled(boolean shuffleModeEnabled) { + public final void setShuffleModeEnabled(boolean shuffleModeEnabled) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring setShuffleMode()."); @@ -1508,20 +1513,20 @@ public class MediaController implements Player { } @Override - public VideoSize getVideoSize() { + public final VideoSize getVideoSize() { verifyApplicationThread(); return isConnected() ? impl.getVideoSize() : VideoSize.UNKNOWN; } @UnstableApi @Override - public Size getSurfaceSize() { + public final Size getSurfaceSize() { verifyApplicationThread(); return isConnected() ? impl.getSurfaceSize() : Size.UNKNOWN; } @Override - public void clearVideoSurface() { + public final void clearVideoSurface() { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring clearVideoSurface()."); @@ -1531,7 +1536,7 @@ public class MediaController implements Player { } @Override - public void clearVideoSurface(@Nullable Surface surface) { + public final void clearVideoSurface(@Nullable Surface surface) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring clearVideoSurface()."); @@ -1541,7 +1546,7 @@ public class MediaController implements Player { } @Override - public void setVideoSurface(@Nullable Surface surface) { + public final void setVideoSurface(@Nullable Surface surface) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring setVideoSurface()."); @@ -1551,7 +1556,7 @@ public class MediaController implements Player { } @Override - public void setVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder) { + public final void setVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring setVideoSurfaceHolder()."); @@ -1561,7 +1566,7 @@ public class MediaController implements Player { } @Override - public void clearVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder) { + public final void clearVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring clearVideoSurfaceHolder()."); @@ -1571,7 +1576,7 @@ public class MediaController implements Player { } @Override - public void setVideoSurfaceView(@Nullable SurfaceView surfaceView) { + public final void setVideoSurfaceView(@Nullable SurfaceView surfaceView) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring setVideoSurfaceView()."); @@ -1581,7 +1586,7 @@ public class MediaController implements Player { } @Override - public void clearVideoSurfaceView(@Nullable SurfaceView surfaceView) { + public final void clearVideoSurfaceView(@Nullable SurfaceView surfaceView) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring clearVideoSurfaceView()."); @@ -1591,7 +1596,7 @@ public class MediaController implements Player { } @Override - public void setVideoTextureView(@Nullable TextureView textureView) { + public final void setVideoTextureView(@Nullable TextureView textureView) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring setVideoTextureView()."); @@ -1601,7 +1606,7 @@ public class MediaController implements Player { } @Override - public void clearVideoTextureView(@Nullable TextureView textureView) { + public final void clearVideoTextureView(@Nullable TextureView textureView) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring clearVideoTextureView()."); @@ -1611,20 +1616,20 @@ public class MediaController implements Player { } @Override - public CueGroup getCurrentCues() { + public final CueGroup getCurrentCues() { verifyApplicationThread(); return isConnected() ? impl.getCurrentCues() : CueGroup.EMPTY_TIME_ZERO; } @Override @FloatRange(from = 0, to = 1) - public float getVolume() { + public final float getVolume() { verifyApplicationThread(); return isConnected() ? impl.getVolume() : 1; } @Override - public void setVolume(@FloatRange(from = 0, to = 1) float volume) { + public final void setVolume(@FloatRange(from = 0, to = 1) float volume) { verifyApplicationThread(); checkArgument(volume >= 0 && volume <= 1, "volume must be between 0 and 1"); if (!isConnected()) { @@ -1635,7 +1640,7 @@ public class MediaController implements Player { } @Override - public DeviceInfo getDeviceInfo() { + public final DeviceInfo getDeviceInfo() { verifyApplicationThread(); if (!isConnected()) { return DeviceInfo.UNKNOWN; @@ -1645,7 +1650,7 @@ public class MediaController implements Player { @Override @IntRange(from = 0) - public int getDeviceVolume() { + public final int getDeviceVolume() { verifyApplicationThread(); if (!isConnected()) { return 0; @@ -1654,7 +1659,7 @@ public class MediaController implements Player { } @Override - public boolean isDeviceMuted() { + public final boolean isDeviceMuted() { verifyApplicationThread(); if (!isConnected()) { return false; @@ -1663,7 +1668,7 @@ public class MediaController implements Player { } @Override - public void setDeviceVolume(@IntRange(from = 0) int volume) { + public final void setDeviceVolume(@IntRange(from = 0) int volume) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring setDeviceVolume()."); @@ -1673,7 +1678,7 @@ public class MediaController implements Player { } @Override - public void increaseDeviceVolume() { + public final void increaseDeviceVolume() { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring increaseDeviceVolume()."); @@ -1683,7 +1688,7 @@ public class MediaController implements Player { } @Override - public void decreaseDeviceVolume() { + public final void decreaseDeviceVolume() { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring decreaseDeviceVolume()."); @@ -1693,7 +1698,7 @@ public class MediaController implements Player { } @Override - public void setDeviceMuted(boolean muted) { + public final void setDeviceMuted(boolean muted) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring setDeviceMuted()."); @@ -1703,19 +1708,19 @@ public class MediaController implements Player { } @Override - public MediaMetadata getMediaMetadata() { + public final MediaMetadata getMediaMetadata() { verifyApplicationThread(); return isConnected() ? impl.getMediaMetadata() : MediaMetadata.EMPTY; } @Override - public Tracks getCurrentTracks() { + public final Tracks getCurrentTracks() { verifyApplicationThread(); return isConnected() ? impl.getCurrentTracks() : Tracks.EMPTY; } @Override - public TrackSelectionParameters getTrackSelectionParameters() { + public final TrackSelectionParameters getTrackSelectionParameters() { verifyApplicationThread(); if (!isConnected()) { return TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT; @@ -1724,7 +1729,7 @@ public class MediaController implements Player { } @Override - public void setTrackSelectionParameters(TrackSelectionParameters parameters) { + public final void setTrackSelectionParameters(TrackSelectionParameters parameters) { verifyApplicationThread(); if (!isConnected()) { Log.w(TAG, "The controller is not connected. Ignoring setTrackSelectionParameters()."); @@ -1733,7 +1738,7 @@ public class MediaController implements Player { } @Override - public Looper getApplicationLooper() { + public final Looper getApplicationLooper() { // Don't verify application thread. We allow calls to this method from any thread. return applicationHandler.getLooper(); } @@ -1742,7 +1747,7 @@ public class MediaController implements Player { * Gets the optional time diff (in milliseconds) used for calculating the current position, or * {@link C#TIME_UNSET} if no diff should be applied. */ - /* package */ long getTimeDiffMs() { + /* package */ final long getTimeDiffMs() { return timeDiffMs; } @@ -1752,32 +1757,32 @@ public class MediaController implements Player { * @param timeDiffMs {@link C#TIME_UNSET} for reset. */ @VisibleForTesting(otherwise = NONE) - /* package */ void setTimeDiffMs(long timeDiffMs) { + /* package */ final void setTimeDiffMs(long timeDiffMs) { verifyApplicationThread(); this.timeDiffMs = timeDiffMs; } @Override - public void addListener(Player.Listener listener) { + public final void addListener(Player.Listener listener) { // Don't verify application thread. We allow calls to this method from any thread. checkNotNull(listener, "listener must not be null"); impl.addListener(listener); } @Override - public void removeListener(Player.Listener listener) { + public final void removeListener(Player.Listener listener) { verifyApplicationThread(); checkNotNull(listener, "listener must not be null"); impl.removeListener(listener); } @Override - public boolean isCommandAvailable(@Command int command) { + public final boolean isCommandAvailable(@Command int command) { return getAvailableCommands().contains(command); } @Override - public Commands getAvailableCommands() { + public final Commands getAvailableCommands() { verifyApplicationThread(); if (!isConnected()) { return Commands.EMPTY; @@ -1790,12 +1795,13 @@ public class MediaController implements Player { * sessionCommandCode} must not be {@link SessionCommand#COMMAND_CODE_CUSTOM}. Use {@link * #isSessionCommandAvailable(SessionCommand)} for custom commands. */ - public boolean isSessionCommandAvailable(@SessionCommand.CommandCode int sessionCommandCode) { + public final boolean isSessionCommandAvailable( + @SessionCommand.CommandCode int sessionCommandCode) { return getAvailableSessionCommands().contains(sessionCommandCode); } /** Returns whether the {@link SessionCommand} is available. */ - public boolean isSessionCommandAvailable(SessionCommand sessionCommand) { + public final boolean isSessionCommandAvailable(SessionCommand sessionCommand) { return getAvailableSessionCommands().contains(sessionCommand); } @@ -1806,7 +1812,7 @@ public class MediaController implements Player { * * @return The available session commands. */ - public SessionCommands getAvailableSessionCommands() { + public final SessionCommands getAvailableSessionCommands() { verifyApplicationThread(); if (!isConnected()) { return SessionCommands.EMPTY; @@ -1819,16 +1825,16 @@ public class MediaController implements Player { new SessionResult(SessionResult.RESULT_ERROR_SESSION_DISCONNECTED)); } - /* package */ void runOnApplicationLooper(Runnable runnable) { + /* package */ final void runOnApplicationLooper(Runnable runnable) { postOrRun(applicationHandler, runnable); } - /* package */ void notifyControllerListener(Consumer listenerConsumer) { + /* package */ final void notifyControllerListener(Consumer listenerConsumer) { checkState(Looper.myLooper() == getApplicationLooper()); listenerConsumer.accept(listener); } - /* package */ void notifyAccepted() { + /* package */ final void notifyAccepted() { checkState(Looper.myLooper() == getApplicationLooper()); checkState(!connectionNotified); connectionNotified = true; @@ -1839,7 +1845,7 @@ public class MediaController implements Player { checkState(Looper.myLooper() == getApplicationLooper(), WRONG_THREAD_ERROR_MESSAGE); } - interface MediaControllerImpl { + /* package */ interface MediaControllerImpl { void connect(@UnderInitialization MediaControllerImpl this);