Skip to content

Commit 1919591

Browse files
authored
Extract the Media3Adapter (#354)
1 parent 64e5c04 commit 1919591

File tree

7 files changed

+47
-23
lines changed

7 files changed

+47
-23
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.readium.r2.navigator.media3.api
2+
3+
import androidx.media3.common.Player
4+
import org.readium.r2.shared.ExperimentalReadiumApi
5+
6+
/**
7+
* An object able to pass as a Jetpack media3 [Player].
8+
*/
9+
@ExperimentalReadiumApi
10+
interface Media3Adapter {
11+
fun asMedia3Player(): Player
12+
}

readium/navigator/src/main/java/org/readium/r2/navigator/media3/api/MediaNavigator.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@ import org.readium.r2.shared.util.Href
1717
* A [Navigator] which can play multimedia content.
1818
*/
1919
@ExperimentalReadiumApi
20-
interface MediaNavigator<L : MediaNavigator.Location, P : MediaNavigator.Playback,
21-
R : MediaNavigator.ReadingOrder> : Navigator, Closeable {
20+
interface MediaNavigator<
21+
L : MediaNavigator.Location,
22+
P : MediaNavigator.Playback,
23+
R : MediaNavigator.ReadingOrder
24+
> : Navigator, Closeable {
2225

2326
/**
2427
* Location of the navigator.
@@ -115,9 +118,4 @@ interface MediaNavigator<L : MediaNavigator.Location, P : MediaNavigator.Playbac
115118
* Pauses the playback.
116119
*/
117120
fun pause()
118-
119-
/**
120-
* Adapts this navigator to the media3 [Player] interface.
121-
*/
122-
fun asPlayer(): Player
123121
}

readium/navigator/src/main/java/org/readium/r2/navigator/media3/api/TextAwareMediaNavigator.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@ import org.readium.r2.shared.publication.Locator
1414
* A [MediaNavigator] aware of the utterances being read aloud.
1515
*/
1616
@ExperimentalReadiumApi
17-
interface TextAwareMediaNavigator<L : TextAwareMediaNavigator.Location, P : TextAwareMediaNavigator.Playback,
18-
R : TextAwareMediaNavigator.ReadingOrder> : MediaNavigator<L, P, R> {
17+
interface TextAwareMediaNavigator<
18+
L : TextAwareMediaNavigator.Location,
19+
P : TextAwareMediaNavigator.Playback,
20+
R : TextAwareMediaNavigator.ReadingOrder
21+
> : MediaNavigator<L, P, R> {
1922

2023
/**
2124
* Location of the navigator.

readium/navigator/src/main/java/org/readium/r2/navigator/media3/audio/AudiobookNavigator.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import kotlinx.coroutines.flow.StateFlow
1717
import org.readium.r2.navigator.extensions.sum
1818
import org.readium.r2.navigator.extensions.time
1919
import org.readium.r2.navigator.media3.api.AudioNavigator
20+
import org.readium.r2.navigator.media3.api.Media3Adapter
2021
import org.readium.r2.navigator.media3.api.MediaNavigator
2122
import org.readium.r2.navigator.preferences.Configurable
2223
import org.readium.r2.shared.ExperimentalReadiumApi
@@ -33,7 +34,10 @@ class AudiobookNavigator<S : Configurable.Settings, P : Configurable.Preferences
3334
override val publication: Publication,
3435
private val audioEngine: AudioEngine<S, P>,
3536
override val readingOrder: ReadingOrder,
36-
) : AudioNavigator<AudiobookNavigator.Location, AudiobookNavigator.Playback, AudiobookNavigator.ReadingOrder>,
37+
) :
38+
MediaNavigator<AudiobookNavigator.Location, AudiobookNavigator.Playback, AudiobookNavigator.ReadingOrder>,
39+
AudioNavigator<AudiobookNavigator.Location, AudiobookNavigator.Playback, AudiobookNavigator.ReadingOrder>,
40+
Media3Adapter,
3741
Configurable<S, P> by audioEngine {
3842

3943
companion object {
@@ -188,9 +192,8 @@ class AudiobookNavigator<S : Configurable.Settings, P : Configurable.Preferences
188192
audioEngine.close()
189193
}
190194

191-
override fun asPlayer(): Player {
192-
return audioEngine.asPlayer()
193-
}
195+
override fun asMedia3Player(): Player =
196+
audioEngine.asPlayer()
194197

195198
override fun go(locator: Locator, animated: Boolean, completion: () -> Unit): Boolean {
196199
val itemIndex = readingOrder.items.indexOfFirst { it.href.string == locator.href }

readium/navigator/src/main/java/org/readium/r2/navigator/media3/syncmedia/GuidedAudioNavigator.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import androidx.media3.common.Player
1010
import kotlin.time.Duration
1111
import kotlinx.coroutines.flow.StateFlow
1212
import org.readium.r2.navigator.media3.api.AudioNavigator
13+
import org.readium.r2.navigator.media3.api.Media3Adapter
1314
import org.readium.r2.navigator.media3.api.MediaNavigator
1415
import org.readium.r2.navigator.media3.api.TextAwareMediaNavigator
1516
import org.readium.r2.navigator.media3.audio.AudiobookNavigator
@@ -23,8 +24,11 @@ import org.readium.r2.shared.util.Href
2324
@ExperimentalReadiumApi
2425
class GuidedAudioNavigator<S : Configurable.Settings, P : Configurable.Preferences<P>>(
2526
private val audioNavigator: AudiobookNavigator<S, P>,
26-
) : AudioNavigator<GuidedAudioNavigator.Location, GuidedAudioNavigator.Playback, GuidedAudioNavigator.ReadingOrder>,
27+
) :
28+
MediaNavigator<GuidedAudioNavigator.Location, GuidedAudioNavigator.Playback, GuidedAudioNavigator.ReadingOrder>,
29+
AudioNavigator<GuidedAudioNavigator.Location, GuidedAudioNavigator.Playback, GuidedAudioNavigator.ReadingOrder>,
2730
TextAwareMediaNavigator<GuidedAudioNavigator.Location, GuidedAudioNavigator.Playback, GuidedAudioNavigator.ReadingOrder>,
31+
Media3Adapter,
2832
Configurable<S, P> {
2933

3034
data class Location(
@@ -84,9 +88,8 @@ class GuidedAudioNavigator<S : Configurable.Settings, P : Configurable.Preferenc
8488
audioNavigator.pause()
8589
}
8690

87-
override fun asPlayer(): Player {
88-
return audioNavigator.asPlayer()
89-
}
91+
override fun asMedia3Player(): Player =
92+
audioNavigator.asMedia3Player()
9093

9194
override val settings: StateFlow<S> =
9295
audioNavigator.settings

readium/navigator/src/main/java/org/readium/r2/navigator/media3/tts/TtsNavigator.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import androidx.media3.common.Player
1313
import kotlinx.coroutines.CoroutineScope
1414
import kotlinx.coroutines.MainScope
1515
import kotlinx.coroutines.flow.StateFlow
16+
import org.readium.r2.navigator.media3.api.Media3Adapter
1617
import org.readium.r2.navigator.media3.api.MediaMetadataProvider
1718
import org.readium.r2.navigator.media3.api.MediaNavigator
1819
import org.readium.r2.navigator.media3.api.TextAwareMediaNavigator
@@ -39,7 +40,10 @@ class TtsNavigator<S : TtsEngine.Settings, P : TtsEngine.Preferences<P>,
3940
override val publication: Publication,
4041
private val player: TtsPlayer<S, P, E, V>,
4142
private val sessionAdapter: TtsSessionAdapter<E>,
42-
) : TextAwareMediaNavigator<TtsNavigator.Location, TtsNavigator.Playback, TtsNavigator.ReadingOrder>,
43+
) :
44+
MediaNavigator<TtsNavigator.Location, TtsNavigator.Playback, TtsNavigator.ReadingOrder>,
45+
TextAwareMediaNavigator<TtsNavigator.Location, TtsNavigator.Playback, TtsNavigator.ReadingOrder>,
46+
Media3Adapter,
4347
Configurable<S, P> by player {
4448

4549
companion object {
@@ -214,7 +218,7 @@ class TtsNavigator<S : TtsEngine.Settings, P : TtsEngine.Preferences<P>,
214218
return player.hasNextUtterance()
215219
}
216220

217-
override fun asPlayer(): Player =
221+
override fun asMedia3Player(): Player =
218222
sessionAdapter
219223

220224
override fun close() {

test-app/src/main/java/org/readium/r2/testapp/reader/MediaService.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import androidx.media3.session.MediaSession
1818
import androidx.media3.session.MediaSessionService
1919
import kotlinx.coroutines.*
2020
import kotlinx.coroutines.flow.*
21+
import org.readium.r2.navigator.media3.api.Media3Adapter
2122
import org.readium.r2.navigator.media3.api.MediaNavigator
2223
import org.readium.r2.shared.ExperimentalReadiumApi
2324
import timber.log.Timber
@@ -59,12 +60,12 @@ class MediaService : MediaSessionService() {
5960
sessionMutable.value = null
6061
}
6162

62-
fun openSession(
63-
navigator: AnyMediaNavigator,
63+
fun <N> openSession(
64+
navigator: N,
6465
bookId: Long
65-
) {
66+
) where N : AnyMediaNavigator, N : Media3Adapter {
6667
val activityIntent = createSessionActivityIntent()
67-
val mediaSession = MediaSession.Builder(applicationContext, navigator.asPlayer())
68+
val mediaSession = MediaSession.Builder(applicationContext, navigator.asMedia3Player())
6869
.setSessionActivity(activityIntent)
6970
.setId(bookId.toString())
7071
.build()

0 commit comments

Comments
 (0)