From c4abf412507279431878639612c7d6e7c5c6f865 Mon Sep 17 00:00:00 2001 From: Daniel Freiling Date: Tue, 7 Oct 2025 13:50:08 +0200 Subject: [PATCH 1/2] fix(tts): add missing supported timeline command to TtsSessionAdapter without this command the session-adapter didn't properly report the current timeline to a media3.MediaSession --- .../readium/navigator/media/tts/session/TtsSessionAdapter.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/readium/navigators/media/tts/src/main/java/org/readium/navigator/media/tts/session/TtsSessionAdapter.kt b/readium/navigators/media/tts/src/main/java/org/readium/navigator/media/tts/session/TtsSessionAdapter.kt index 8ff52c20ce..f2c592efcd 100644 --- a/readium/navigators/media/tts/src/main/java/org/readium/navigator/media/tts/session/TtsSessionAdapter.kt +++ b/readium/navigators/media/tts/src/main/java/org/readium/navigator/media/tts/session/TtsSessionAdapter.kt @@ -157,7 +157,8 @@ internal class TtsSessionAdapter( COMMAND_SET_SPEED_AND_PITCH, COMMAND_GET_CURRENT_MEDIA_ITEM, COMMAND_GET_METADATA, - COMMAND_GET_TEXT + COMMAND_GET_TEXT, + COMMAND_GET_TIMELINE ).build() override fun getApplicationLooper(): Looper { From d8ee7dc07e2656ed1d6ba68027a5a815d144d85c Mon Sep 17 00:00:00 2001 From: Daniel Freiling Date: Fri, 31 Oct 2025 11:43:02 +0100 Subject: [PATCH 2/2] fix: make TtsSessionAdapter report a single-item timeline this ensures support for ForwardingSimpleBasePlayer and showing a Notification while playing, but without skip buttons --- .../media/tts/session/TtsSessionAdapter.kt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/readium/navigators/media/tts/src/main/java/org/readium/navigator/media/tts/session/TtsSessionAdapter.kt b/readium/navigators/media/tts/src/main/java/org/readium/navigator/media/tts/session/TtsSessionAdapter.kt index 83c3717493..201cf0d178 100644 --- a/readium/navigators/media/tts/src/main/java/org/readium/navigator/media/tts/session/TtsSessionAdapter.kt +++ b/readium/navigators/media/tts/src/main/java/org/readium/navigator/media/tts/session/TtsSessionAdapter.kt @@ -458,11 +458,16 @@ internal class TtsSessionAdapter( override fun getCurrentTimeline(): Timeline { // MediaNotificationManager requires a non-empty timeline to start foreground playing. - return TtsTimeline(mediaItems) + // Report a single-item timeline in order to show a notification, but without skip buttons. + return if (mediaItems.isNotEmpty()) { + TtsTimeline(listOf(mediaItems[currentMediaItemIndex])) + } else { + TtsTimeline(emptyList()) + } } override fun getCurrentPeriodIndex(): Int { - return ttsPlayer.utterance.value.position.resourceIndex + return 0 } @Deprecated("Deprecated in Java", ReplaceWith("currentMediaItemIndex")) @@ -471,7 +476,8 @@ internal class TtsSessionAdapter( } override fun getCurrentMediaItemIndex(): Int { - return ttsPlayer.utterance.value.position.resourceIndex + // Reporting a single-item timeline, so index is always 0. + return 0 } @Deprecated("Deprecated in Java", ReplaceWith("nextMediaItemIndex")) @@ -576,7 +582,7 @@ internal class TtsSessionAdapter( override fun isCurrentMediaItemLive(): Boolean { val timeline = currentTimeline - return !timeline.isEmpty && timeline.getWindow(currentMediaItemIndex, window).isLive() + return !timeline.isEmpty && timeline.getWindow(currentMediaItemIndex, window).isLive } override fun getCurrentLiveOffset(): Long {