Skip to content

Commit f1484ca

Browse files
authored
Merge pull request #24 from sandymist/seek-fix
Seek on notification player takes the users many chapters back
2 parents 6abe7cf + 8694f91 commit f1484ca

File tree

3 files changed

+23
-3
lines changed

3 files changed

+23
-3
lines changed

Armadillo/src/main/java/com/scribd/armadillo/ArmadilloPlayerChoreographer.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,11 @@ internal class ArmadilloPlayerChoreographer : ArmadilloPlayer {
326326

327327
override fun skipBackward() = doIfPlaybackReady { controls, _ -> controls.skipToPrevious() }
328328

329-
override fun seekTo(position: Milliseconds) = doIfPlaybackReady { controls, _ -> controls.seekTo(position.longValue) }
329+
override fun seekTo(position: Milliseconds) = doIfPlaybackReady { controls, _ ->
330+
// Add a shift constant to all seeks originating from the client application
331+
// as opposed to system originated, such as from notification
332+
controls.seekTo(position.longValue + Constants.AUDIO_POSITION_SHIFT_IN_MS)
333+
}
330334

331335
override fun seekWithinChapter(percent: Int) {
332336
val position = stateProvider.currentState.positionFromChapterPercent(percent)

Armadillo/src/main/java/com/scribd/armadillo/Constants.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ object Constants {
1414

1515
internal const val MAX_PARALLEL_DOWNLOADS = 6
1616

17+
// an arbitrarily long constant to add to seek positions from app UI
18+
internal const val AUDIO_POSITION_SHIFT_IN_MS = 5000000000L
19+
1720
/**
1821
* A seek to previousChapter command beyond this will restart the current media source instead of skipping to the previousChapter media source
1922
*/

Armadillo/src/main/java/com/scribd/armadillo/playback/MediaSessionCallback.kt

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import android.view.KeyEvent
1212
import androidx.annotation.VisibleForTesting
1313
import com.scribd.armadillo.ArmadilloConfiguration
1414
import com.scribd.armadillo.Constants
15+
import com.scribd.armadillo.Constants.AUDIO_POSITION_SHIFT_IN_MS
1516
import com.scribd.armadillo.Milliseconds
1617
import com.scribd.armadillo.StateStore
1718
import com.scribd.armadillo.actions.CustomMediaSessionAction
@@ -184,8 +185,20 @@ internal class MediaSessionCallback(private val onMediaSessionEventListener: OnM
184185
}
185186

186187
override fun onSeekTo(posInMilis: Long) {
187-
playbackEngine?.seekTo(posInMilis.milliseconds)
188-
Log.v(TAG, "onSeekTo: $posInMilis")
188+
// if the shift has been added, then it must have originated from app UI, because we added it
189+
val absolutePosition = if (posInMilis >= AUDIO_POSITION_SHIFT_IN_MS) {
190+
posInMilis - AUDIO_POSITION_SHIFT_IN_MS // undo
191+
} else {
192+
// possibly from notification which sends position relative to chapter start
193+
// so, add chapter start time to make it absolute position
194+
val chapterStartTime = playbackInfo?.progress?.currentChapterIndex?.let { chapterIndex ->
195+
playbackInfo?.audioPlayable?.chapters?.getOrNull(chapterIndex)?.startTime?.longValue
196+
} ?: 0
197+
posInMilis + chapterStartTime
198+
}
199+
200+
playbackEngine?.seekTo(absolutePosition.milliseconds)
201+
Log.v(TAG, "onSeekTo: received $posInMilis, absolute $absolutePosition")
189202
}
190203

191204
override fun onCustomAction(action: String?, extras: Bundle?) {

0 commit comments

Comments
 (0)