blob: 6b2b7426d85d8670e72b0440f5c6f7d7054dd036 [file] [log] [blame]
/*
* Copyright 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.android.exoplayer2;
import android.os.Looper;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.TextureView;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.audio.AudioAttributes;
import com.google.android.exoplayer2.metadata.Metadata;
import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.text.Cue;
import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
import com.google.android.exoplayer2.trackselection.TrackSelectionParameters;
import com.google.android.exoplayer2.video.VideoSize;
import java.util.List;
/**
* A {@link Player} that forwards operations to another {@link Player}. Applications can use this
* class to suppress or modify specific operations, by overriding the respective methods.
*/
public class ForwardingPlayer implements Player {
private final Player player;
/** Creates a new instance that forwards all operations to {@code player}. */
public ForwardingPlayer(Player player) {
this.player = player;
}
@Deprecated
public Looper getApplicationLooper() {
return player.getApplicationLooper();
}
@Deprecated
public void addListener(Listener listener) {
player.addListener(new ForwardingListener(this, listener));
}
@Override
public void removeListener(Listener listener) {
player.removeListener(new ForwardingListener(this, listener));
}
@Override
public void setMediaItems(List<MediaItem> mediaItems) {
player.setMediaItems(mediaItems);
}
@Override
public void setMediaItems(List<MediaItem> mediaItems, boolean resetPosition) {
player.setMediaItems(mediaItems, resetPosition);
}
@Override
public void setMediaItems(List<MediaItem> mediaItems, int startIndex, long startPositionMs) {
player.setMediaItems(mediaItems, startIndex, startPositionMs);
}
@Override
public void setMediaItem(MediaItem mediaItem) {
player.setMediaItem(mediaItem);
}
@Override
public void setMediaItem(MediaItem mediaItem, long startPositionMs) {
player.setMediaItem(mediaItem, startPositionMs);
}
@Override
public void setMediaItem(MediaItem mediaItem, boolean resetPosition) {
player.setMediaItem(mediaItem, resetPosition);
}
@Override
public void addMediaItem(MediaItem mediaItem) {
player.addMediaItem(mediaItem);
}
@Override
public void addMediaItem(int index, MediaItem mediaItem) {
player.addMediaItem(index, mediaItem);
}
@Override
public void addMediaItems(List<MediaItem> mediaItems) {
player.addMediaItems(mediaItems);
}
@Override
public void addMediaItems(int index, List<MediaItem> mediaItems) {
player.addMediaItems(index, mediaItems);
}
@Override
public void moveMediaItem(int currentIndex, int newIndex) {
player.moveMediaItem(currentIndex, newIndex);
}
@Override
public void moveMediaItems(int fromIndex, int toIndex, int newIndex) {
player.moveMediaItems(fromIndex, toIndex, newIndex);
}
@Override
public void removeMediaItem(int index) {
player.removeMediaItem(index);
}
@Override
public void removeMediaItems(int fromIndex, int toIndex) {
player.removeMediaItems(fromIndex, toIndex);
}
@Override
public void clearMediaItems() {
player.clearMediaItems();
}
@Override
public boolean isCommandAvailable(@Command int command) {
return player.isCommandAvailable(command);
}
@Override
public boolean canAdvertiseSession() {
return player.canAdvertiseSession();
}
@Override
public Commands getAvailableCommands() {
return player.getAvailableCommands();
}
@Override
public void prepare() {
player.prepare();
}
@Override
public int getPlaybackState() {
return player.getPlaybackState();
}
@Override
public int getPlaybackSuppressionReason() {
return player.getPlaybackSuppressionReason();
}
@Override
public boolean isPlaying() {
return player.isPlaying();
}
@Nullable
@Override
public PlaybackException getPlayerError() {
return player.getPlayerError();
}
@Override
public void play() {
player.play();
}
@Override
public void pause() {
player.pause();
}
@Override
public void setPlayWhenReady(boolean playWhenReady) {
player.setPlayWhenReady(playWhenReady);
}
@Override
public boolean getPlayWhenReady() {
return player.getPlayWhenReady();
}
@Override
public void setRepeatMode(@RepeatMode int repeatMode) {
player.setRepeatMode(repeatMode);
}
@Override
public int getRepeatMode() {
return player.getRepeatMode();
}
@Override
public void setShuffleModeEnabled(boolean shuffleModeEnabled) {
player.setShuffleModeEnabled(shuffleModeEnabled);
}
@Override
public boolean getShuffleModeEnabled() {
return player.getShuffleModeEnabled();
}
@Override
public boolean isLoading() {
return player.isLoading();
}
@Override
public void seekToDefaultPosition() {
player.seekToDefaultPosition();
}
@Override
public void seekToDefaultPosition(int mediaItemIndex) {
player.seekToDefaultPosition(mediaItemIndex);
}
@Override
public void seekTo(long positionMs) {
player.seekTo(positionMs);
}
@Override
public void seekTo(int mediaItemIndex, long positionMs) {
player.seekTo(mediaItemIndex, positionMs);
}
@Override
public long getSeekBackIncrement() {
return player.getSeekBackIncrement();
}
@Override
public void seekBack() {
player.seekBack();
}
@Override
public long getSeekForwardIncrement() {
return player.getSeekForwardIncrement();
}
@Override
public void seekForward() {
player.seekForward();
}
@Deprecated
@Override
public boolean hasPrevious() {
return player.hasPrevious();
}
@Deprecated
@Override
public boolean hasPreviousWindow() {
return player.hasPreviousWindow();
}
@Override
public boolean hasPreviousMediaItem() {
return player.hasPreviousMediaItem();
}
@Deprecated
@Override
public void previous() {
player.previous();
}
@Deprecated
@Override
public void seekToPreviousWindow() {
player.seekToPreviousWindow();
}
@Override
public void seekToPreviousMediaItem() {
player.seekToPreviousMediaItem();
}
@Override
public void seekToPrevious() {
player.seekToPrevious();
}
@Override
public long getMaxSeekToPreviousPosition() {
return player.getMaxSeekToPreviousPosition();
}
@Deprecated
@Override
public boolean hasNext() {
return player.hasNext();
}
@Deprecated
@Override
public boolean hasNextWindow() {
return player.hasNextWindow();
}
@Override
public boolean hasNextMediaItem() {
return player.hasNextMediaItem();
}
@Deprecated
@Override
public void next() {
player.next();
}
@Deprecated
@Override
public void seekToNextWindow() {
player.seekToNextWindow();
}
@Override
public void seekToNextMediaItem() {
player.seekToNextMediaItem();
}
@Override
public void seekToNext() {
player.seekToNext();
}
@Override
public void setPlaybackParameters(PlaybackParameters playbackParameters) {
player.setPlaybackParameters(playbackParameters);
}
@Override
public void setPlaybackSpeed(float speed) {
player.setPlaybackSpeed(speed);
}
@Override
public PlaybackParameters getPlaybackParameters() {
return player.getPlaybackParameters();
}
@Override
public void stop() {
player.stop();
}
@Deprecated
@Override
public void stop(boolean reset) {
player.stop(reset);
}
@Override
public void release() {
player.release();
}
@Override
public TrackGroupArray getCurrentTrackGroups() {
return player.getCurrentTrackGroups();
}
@Override
public TrackSelectionArray getCurrentTrackSelections() {
return player.getCurrentTrackSelections();
}
@Override
public TracksInfo getCurrentTracksInfo() {
return player.getCurrentTracksInfo();
}
@Override
public TrackSelectionParameters getTrackSelectionParameters() {
return player.getTrackSelectionParameters();
}
@Override
public void setTrackSelectionParameters(TrackSelectionParameters parameters) {
player.setTrackSelectionParameters(parameters);
}
@Override
public MediaMetadata getMediaMetadata() {
return player.getMediaMetadata();
}
@Override
public MediaMetadata getPlaylistMetadata() {
return player.getPlaylistMetadata();
}
@Override
public void setPlaylistMetadata(MediaMetadata mediaMetadata) {
player.setPlaylistMetadata(mediaMetadata);
}
@Nullable
@Override
public Object getCurrentManifest() {
return player.getCurrentManifest();
}
@Override
public Timeline getCurrentTimeline() {
return player.getCurrentTimeline();
}
@Override
public int getCurrentPeriodIndex() {
return player.getCurrentPeriodIndex();
}
@Deprecated
@Override
public int getCurrentWindowIndex() {
return player.getCurrentWindowIndex();
}
@Override
public int getCurrentMediaItemIndex() {
return player.getCurrentMediaItemIndex();
}
@Deprecated
@Override
public int getNextWindowIndex() {
return player.getNextWindowIndex();
}
@Override
public int getNextMediaItemIndex() {
return player.getNextMediaItemIndex();
}
@Deprecated
@Override
public int getPreviousWindowIndex() {
return player.getPreviousWindowIndex();
}
@Override
public int getPreviousMediaItemIndex() {
return player.getPreviousMediaItemIndex();
}
@Nullable
@Override
public MediaItem getCurrentMediaItem() {
return player.getCurrentMediaItem();
}
@Override
public int getMediaItemCount() {
return player.getMediaItemCount();
}
@Override
public MediaItem getMediaItemAt(int index) {
return player.getMediaItemAt(index);
}
@Override
public long getDuration() {
return player.getDuration();
}
@Override
public long getCurrentPosition() {
return player.getCurrentPosition();
}
@Override
public long getBufferedPosition() {
return player.getBufferedPosition();
}
@Override
public int getBufferedPercentage() {
return player.getBufferedPercentage();
}
@Override
public long getTotalBufferedDuration() {
return player.getTotalBufferedDuration();
}
@Deprecated
@Override
public boolean isCurrentWindowDynamic() {
return player.isCurrentWindowDynamic();
}
@Override
public boolean isCurrentMediaItemDynamic() {
return player.isCurrentMediaItemDynamic();
}
@Deprecated
@Override
public boolean isCurrentWindowLive() {
return player.isCurrentWindowLive();
}
@Override
public boolean isCurrentMediaItemLive() {
return player.isCurrentMediaItemLive();
}
@Override
public long getCurrentLiveOffset() {
return player.getCurrentLiveOffset();
}
@Deprecated
@Override
public boolean isCurrentWindowSeekable() {
return player.isCurrentWindowSeekable();
}
@Override
public boolean isCurrentMediaItemSeekable() {
return player.isCurrentMediaItemSeekable();
}
@Override
public boolean isPlayingAd() {
return player.isPlayingAd();
}
@Override
public int getCurrentAdGroupIndex() {
return player.getCurrentAdGroupIndex();
}
@Override
public int getCurrentAdIndexInAdGroup() {
return player.getCurrentAdIndexInAdGroup();
}
@Override
public long getContentDuration() {
return player.getContentDuration();
}
@Override
public long getContentPosition() {
return player.getContentPosition();
}
@Override
public long getContentBufferedPosition() {
return player.getContentBufferedPosition();
}
@Override
public AudioAttributes getAudioAttributes() {
return player.getAudioAttributes();
}
@Override
public void setVolume(float volume) {
player.setVolume(volume);
}
@Override
public float getVolume() {
return player.getVolume();
}
@Override
public VideoSize getVideoSize() {
return player.getVideoSize();
}
@Override
public void clearVideoSurface() {
player.clearVideoSurface();
}
@Override
public void clearVideoSurface(@Nullable Surface surface) {
player.clearVideoSurface(surface);
}
@Override
public void setVideoSurface(@Nullable Surface surface) {
player.setVideoSurface(surface);
}
@Override
public void setVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder) {
player.setVideoSurfaceHolder(surfaceHolder);
}
@Override
public void clearVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder) {
player.clearVideoSurfaceHolder(surfaceHolder);
}
@Override
public void setVideoSurfaceView(@Nullable SurfaceView surfaceView) {
player.setVideoSurfaceView(surfaceView);
}
@Override
public void clearVideoSurfaceView(@Nullable SurfaceView surfaceView) {
player.clearVideoSurfaceView(surfaceView);
}
@Override
public void setVideoTextureView(@Nullable TextureView textureView) {
player.setVideoTextureView(textureView);
}
@Override
public void clearVideoTextureView(@Nullable TextureView textureView) {
player.clearVideoTextureView(textureView);
}
@Override
public List<Cue> getCurrentCues() {
return player.getCurrentCues();
}
@Override
public DeviceInfo getDeviceInfo() {
return player.getDeviceInfo();
}
@Override
public int getDeviceVolume() {
return player.getDeviceVolume();
}
@Override
public boolean isDeviceMuted() {
return player.isDeviceMuted();
}
@Override
public void setDeviceVolume(int volume) {
player.setDeviceVolume(volume);
}
@Override
public void increaseDeviceVolume() {
player.increaseDeviceVolume();
}
@Override
public void decreaseDeviceVolume() {
player.decreaseDeviceVolume();
}
@Override
public void setDeviceMuted(boolean muted) {
player.setDeviceMuted(muted);
}
/** Returns the {@link Player} to which operations are forwarded. */
public Player getWrappedPlayer() {
return player;
}
@SuppressWarnings("deprecation") // Use of deprecated type for backwards compatibility.
private static class ForwardingEventListener implements EventListener {
private final ForwardingPlayer forwardingPlayer;
private final EventListener eventListener;
private ForwardingEventListener(
ForwardingPlayer forwardingPlayer, EventListener eventListener) {
this.forwardingPlayer = forwardingPlayer;
this.eventListener = eventListener;
}
@Override
public void onTimelineChanged(Timeline timeline, @TimelineChangeReason int reason) {
eventListener.onTimelineChanged(timeline, reason);
}
@Override
public void onMediaItemTransition(
@Nullable MediaItem mediaItem, @MediaItemTransitionReason int reason) {
eventListener.onMediaItemTransition(mediaItem, reason);
}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
eventListener.onTracksChanged(trackGroups, trackSelections);
}
@Override
public void onTracksInfoChanged(TracksInfo tracksInfo) {
eventListener.onTracksInfoChanged(tracksInfo);
}
@Override
public void onMediaMetadataChanged(MediaMetadata mediaMetadata) {
eventListener.onMediaMetadataChanged(mediaMetadata);
}
@Override
public void onPlaylistMetadataChanged(MediaMetadata mediaMetadata) {
eventListener.onPlaylistMetadataChanged(mediaMetadata);
}
@Override
public void onIsLoadingChanged(boolean isLoading) {
eventListener.onIsLoadingChanged(isLoading);
}
@Override
public void onLoadingChanged(boolean isLoading) {
eventListener.onIsLoadingChanged(isLoading);
}
@Override
public void onAvailableCommandsChanged(Commands availableCommands) {
eventListener.onAvailableCommandsChanged(availableCommands);
}
@Override
public void onTrackSelectionParametersChanged(TrackSelectionParameters parameters) {
eventListener.onTrackSelectionParametersChanged(parameters);
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, @State int playbackState) {
eventListener.onPlayerStateChanged(playWhenReady, playbackState);
}
@Override
public void onPlaybackStateChanged(@State int playbackState) {
eventListener.onPlaybackStateChanged(playbackState);
}
@Override
public void onPlayWhenReadyChanged(
boolean playWhenReady, @PlayWhenReadyChangeReason int reason) {
eventListener.onPlayWhenReadyChanged(playWhenReady, reason);
}
@Override
public void onPlaybackSuppressionReasonChanged(
@PlayWhenReadyChangeReason int playbackSuppressionReason) {
eventListener.onPlaybackSuppressionReasonChanged(playbackSuppressionReason);
}
@Override
public void onIsPlayingChanged(boolean isPlaying) {
eventListener.onIsPlayingChanged(isPlaying);
}
@Override
public void onRepeatModeChanged(@RepeatMode int repeatMode) {
eventListener.onRepeatModeChanged(repeatMode);
}
@Override
public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {
eventListener.onShuffleModeEnabledChanged(shuffleModeEnabled);
}
@Override
public void onPlayerError(PlaybackException error) {
eventListener.onPlayerError(error);
}
@Override
public void onPlayerErrorChanged(@Nullable PlaybackException error) {
eventListener.onPlayerErrorChanged(error);
}
@Override
public void onPositionDiscontinuity(@DiscontinuityReason int reason) {
eventListener.onPositionDiscontinuity(reason);
}
@Override
public void onPositionDiscontinuity(
PositionInfo oldPosition, PositionInfo newPosition, @DiscontinuityReason int reason) {
eventListener.onPositionDiscontinuity(oldPosition, newPosition, reason);
}
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
eventListener.onPlaybackParametersChanged(playbackParameters);
}
@Override
public void onSeekBackIncrementChanged(long seekBackIncrementMs) {
eventListener.onSeekBackIncrementChanged(seekBackIncrementMs);
}
@Override
public void onSeekForwardIncrementChanged(long seekForwardIncrementMs) {
eventListener.onSeekForwardIncrementChanged(seekForwardIncrementMs);
}
@Override
public void onMaxSeekToPreviousPositionChanged(long maxSeekToPreviousPositionMs) {
eventListener.onMaxSeekToPreviousPositionChanged(maxSeekToPreviousPositionMs);
}
@Override
public void onSeekProcessed() {
eventListener.onSeekProcessed();
}
@Override
public void onEvents(Player player, Events events) {
// Replace player with forwarding player.
eventListener.onEvents(forwardingPlayer, events);
}
@Override
public boolean equals(@Nullable Object o) {
if (this == o) {
return true;
}
if (!(o instanceof ForwardingEventListener)) {
return false;
}
ForwardingEventListener that = (ForwardingEventListener) o;
if (!forwardingPlayer.equals(that.forwardingPlayer)) {
return false;
}
return eventListener.equals(that.eventListener);
}
@Override
public int hashCode() {
int result = forwardingPlayer.hashCode();
result = 31 * result + eventListener.hashCode();
return result;
}
}
private static final class ForwardingListener extends ForwardingEventListener
implements Listener {
private final Listener listener;
public ForwardingListener(ForwardingPlayer forwardingPlayer, Listener listener) {
super(forwardingPlayer, listener);
this.listener = listener;
}
@Override
public void onVideoSizeChanged(VideoSize videoSize) {
listener.onVideoSizeChanged(videoSize);
}
@Override
public void onSurfaceSizeChanged(int width, int height) {
listener.onSurfaceSizeChanged(width, height);
}
@Override
public void onRenderedFirstFrame() {
listener.onRenderedFirstFrame();
}
@Override
public void onAudioSessionIdChanged(int audioSessionId) {
listener.onAudioSessionIdChanged(audioSessionId);
}
@Override
public void onAudioAttributesChanged(AudioAttributes audioAttributes) {
listener.onAudioAttributesChanged(audioAttributes);
}
@Override
public void onVolumeChanged(float volume) {
listener.onVolumeChanged(volume);
}
@Override
public void onSkipSilenceEnabledChanged(boolean skipSilenceEnabled) {
listener.onSkipSilenceEnabledChanged(skipSilenceEnabled);
}
@Override
public void onCues(List<Cue> cues) {
listener.onCues(cues);
}
@Override
public void onMetadata(Metadata metadata) {
listener.onMetadata(metadata);
}
@Override
public void onDeviceInfoChanged(DeviceInfo deviceInfo) {
listener.onDeviceInfoChanged(deviceInfo);
}
@Override
public void onDeviceVolumeChanged(int volume, boolean muted) {
listener.onDeviceVolumeChanged(volume, muted);
}
}
}