@Override public void onSkipToPrevious(Player player) { Timeline timeline = player.getCurrentTimeline(); if (timeline.isEmpty() || player.isPlayingAd()) { return; } int windowIndex = player.getCurrentWindowIndex(); timeline.getWindow(windowIndex, window); int previousWindowIndex = player.getPreviousWindowIndex(); if (previousWindowIndex != C.INDEX_UNSET && (player.getCurrentPosition() <= MAX_POSITION_FOR_SEEK_TO_PREVIOUS || (window.isDynamic && !window.isSeekable))) { player.seekTo(previousWindowIndex, C.TIME_UNSET); } else { player.seekTo(0); } }
@Override public boolean isPlaying() { int playbackState = player.getPlaybackState(); return playbackState != Player.STATE_IDLE && playbackState != Player.STATE_ENDED && player.getPlayWhenReady(); }
/** * Sets the {@link Player} to control. * * @param player The {@link Player} to control, or {@code null} to detach the current player. Only * players which are accessed on the main thread are supported ({@code * player.getApplicationLooper() == Looper.getMainLooper()}). */ public void setPlayer(@Nullable Player player) { Assertions.checkState(Looper.myLooper() == Looper.getMainLooper()); Assertions.checkArgument( player == null || player.getApplicationLooper() == Looper.getMainLooper()); if (this.player == player) { return; } if (this.player != null) { this.player.removeListener(componentListener); } this.player = player; if (player != null) { player.addListener(componentListener); } updateAll(); }
@Override public long getCurrentPosition() { return player.getPlaybackState() == Player.STATE_IDLE ? -1 : player.getCurrentPosition(); }
private boolean isPlayingAd() { return player != null && player.isPlayingAd() && player.getPlayWhenReady(); }
long durationUs = 0; int adGroupCount = 0; Timeline timeline = player.getCurrentTimeline(); if (!timeline.isEmpty()) { int currentWindowIndex = player.getCurrentWindowIndex(); int firstWindowIndex = multiWindowTimeBar ? 0 : currentWindowIndex; int lastWindowIndex = position = C.usToMs(currentWindowTimeBarOffsetUs); bufferedPosition = position; if (player.isPlayingAd()) { position += player.getContentPosition(); bufferedPosition = position; } else { position += player.getCurrentPosition(); bufferedPosition += player.getBufferedPosition(); int playbackState = player == null ? Player.STATE_IDLE : player.getPlaybackState(); if (playbackState != Player.STATE_IDLE && playbackState != Player.STATE_ENDED) { long delayMs; if (player.getPlayWhenReady() && playbackState == Player.STATE_READY) { float playbackSpeed = player.getPlaybackParameters().speed; if (playbackSpeed <= 0.1f) { delayMs = 1000;
@Override public void onSkipToNext(Player player) { Timeline timeline = player.getCurrentTimeline(); if (timeline.isEmpty() || player.isPlayingAd()) { return; } int windowIndex = player.getCurrentWindowIndex(); int nextWindowIndex = player.getNextWindowIndex(); if (nextWindowIndex != C.INDEX_UNSET) { player.seekTo(nextWindowIndex, C.TIME_UNSET); } else if (timeline.getWindow(windowIndex, window).isDynamic) { player.seekTo(windowIndex, C.TIME_UNSET); } }
boolean playWhenReady = false; if (this.currentPlayer != null) { int playbackState = this.currentPlayer.getPlaybackState(); if (playbackState != Player.STATE_ENDED) { playbackPositionMs = this.currentPlayer.getCurrentPosition(); playWhenReady = this.currentPlayer.getPlayWhenReady(); windowIndex = this.currentPlayer.getCurrentWindowIndex(); if (windowIndex != currentItemIndex) { playbackPositionMs = C.TIME_UNSET; this.currentPlayer.stop(true); } else {
long durationUs = 0; int adGroupCount = 0; Timeline timeline = player.getCurrentTimeline(); if (!timeline.isEmpty()) { int currentWindowIndex = player.getCurrentWindowIndex(); int firstWindowIndex = multiWindowTimeBar ? 0 : currentWindowIndex; int lastWindowIndex = position = currentWindowTimeBarOffsetMs + player.getContentPosition(); bufferedPosition = currentWindowTimeBarOffsetMs + player.getContentBufferedPosition(); if (timeBar != null) { int extraAdGroupCount = extraAdGroupTimesMs.length; int playbackState = player == null ? Player.STATE_IDLE : player.getPlaybackState(); if (playbackState != Player.STATE_IDLE && playbackState != Player.STATE_ENDED) { long delayMs; if (player.getPlayWhenReady() && playbackState == Player.STATE_READY) { float playbackSpeed = player.getPlaybackParameters().speed; if (playbackSpeed <= 0.1f) { delayMs = 1000;
Assertions.checkState(Looper.myLooper() == Looper.getMainLooper()); Assertions.checkArgument( player == null || player.getApplicationLooper() == Looper.getMainLooper()); if (this.player == player) { return; this.player.removeListener(playerListener); if (player == null) { stopNotification(); wasPlayWhenReady = player.getPlayWhenReady(); lastPlaybackState = player.getPlaybackState(); player.addListener(playerListener); if (lastPlaybackState != Player.STATE_IDLE) { startOrUpdateNotification();
int playbackState = player.getPlaybackState(); ExoPlaybackException playbackError = playbackState == Player.STATE_IDLE ? player.getPlaybackError() : null; boolean reportError = playbackError != null || customError != null; int sessionPlaybackState = reportError ? PlaybackStateCompat.STATE_ERROR : mapPlaybackState(player.getPlaybackState(), player.getPlayWhenReady()); if (customError != null) { builder.setErrorMessage(customError.first, customError.second); : MediaSessionCompat.QueueItem.UNKNOWN_ID; Bundle extras = new Bundle(); extras.putFloat(EXTRAS_PITCH, player.getPlaybackParameters().pitch); builder .setActions(buildPlaybackActions()) .setActiveQueueItemId(activeQueueItemId) .setBufferedPosition(player.getBufferedPosition()) .setState( sessionPlaybackState, player.getCurrentPosition(), player.getPlaybackParameters().speed, SystemClock.elapsedRealtime()) .setExtras(extras);
long eventPositionMs; boolean isInCurrentWindow = timeline == player.getCurrentTimeline() && windowIndex == player.getCurrentWindowIndex(); if (mediaPeriodId != null && mediaPeriodId.isAd()) { boolean isCurrentAd = isInCurrentWindow && player.getCurrentAdGroupIndex() == mediaPeriodId.adGroupIndex && player.getCurrentAdIndexInAdGroup() == mediaPeriodId.adIndexInAdGroup; eventPositionMs = isCurrentAd ? player.getCurrentPosition() : 0; } else if (isInCurrentWindow) { eventPositionMs = player.getContentPosition(); } else { mediaPeriodId, eventPositionMs, player.getCurrentPosition(), player.getTotalBufferedDuration());
@Override public long getSupportedQueueNavigatorActions(Player player) { if (player == null) { return 0; } Timeline timeline = player.getCurrentTimeline(); if (timeline.isEmpty() || player.isPlayingAd()) { return 0; } long actions = 0; if (timeline.getWindowCount() > 1) { actions |= PlaybackStateCompat.ACTION_SKIP_TO_QUEUE_ITEM; } if (window.isSeekable || !window.isDynamic || player.hasPrevious()) { actions |= PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS; } if (window.isDynamic || player.hasNext()) { actions |= PlaybackStateCompat.ACTION_SKIP_TO_NEXT; } return actions; }
Assertions.checkState(Looper.myLooper() == Looper.getMainLooper()); Assertions.checkArgument( player == null || player.getApplicationLooper() == Looper.getMainLooper()); if (this.player == player) { return; this.player.removeListener(componentListener); Player.VideoComponent oldVideoComponent = this.player.getVideoComponent(); if (oldVideoComponent != null) { oldVideoComponent.removeVideoListener(componentListener); Player.TextComponent oldTextComponent = this.player.getTextComponent(); if (oldTextComponent != null) { oldTextComponent.removeTextOutput(componentListener); updateForCurrentTrackSelections(/* isNewPlayer= */ true); if (player != null) { Player.VideoComponent newVideoComponent = player.getVideoComponent(); if (newVideoComponent != null) { if (surfaceView instanceof TextureView) { Player.TextComponent newTextComponent = player.getTextComponent(); if (newTextComponent != null) { newTextComponent.addTextOutput(componentListener); player.addListener(componentListener); maybeShowController(false); } else {
@Override public final void onCurrentWindowIndexChanged(Player player) { if (activeQueueItemId == MediaSessionCompat.QueueItem.UNKNOWN_ID || player.getCurrentTimeline().getWindowCount() > maxQueueSize) { publishFloatingQueueWindow(player); } else if (!player.getCurrentTimeline().isEmpty()) { activeQueueItemId = player.getCurrentWindowIndex(); } }
.setDefaults(defaults); if (useChronometer && !player.isPlayingAd() && !player.isCurrentWindowDynamic() && player.getPlayWhenReady() && player.getPlaybackState() == Player.STATE_READY) { builder .setWhen(System.currentTimeMillis() - player.getContentPosition()) .setShowWhen(true) .setUsesChronometer(true);
@Override public VideoProgressUpdate getAdProgress() { if (player == null) { return lastAdProgress; } else if (imaAdState != IMA_AD_STATE_NONE && playingAd) { long adDuration = player.getDuration(); return adDuration == C.TIME_UNSET ? VideoProgressUpdate.VIDEO_TIME_NOT_READY : new VideoProgressUpdate(player.getCurrentPosition(), adDuration); } else { return VideoProgressUpdate.VIDEO_TIME_NOT_READY; } }
@Override public void onPlayFromMediaId(String mediaId, Bundle extras) { if (canDispatchToPlaybackPreparer(PlaybackStateCompat.ACTION_PLAY_FROM_MEDIA_ID)) { player.stop(); player.setPlayWhenReady(true); playbackPreparer.onPrepareFromMediaId(mediaId, extras); } }
rewind(); } else if (playButton == view) { if (player.getPlaybackState() == Player.STATE_IDLE) { if (playbackPreparer != null) { playbackPreparer.preparePlayback(); } else if (player.getPlaybackState() == Player.STATE_ENDED) { controlDispatcher.dispatchSeekTo(player, player.getCurrentWindowIndex(), C.TIME_UNSET); } else if (repeatToggleButton == view) { controlDispatcher.dispatchSetRepeatMode( player, RepeatModeUtil.getNextRepeatMode(player.getRepeatMode(), repeatToggleModes)); } else if (shuffleButton == view) { controlDispatcher.dispatchSetShuffleModeEnabled(player, !player.getShuffleModeEnabled());
@Override public void onRewind(Player player) { if (rewindIncrementMs <= 0) { return; } onSeekTo(player, player.getCurrentPosition() - rewindIncrementMs); }