From efe6e6408a4b1ca39770eb00fe62a6fc9c960d72 Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 4 Oct 2019 13:29:05 +0100 Subject: [PATCH] Cleanup: Only clamp seek positions for FFWD/RWND It's confusing that seekTo(player, windowIndex, positionMs) does clamping, because it only makes sense if windowIndex is the current window. Note: This doesn't actually fix anything (other than code clarity). In cases where we were passing other windowIndices, we always passed 0 as the position and so the clamping logic wouldn't have had any effect. PiperOrigin-RevId: 272857104 --- .../mediasession/MediaSessionConnector.java | 19 +++++++++-------- .../exoplayer2/ui/PlayerControlView.java | 21 ++++++++++--------- .../ui/PlayerNotificationManager.java | 21 ++++++++++--------- 3 files changed, 32 insertions(+), 29 deletions(-) diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java index a69449378a..3b92e7e4ff 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java @@ -889,26 +889,27 @@ public final class MediaSessionConnector { private void rewind(Player player) { if (player.isCurrentWindowSeekable() && rewindMs > 0) { - seekTo(player, player.getCurrentPosition() - rewindMs); + seekToOffset(player, /* offsetMs= */ -rewindMs); } } private void fastForward(Player player) { if (player.isCurrentWindowSeekable() && fastForwardMs > 0) { - seekTo(player, player.getCurrentPosition() + fastForwardMs); + seekToOffset(player, /* offsetMs= */ fastForwardMs); } } - private void seekTo(Player player, long positionMs) { - seekTo(player, player.getCurrentWindowIndex(), positionMs); - } - - private void seekTo(Player player, int windowIndex, long positionMs) { + private void seekToOffset(Player player, long offsetMs) { + long positionMs = player.getCurrentPosition() + offsetMs; long durationMs = player.getDuration(); if (durationMs != C.TIME_UNSET) { positionMs = Math.min(positionMs, durationMs); } positionMs = Math.max(positionMs, 0); + seekTo(player, player.getCurrentWindowIndex(), positionMs); + } + + private void seekTo(Player player, int windowIndex, long positionMs) { controlDispatcher.dispatchSeekTo(player, windowIndex, positionMs); } @@ -1119,7 +1120,7 @@ public final class MediaSessionConnector { playbackPreparer.onPrepare(/* playWhenReady= */ true); } } else if (player.getPlaybackState() == Player.STATE_ENDED) { - controlDispatcher.dispatchSeekTo(player, player.getCurrentWindowIndex(), C.TIME_UNSET); + seekTo(player, player.getCurrentWindowIndex(), C.TIME_UNSET); } controlDispatcher.dispatchSetPlayWhenReady( Assertions.checkNotNull(player), /* playWhenReady= */ true); @@ -1136,7 +1137,7 @@ public final class MediaSessionConnector { @Override public void onSeekTo(long positionMs) { if (canDispatchPlaybackAction(PlaybackStateCompat.ACTION_SEEK_TO)) { - seekTo(player, positionMs); + seekTo(player, player.getCurrentWindowIndex(), positionMs); } } diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java index 6007994f6a..3b6711766e 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java @@ -997,7 +997,7 @@ public class PlayerControlView extends FrameLayout { || (window.isDynamic && !window.isSeekable))) { seekTo(player, previousWindowIndex, C.TIME_UNSET); } else { - seekTo(player, 0); + seekTo(player, windowIndex, /* positionMs= */ 0); } } @@ -1017,27 +1017,24 @@ public class PlayerControlView extends FrameLayout { private void rewind(Player player) { if (player.isCurrentWindowSeekable() && rewindMs > 0) { - seekTo(player, player.getCurrentPosition() - rewindMs); + seekToOffset(player, -rewindMs); } } private void fastForward(Player player) { if (player.isCurrentWindowSeekable() && fastForwardMs > 0) { - seekTo(player, player.getCurrentPosition() + fastForwardMs); + seekToOffset(player, fastForwardMs); } } - private void seekTo(Player player, long positionMs) { - seekTo(player, player.getCurrentWindowIndex(), positionMs); - } - - private boolean seekTo(Player player, int windowIndex, long positionMs) { + private void seekToOffset(Player player, long offsetMs) { + long positionMs = player.getCurrentPosition() + offsetMs; long durationMs = player.getDuration(); if (durationMs != C.TIME_UNSET) { positionMs = Math.min(positionMs, durationMs); } positionMs = Math.max(positionMs, 0); - return controlDispatcher.dispatchSeekTo(player, windowIndex, positionMs); + seekTo(player, player.getCurrentWindowIndex(), positionMs); } private void seekToTimeBarPosition(Player player, long positionMs) { @@ -1069,6 +1066,10 @@ public class PlayerControlView extends FrameLayout { } } + private boolean seekTo(Player player, int windowIndex, long positionMs) { + return controlDispatcher.dispatchSeekTo(player, windowIndex, positionMs); + } + @Override public void onAttachedToWindow() { super.onAttachedToWindow(); @@ -1270,7 +1271,7 @@ public class PlayerControlView extends FrameLayout { playbackPreparer.preparePlayback(); } } else if (player.getPlaybackState() == Player.STATE_ENDED) { - controlDispatcher.dispatchSeekTo(player, player.getCurrentWindowIndex(), C.TIME_UNSET); + seekTo(player, player.getCurrentWindowIndex(), C.TIME_UNSET); } controlDispatcher.dispatchSetPlayWhenReady(player, true); } else if (pauseButton == view) { diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java index a5823712f9..fb11dfae71 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java @@ -1209,7 +1209,7 @@ public class PlayerNotificationManager { || (window.isDynamic && !window.isSeekable))) { seekTo(player, previousWindowIndex, C.TIME_UNSET); } else { - seekTo(player, 0); + seekTo(player, windowIndex, /* positionMs= */ 0); } } @@ -1229,26 +1229,27 @@ public class PlayerNotificationManager { private void rewind(Player player) { if (player.isCurrentWindowSeekable() && rewindMs > 0) { - seekTo(player, Math.max(player.getCurrentPosition() - rewindMs, 0)); + seekToOffset(player, /* offsetMs= */ -rewindMs); } } private void fastForward(Player player) { if (player.isCurrentWindowSeekable() && fastForwardMs > 0) { - seekTo(player, player.getCurrentPosition() + fastForwardMs); + seekToOffset(player, /* offsetMs= */ fastForwardMs); } } - private void seekTo(Player player, long positionMs) { + private void seekToOffset(Player player, long offsetMs) { + long positionMs = player.getCurrentPosition() + offsetMs; + long durationMs = player.getDuration(); + if (durationMs != C.TIME_UNSET) { + positionMs = Math.min(positionMs, durationMs); + } + positionMs = Math.max(positionMs, 0); seekTo(player, player.getCurrentWindowIndex(), positionMs); } private void seekTo(Player player, int windowIndex, long positionMs) { - long duration = player.getDuration(); - if (duration != C.TIME_UNSET) { - positionMs = Math.min(positionMs, duration); - } - positionMs = Math.max(positionMs, 0); controlDispatcher.dispatchSeekTo(player, windowIndex, positionMs); } @@ -1369,7 +1370,7 @@ public class PlayerNotificationManager { playbackPreparer.preparePlayback(); } } else if (player.getPlaybackState() == Player.STATE_ENDED) { - controlDispatcher.dispatchSeekTo(player, player.getCurrentWindowIndex(), C.TIME_UNSET); + seekTo(player, player.getCurrentWindowIndex(), C.TIME_UNSET); } controlDispatcher.dispatchSetPlayWhenReady(player, /* playWhenReady= */ true); } else if (ACTION_PAUSE.equals(action)) {