Commit e828dfbd by kimvde Committed by kim-vde

Add getMaxSeekToPreviousPosition to Player

PiperOrigin-RevId: 383656919
parent c4e99902
......@@ -4,7 +4,10 @@
* Core Library:
* Add `needsReconfiguration` API to the `MediaCodecAdapter` interface.
* Add `seekForward`, `seekBack` and `seekToPrevious` methods to `Player`.
* Add `getSeekForwardIncrement`, `seekForward`, `getSeekBackIncrement`
and `seekBack` methods to `Player`.
* Add `getMaxSeekToPreviousPosition` and `seekToPrevious` methods to
`Player`.
* Make `Player` depend on the new `PlaybackException` class instead of
`ExoPlaybackException`:
* `Player.getPlayerError` now returns a `PlaybackException`.
......
......@@ -459,6 +459,11 @@ public final class CastPlayer extends BasePlayer {
}
@Override
public int getMaxSeekToPreviousPosition() {
return C.DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS;
}
@Override
public void setPlaybackParameters(PlaybackParameters playbackParameters) {
// Unsupported by the RemoteMediaClient API. Do nothing.
}
......
......@@ -155,7 +155,7 @@ public abstract class BasePlayer implements Player {
if (hasPrevious) {
previous();
}
} else if (hasPrevious && getCurrentPosition() <= MAX_POSITION_FOR_SEEK_TO_PREVIOUS_MS) {
} else if (hasPrevious && getCurrentPosition() <= getMaxSeekToPreviousPosition()) {
previous();
} else {
seekTo(/* positionMs= */ 0);
......
......@@ -651,6 +651,12 @@ public final class C {
/** A default seek back increment, in milliseconds. */
public static final long DEFAULT_SEEK_BACK_INCREMENT_MS = 5000;
/**
* A default maximum position for which a seek to previous will seek to the previous window, in
* milliseconds.
*/
public static final int DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS = 3000;
/** "cenc" scheme type name as defined in ISO/IEC 23001-7:2016. */
@SuppressWarnings("ConstantField")
public static final String CENC_TYPE_cenc = "cenc";
......
......@@ -283,6 +283,11 @@ public class ForwardingPlayer implements Player {
}
@Override
public int getMaxSeekToPreviousPosition() {
return player.getMaxSeekToPreviousPosition();
}
@Override
public boolean hasNext() {
return player.hasNext();
}
......@@ -712,6 +717,11 @@ public class ForwardingPlayer implements Player {
}
@Override
public void onMaxSeekToPreviousPositionChanged(int maxSeekToPreviousPositionMs) {
eventListener.onMaxSeekToPreviousPositionChanged(maxSeekToPreviousPositionMs);
}
@Override
public void onSeekProcessed() {
eventListener.onSeekProcessed();
}
......
......@@ -22,7 +22,6 @@ import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.TextureView;
import androidx.annotation.IntDef;
import androidx.annotation.IntRange;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.audio.AudioAttributes;
import com.google.android.exoplayer2.audio.AudioListener;
......@@ -331,7 +330,7 @@ public interface Player {
*
* @param seekForwardIncrementMs The {@link #seekForward()} increment, in milliseconds.
*/
default void onSeekForwardIncrementChanged(@IntRange(from = 1) long seekForwardIncrementMs) {}
default void onSeekForwardIncrementChanged(long seekForwardIncrementMs) {}
/**
* Called when the value of {@link #getSeekBackIncrement()} changes.
......@@ -341,7 +340,18 @@ public interface Player {
*
* @param seekBackIncrementMs The {@link #seekBack()} increment, in milliseconds.
*/
default void onSeekBackIncrementChanged(@IntRange(from = 1) long seekBackIncrementMs) {}
default void onSeekBackIncrementChanged(long seekBackIncrementMs) {}
/**
* Called when the value of {@link #getMaxSeekToPreviousPosition()} changes.
*
* <p>{@link #onEvents(Player, Events)} will also be called to report this event along with
* other events that happen in the same {@link Looper} message queue iteration.
*
* @param maxSeekToPreviousPositionMs The maximum position for which {@link #seekToPrevious()}
* seeks to the previous position, in milliseconds.
*/
default void onMaxSeekToPreviousPositionChanged(int maxSeekToPreviousPositionMs) {}
/**
* @deprecated Seeks are processed without delay. Listen to {@link
......@@ -884,9 +894,6 @@ public interface Player {
default void onMetadata(Metadata metadata) {}
}
/** The maximum position for which {@link #seekToPrevious()} seeks to the previous window. */
int MAX_POSITION_FOR_SEEK_TO_PREVIOUS_MS = 3000;
/**
* Playback state. One of {@link #STATE_IDLE}, {@link #STATE_BUFFERING}, {@link #STATE_READY} or
* {@link #STATE_ENDED}.
......@@ -1100,7 +1107,8 @@ public interface Player {
EVENT_MEDIA_METADATA_CHANGED,
EVENT_PLAYLIST_METADATA_CHANGED,
EVENT_SEEK_FORWARD_INCREMENT_CHANGED,
EVENT_SEEK_BACK_INCREMENT_CHANGED
EVENT_SEEK_BACK_INCREMENT_CHANGED,
EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED
})
@interface EventFlags {}
/** {@link #getCurrentTimeline()} changed. */
......@@ -1144,6 +1152,8 @@ public interface Player {
int EVENT_SEEK_FORWARD_INCREMENT_CHANGED = 17;
/** {@link #getSeekBackIncrement()} changed. */
int EVENT_SEEK_BACK_INCREMENT_CHANGED = 18;
/** {@link #getMaxSeekToPreviousPosition()} changed. */
int EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED = 19;
/**
* Commands that can be executed on a {@code Player}. One of {@link #COMMAND_PLAY_PAUSE}, {@link
......@@ -1657,6 +1667,15 @@ public interface Player {
void previous();
/**
* Returns the maximum position for which {@link #seekToPrevious()} seeks to the previous window,
* in milliseconds.
*
* @return The maximum seek to previous position, in milliseconds.
* @see Listener#onMaxSeekToPreviousPositionChanged(int)
*/
int getMaxSeekToPreviousPosition();
/**
* Seeks to an earlier position in the current or previous window (if available). More precisely:
*
* <ul>
......@@ -1670,8 +1689,7 @@ public interface Player {
* </ul>
* <li>Otherwise, if {@link #hasPrevious() a previous window exists} and the {@link
* #getCurrentPosition() current position} is less than {@link
* #MAX_POSITION_FOR_SEEK_TO_PREVIOUS_MS}, seeks to the default position of the previous
* window.
* #getMaxSeekToPreviousPosition()}, seeks to the default position of the previous window.
* <li>Otherwise, seeks to 0 in the current window.
* </ul>
*/
......
......@@ -731,6 +731,11 @@ import java.util.concurrent.CopyOnWriteArraySet;
}
@Override
public int getMaxSeekToPreviousPosition() {
return C.DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS;
}
@Override
public void setPlaybackParameters(PlaybackParameters playbackParameters) {
if (playbackParameters == null) {
playbackParameters = PlaybackParameters.DEFAULT;
......
......@@ -1615,6 +1615,12 @@ public class SimpleExoPlayer extends BasePlayer
}
@Override
public int getMaxSeekToPreviousPosition() {
verifyApplicationThread();
return player.getMaxSeekToPreviousPosition();
}
@Override
public void setPlaybackParameters(PlaybackParameters playbackParameters) {
verifyApplicationThread();
player.setPlaybackParameters(playbackParameters);
......
......@@ -761,6 +761,16 @@ public class AnalyticsCollector
}
@Override
public void onMaxSeekToPreviousPositionChanged(int maxSeekToPreviousPositionMs) {
EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime();
sendEvent(
eventTime,
AnalyticsListener.EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED,
listener ->
listener.onMaxSeekToPreviousPositionChanged(eventTime, maxSeekToPreviousPositionMs));
}
@Override
public void onMediaMetadataChanged(MediaMetadata mediaMetadata) {
EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime();
sendEvent(
......
......@@ -260,6 +260,9 @@ public interface AnalyticsListener {
int EVENT_SEEK_FORWARD_INCREMENT_CHANGED = Player.EVENT_SEEK_FORWARD_INCREMENT_CHANGED;
/** {@link Player#getSeekBackIncrement()} changed. */
int EVENT_SEEK_BACK_INCREMENT_CHANGED = Player.EVENT_SEEK_BACK_INCREMENT_CHANGED;
/** {@link Player#getMaxSeekToPreviousPosition()} changed. */
int EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED =
Player.EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED;
/** A source started loading data. */
int EVENT_LOAD_STARTED = 1000; // Intentional gap to leave space for new Player events
/** A source started completed loading data. */
......@@ -612,6 +615,16 @@ public interface AnalyticsListener {
default void onSeekBackIncrementChanged(EventTime eventTime, long seekBackIncrementMs) {}
/**
* Called when the maximum position for which {@link Player#seekToPrevious()} seeks to the
* previous window changes.
*
* @param eventTime The event time.
* @param maxSeekToPreviousPositionMs The maximum seek to previous position, in milliseconds.
*/
default void onMaxSeekToPreviousPositionChanged(
EventTime eventTime, int maxSeekToPreviousPositionMs) {}
/**
* Called when the repeat mode changed.
*
* @param eventTime The event time.
......
......@@ -40,7 +40,6 @@ import static com.google.android.exoplayer2.Player.COMMAND_SET_SHUFFLE_MODE;
import static com.google.android.exoplayer2.Player.COMMAND_SET_SPEED_AND_PITCH;
import static com.google.android.exoplayer2.Player.COMMAND_SET_VIDEO_SURFACE;
import static com.google.android.exoplayer2.Player.COMMAND_SET_VOLUME;
import static com.google.android.exoplayer2.Player.MAX_POSITION_FOR_SEEK_TO_PREVIOUS_MS;
import static com.google.android.exoplayer2.Player.STATE_ENDED;
import static com.google.android.exoplayer2.robolectric.RobolectricUtil.runMainLooperUntil;
import static com.google.android.exoplayer2.robolectric.TestPlayerRunHelper.playUntilPosition;
......@@ -10525,7 +10524,7 @@ public final class ExoPlayerTest {
public void seekToPrevious_closeToStart_seeksToPreviousWindow() {
ExoPlayer player = new TestExoPlayerBuilder(context).build();
player.addMediaSources(ImmutableList.of(new FakeMediaSource(), new FakeMediaSource()));
player.seekTo(/* windowIndex= */ 1, /* positionMs= */ MAX_POSITION_FOR_SEEK_TO_PREVIOUS_MS);
player.seekTo(/* windowIndex= */ 1, C.DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS);
player.seekToPrevious();
......@@ -10537,7 +10536,7 @@ public final class ExoPlayerTest {
public void seekToPrevious_notCloseToStart_seeksToZero() {
ExoPlayer player = new TestExoPlayerBuilder(context).build();
player.addMediaSources(ImmutableList.of(new FakeMediaSource(), new FakeMediaSource()));
player.seekTo(/* windowIndex= */ 1, /* positionMs= */ MAX_POSITION_FOR_SEEK_TO_PREVIOUS_MS + 1);
player.seekTo(/* windowIndex= */ 1, C.DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS + 1);
player.seekToPrevious();
......
......@@ -310,6 +310,11 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer {
}
@Override
public int getMaxSeekToPreviousPosition() {
throw new UnsupportedOperationException();
}
@Override
public void setPlaybackParameters(PlaybackParameters playbackParameters) {
throw new UnsupportedOperationException();
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment