From 6fcbf709509e431874d7ce7fa14f171946cb40b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Menu?= Date: Tue, 7 May 2024 18:02:24 +0200 Subject: [PATCH] Deprecate media1 and media2 navigators --- .../media2/DefaultMetadataFactory.kt | 1 - .../navigator/media2/ExoPlayerDataSource.kt | 3 ++ .../navigator/media2/MediaMetadataFactory.kt | 2 + .../navigator/media2/MediaNavigator.kt | 8 ++-- .../org/readium/navigator/media2/OptIn.kt | 22 --------- .../navigator/media2/SessionPlayerCallback.kt | 2 - .../navigator/media2/SessionPlayerFacade.kt | 2 - .../navigator/media2/SessionPlayerHelpers.kt | 7 --- .../readium/navigator/media2/SmartSeeker.kt | 2 - .../r2/navigator/DecorableNavigator.kt | 5 -- .../org/readium/r2/navigator/Deprecated.kt | 1 - .../java/org/readium/r2/navigator/OptIn.kt | 46 ------------------- .../readium/r2/navigator/R2BasicWebView.kt | 2 +- .../r2/navigator/epub/EpubNavigatorFactory.kt | 2 - .../navigator/epub/EpubNavigatorFragment.kt | 3 +- .../navigator/epub/EpubNavigatorViewModel.kt | 2 +- .../navigator/epub/extensions/Decoration.kt | 3 -- .../navigator/html/HtmlDecorationTemplate.kt | 3 -- .../r2/navigator/media/ExoMediaPlayer.kt | 4 +- .../r2/navigator/media/MediaPlayback.kt | 4 +- .../readium/r2/navigator/media/MediaPlayer.kt | 4 +- .../r2/navigator/media/MediaService.kt | 8 ++-- .../navigator/media/MediaSessionNavigator.kt | 9 ++-- .../r2/navigator/media/PendingMedia.kt | 4 +- .../media/extensions/MediaControllerCompat.kt | 4 +- .../media/extensions/MediaSessionCompat.kt | 4 +- .../media/extensions/PlaybackStateCompat.kt | 4 +- .../readium/r2/navigator/DecorationTest.kt | 1 - .../r2/testapp/reader/EpubReaderFragment.kt | 5 +- .../r2/testapp/reader/ReaderViewModel.kt | 6 +-- .../r2/testapp/reader/VisualReaderFragment.kt | 5 +- 31 files changed, 41 insertions(+), 137 deletions(-) delete mode 100644 readium/navigator-media2/src/main/java/org/readium/navigator/media2/OptIn.kt delete mode 100644 readium/navigator/src/main/java/org/readium/r2/navigator/OptIn.kt diff --git a/readium/navigator-media2/src/main/java/org/readium/navigator/media2/DefaultMetadataFactory.kt b/readium/navigator-media2/src/main/java/org/readium/navigator/media2/DefaultMetadataFactory.kt index 40ed10435a..39821ff63b 100644 --- a/readium/navigator-media2/src/main/java/org/readium/navigator/media2/DefaultMetadataFactory.kt +++ b/readium/navigator-media2/src/main/java/org/readium/navigator/media2/DefaultMetadataFactory.kt @@ -12,7 +12,6 @@ import org.readium.r2.shared.publication.Publication import org.readium.r2.shared.publication.services.cover @Suppress("DEPRECATION") -@ExperimentalMedia2 internal class DefaultMetadataFactory(private val publication: Publication) : MediaMetadataFactory { private val coroutineScope = diff --git a/readium/navigator-media2/src/main/java/org/readium/navigator/media2/ExoPlayerDataSource.kt b/readium/navigator-media2/src/main/java/org/readium/navigator/media2/ExoPlayerDataSource.kt index 12807146f0..4f6faed80c 100644 --- a/readium/navigator-media2/src/main/java/org/readium/navigator/media2/ExoPlayerDataSource.kt +++ b/readium/navigator-media2/src/main/java/org/readium/navigator/media2/ExoPlayerDataSource.kt @@ -18,6 +18,7 @@ import com.google.android.exoplayer2.upstream.DataSpec import com.google.android.exoplayer2.upstream.TransferListener import java.io.IOException import kotlinx.coroutines.runBlocking +import org.readium.r2.shared.InternalReadiumApi import org.readium.r2.shared.publication.Publication import org.readium.r2.shared.util.data.ReadException import org.readium.r2.shared.util.getOrThrow @@ -25,6 +26,7 @@ import org.readium.r2.shared.util.resource.Resource import org.readium.r2.shared.util.resource.buffered import org.readium.r2.shared.util.toUrl +@InternalReadiumApi public sealed class ExoPlayerDataSourceException(message: String, cause: Throwable?) : IOException( message, cause @@ -40,6 +42,7 @@ public sealed class ExoPlayerDataSourceException(message: String, cause: Throwab /** * An ExoPlayer's [DataSource] which retrieves resources from a [Publication]. */ +@InternalReadiumApi public class ExoPlayerDataSource internal constructor(private val publication: Publication) : BaseDataSource(/* isNetwork = */ true ) { diff --git a/readium/navigator-media2/src/main/java/org/readium/navigator/media2/MediaMetadataFactory.kt b/readium/navigator-media2/src/main/java/org/readium/navigator/media2/MediaMetadataFactory.kt index 0149ef1bba..caef82f409 100644 --- a/readium/navigator-media2/src/main/java/org/readium/navigator/media2/MediaMetadataFactory.kt +++ b/readium/navigator-media2/src/main/java/org/readium/navigator/media2/MediaMetadataFactory.kt @@ -3,6 +3,7 @@ package org.readium.navigator.media2 import androidx.media2.common.MediaMetadata +import org.readium.r2.shared.InternalReadiumApi /** * Factory for the [MediaMetadata] associated with the publication and its resources. @@ -10,6 +11,7 @@ import androidx.media2.common.MediaMetadata * The metadata are used for example in the media-style Android notification. */ @Deprecated("Use the new MediaMetadataFactory from the readium-navigator-media-common module.") +@InternalReadiumApi public interface MediaMetadataFactory { /** diff --git a/readium/navigator-media2/src/main/java/org/readium/navigator/media2/MediaNavigator.kt b/readium/navigator-media2/src/main/java/org/readium/navigator/media2/MediaNavigator.kt index b0d949547d..4a56feb1ae 100644 --- a/readium/navigator-media2/src/main/java/org/readium/navigator/media2/MediaNavigator.kt +++ b/readium/navigator-media2/src/main/java/org/readium/navigator/media2/MediaNavigator.kt @@ -36,6 +36,7 @@ import org.readium.navigator.media2.MediaNavigator.Companion.create import org.readium.r2.navigator.Navigator import org.readium.r2.navigator.extensions.normalizeLocator import org.readium.r2.shared.DelicateReadiumApi +import org.readium.r2.shared.InternalReadiumApi import org.readium.r2.shared.publication.Link import org.readium.r2.shared.publication.Locator import org.readium.r2.shared.publication.Publication @@ -55,8 +56,10 @@ import timber.log.Timber * providing [create] with it. If you don't, ExoPlayer will be used, without cache. * You can build your own [SessionPlayer] based on [ExoPlayer] using [ExoPlayerDataSource]. */ -@ExperimentalMedia2 -@Deprecated("Use the new AudioNavigator from the readium-navigator-media-audio module.") +@Deprecated( + "Use the new AudioNavigator from the readium-navigator-media-audio module. This class will be removed in a future 3.x release." +) +@InternalReadiumApi @OptIn(ExperimentalTime::class) public class MediaNavigator private constructor( public val publication: Publication, @@ -393,7 +396,6 @@ public class MediaNavigator private constructor( return true } - @ExperimentalMedia2 public companion object { public suspend fun create( diff --git a/readium/navigator-media2/src/main/java/org/readium/navigator/media2/OptIn.kt b/readium/navigator-media2/src/main/java/org/readium/navigator/media2/OptIn.kt deleted file mode 100644 index cb209b8ed3..0000000000 --- a/readium/navigator-media2/src/main/java/org/readium/navigator/media2/OptIn.kt +++ /dev/null @@ -1,22 +0,0 @@ -// ktlint-disable filename - -/* - * Copyright 2022 Readium Foundation. All rights reserved. - * Use of this source code is governed by the BSD-style license - * available in the top-level LICENSE file of the project. - */ - -package org.readium.navigator.media2 - -@RequiresOptIn( - level = RequiresOptIn.Level.WARNING, - message = "The new Audiobook navigator is still experimental. The API may be changed in the future without notice." -) -@Retention(AnnotationRetention.BINARY) -@Target( - AnnotationTarget.CLASS, - AnnotationTarget.FUNCTION, - AnnotationTarget.TYPEALIAS, - AnnotationTarget.PROPERTY -) -public annotation class ExperimentalMedia2 diff --git a/readium/navigator-media2/src/main/java/org/readium/navigator/media2/SessionPlayerCallback.kt b/readium/navigator-media2/src/main/java/org/readium/navigator/media2/SessionPlayerCallback.kt index 665004a43f..d1165fb6ff 100644 --- a/readium/navigator-media2/src/main/java/org/readium/navigator/media2/SessionPlayerCallback.kt +++ b/readium/navigator-media2/src/main/java/org/readium/navigator/media2/SessionPlayerCallback.kt @@ -12,14 +12,12 @@ import androidx.media2.common.MediaItem import androidx.media2.common.MediaMetadata import androidx.media2.common.SessionPlayer import kotlin.time.Duration -import kotlin.time.ExperimentalTime import kotlinx.coroutines.* import kotlinx.coroutines.channels.SendChannel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import timber.log.Timber -@OptIn(ExperimentalTime::class) internal class SessionPlayerCallback( private val positionRefreshDelay: Duration, private val seekCompletedSender: SendChannel diff --git a/readium/navigator-media2/src/main/java/org/readium/navigator/media2/SessionPlayerFacade.kt b/readium/navigator-media2/src/main/java/org/readium/navigator/media2/SessionPlayerFacade.kt index d768e7eff7..d0e92efb8e 100644 --- a/readium/navigator-media2/src/main/java/org/readium/navigator/media2/SessionPlayerFacade.kt +++ b/readium/navigator-media2/src/main/java/org/readium/navigator/media2/SessionPlayerFacade.kt @@ -20,7 +20,6 @@ import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds -import kotlin.time.ExperimentalTime import kotlinx.coroutines.MainScope import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.channels.ReceiveChannel @@ -42,7 +41,6 @@ import timber.log.Timber * - in case of failure, the playback can be left in an intermediate state * - the behaviour is undefined if any external controller takes actions at the same time */ -@OptIn(ExperimentalTime::class) internal class SessionPlayerFacade( private val sessionPlayer: SessionPlayer, private val seekCompletedReceiver: ReceiveChannel, diff --git a/readium/navigator-media2/src/main/java/org/readium/navigator/media2/SessionPlayerHelpers.kt b/readium/navigator-media2/src/main/java/org/readium/navigator/media2/SessionPlayerHelpers.kt index 62f319e04e..bf10d6c712 100644 --- a/readium/navigator-media2/src/main/java/org/readium/navigator/media2/SessionPlayerHelpers.kt +++ b/readium/navigator-media2/src/main/java/org/readium/navigator/media2/SessionPlayerHelpers.kt @@ -137,19 +137,15 @@ internal val SessionPlayer.playbackSpeedNullable internal val SessionPlayer.currentIndexNullable get() = currentMediaItemIndex.takeUnless { it == SessionPlayer.INVALID_ITEM_INDEX } -@ExperimentalTime internal val SessionPlayer.currentPositionDuration: Duration? get() = msToDuration(currentPosition) -@ExperimentalTime internal val SessionPlayer.bufferedPositionDuration: Duration? get() = msToDuration(bufferedPosition) -@ExperimentalTime internal val SessionPlayer.currentDuration: Duration? get() = msToDuration(duration) -@ExperimentalTime private fun msToDuration(ms: Long): Duration? = if (ms == SessionPlayer.UNKNOWN_TIME) { null @@ -157,19 +153,16 @@ private fun msToDuration(ms: Long): Duration? = ms.milliseconds } -@ExperimentalTime internal val MediaMetadata.duration: Duration? get() = getLong(MediaMetadata.METADATA_KEY_DURATION) .takeUnless { it == 0L } ?.milliseconds -@ExperimentalTime internal val List.durations: List? get() { val durations = mapNotNull { it.duration } return durations.takeIf { it.size == this.size } } -@ExperimentalTime internal val List.metadata: List get() = map { it.metadata!! } diff --git a/readium/navigator-media2/src/main/java/org/readium/navigator/media2/SmartSeeker.kt b/readium/navigator-media2/src/main/java/org/readium/navigator/media2/SmartSeeker.kt index f399f4cae3..9e6af45267 100644 --- a/readium/navigator-media2/src/main/java/org/readium/navigator/media2/SmartSeeker.kt +++ b/readium/navigator-media2/src/main/java/org/readium/navigator/media2/SmartSeeker.kt @@ -7,12 +7,10 @@ package org.readium.navigator.media2 import kotlin.time.Duration -import kotlin.time.ExperimentalTime /** * Computes relative seeks across playlist items. */ -@ExperimentalTime internal object SmartSeeker { data class Result(val index: Int, val position: Duration) diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/DecorableNavigator.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/DecorableNavigator.kt index b49146ef80..d971cb4c2d 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/DecorableNavigator.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/DecorableNavigator.kt @@ -26,7 +26,6 @@ import org.readium.r2.shared.util.Url /** * A navigator able to render arbitrary decorations over a publication. */ -@ExperimentalDecorator public interface DecorableNavigator : Navigator { /** * Declares the current state of the decorations in the given decoration [group]. @@ -98,7 +97,6 @@ public interface DecorableNavigator : Navigator { * @param extras Additional context data specific to a reading app. Readium does not use it. */ @Parcelize -@ExperimentalDecorator public data class Decoration( val id: DecorationId, val locator: Locator, @@ -145,11 +143,9 @@ public data class Decoration( } /** Unique identifier for a decoration. */ -@ExperimentalDecorator public typealias DecorationId = String /** Represents an atomic change in a list of [Decoration] objects. */ -@ExperimentalDecorator public sealed class DecorationChange { public data class Added(val decoration: Decoration) : DecorationChange() public data class Updated(val decoration: Decoration) : DecorationChange() @@ -162,7 +158,6 @@ public sealed class DecorationChange { * * The changes need to be applied in the same order, one by one. */ -@ExperimentalDecorator public suspend fun List.changesByHref(target: List): Map> = withContext( Dispatchers.Default ) { diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/Deprecated.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/Deprecated.kt index 0f5af43f63..0288affda4 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/Deprecated.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/Deprecated.kt @@ -25,7 +25,6 @@ public interface IR2TTS * A navigator rendering an audio or video publication. */ @Deprecated("Use the new readium-navigator-media modules.") -@OptIn(ExperimentalAudiobook::class) public interface MediaNavigator : Navigator { /** diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/OptIn.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/OptIn.kt deleted file mode 100644 index f0b7e67406..0000000000 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/OptIn.kt +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2021 Readium Foundation. All rights reserved. - * Use of this source code is governed by the BSD-style license - * available in the top-level LICENSE file of the project. - */ - -package org.readium.r2.navigator - -@RequiresOptIn( - level = RequiresOptIn.Level.WARNING, - message = "Support for the Decorator API is still experimental. The API may be changed in the future without notice." -) -@Retention(AnnotationRetention.BINARY) -@Target( - AnnotationTarget.CLASS, - AnnotationTarget.FUNCTION, - AnnotationTarget.TYPEALIAS, - AnnotationTarget.PROPERTY -) -public annotation class ExperimentalDecorator - -@RequiresOptIn( - level = RequiresOptIn.Level.WARNING, - message = "The new Audiobook navigator is still experimental. The API may be changed in the future without notice." -) -@Retention(AnnotationRetention.BINARY) -@Target( - AnnotationTarget.CLASS, - AnnotationTarget.FUNCTION, - AnnotationTarget.TYPEALIAS, - AnnotationTarget.PROPERTY -) -public annotation class ExperimentalAudiobook - -@RequiresOptIn( - level = RequiresOptIn.Level.WARNING, - message = "The new dragging gesture is still experimental. The API may be changed in the future without notice." -) -@Retention(AnnotationRetention.BINARY) -@Target( - AnnotationTarget.CLASS, - AnnotationTarget.FUNCTION, - AnnotationTarget.TYPEALIAS, - AnnotationTarget.PROPERTY -) -public annotation class ExperimentalDragGesture diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/R2BasicWebView.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/R2BasicWebView.kt index 8cb00d80b0..2bc6233504 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/R2BasicWebView.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/R2BasicWebView.kt @@ -49,7 +49,7 @@ import org.readium.r2.shared.util.toUrl import org.readium.r2.shared.util.use import timber.log.Timber -@OptIn(ExperimentalDecorator::class, ExperimentalReadiumApi::class) +@OptIn(ExperimentalReadiumApi::class) internal open class R2BasicWebView(context: Context, attrs: AttributeSet) : WebView(context, attrs) { interface Listener { diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorFactory.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorFactory.kt index 3d909a2310..359ce0e90d 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorFactory.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorFactory.kt @@ -7,7 +7,6 @@ package org.readium.r2.navigator.epub import androidx.fragment.app.FragmentFactory -import org.readium.r2.navigator.ExperimentalDecorator import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.Link import org.readium.r2.shared.publication.Locator @@ -52,7 +51,6 @@ public class EpubNavigatorFactory( * pagination. * @param configuration Additional configuration. */ - @OptIn(ExperimentalDecorator::class) public fun createFragmentFactory( initialLocator: Locator?, readingOrder: List? = null, diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorFragment.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorFragment.kt index 4c6f60d0a1..f9fcad84da 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorFragment.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorFragment.kt @@ -45,7 +45,6 @@ import org.json.JSONObject import org.readium.r2.navigator.DecorableNavigator import org.readium.r2.navigator.Decoration import org.readium.r2.navigator.DecorationId -import org.readium.r2.navigator.ExperimentalDecorator import org.readium.r2.navigator.HyperlinkNavigator import org.readium.r2.navigator.NavigatorFragment import org.readium.r2.navigator.OverflowableNavigator @@ -108,7 +107,7 @@ public typealias JavascriptInterfaceFactory = (resource: Link) -> Any? * * To use this [Fragment], create a factory with `EpubNavigatorFragment.createFactory()`. */ -@OptIn(ExperimentalDecorator::class, ExperimentalReadiumApi::class, DelicateReadiumApi::class) +@OptIn(ExperimentalReadiumApi::class, DelicateReadiumApi::class) public class EpubNavigatorFragment internal constructor( publication: Publication, private val initialLocator: Locator?, diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorViewModel.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorViewModel.kt index 5773f943b6..3366ac77b0 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorViewModel.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorViewModel.kt @@ -41,7 +41,7 @@ internal enum class DualPage { AUTO, OFF, ON } -@OptIn(ExperimentalReadiumApi::class, ExperimentalDecorator::class, DelicateReadiumApi::class) +@OptIn(ExperimentalReadiumApi::class, DelicateReadiumApi::class) internal class EpubNavigatorViewModel( application: Application, val publication: Publication, diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/extensions/Decoration.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/extensions/Decoration.kt index 5936d4fb01..6c428e4d75 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/extensions/Decoration.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/extensions/Decoration.kt @@ -9,7 +9,6 @@ package org.readium.r2.navigator.epub.extensions import org.json.JSONObject import org.readium.r2.navigator.Decoration import org.readium.r2.navigator.DecorationChange -import org.readium.r2.navigator.ExperimentalDecorator import org.readium.r2.navigator.html.HtmlDecorationTemplates import timber.log.Timber @@ -18,7 +17,6 @@ import timber.log.Timber /** * Generates the JavaScript used to apply the receiver list of [DecorationChange] in a web view. */ -@ExperimentalDecorator internal fun List.javascriptForGroup( group: String, templates: HtmlDecorationTemplates @@ -38,7 +36,6 @@ internal fun List.javascriptForGroup( /** * Generates the JavaScript used to apply the receiver [DecorationChange] in a web view. */ -@ExperimentalDecorator internal fun DecorationChange.javascript(templates: HtmlDecorationTemplates): String? { fun toJSON(decoration: Decoration): JSONObject? { val template = templates[decoration.style::class] ?: run { diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/html/HtmlDecorationTemplate.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/html/HtmlDecorationTemplate.kt index e3600596b6..7ef9d62682 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/html/HtmlDecorationTemplate.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/html/HtmlDecorationTemplate.kt @@ -14,7 +14,6 @@ import kotlinx.parcelize.Parcelize import org.json.JSONObject import org.readium.r2.navigator.Decoration import org.readium.r2.navigator.Decoration.Style -import org.readium.r2.navigator.ExperimentalDecorator import org.readium.r2.shared.JSONable /** @@ -36,7 +35,6 @@ import org.readium.r2.shared.JSONable * and IDs to avoid conflicts with the HTML resource itself. Best practice is to prefix with * your app name. r2- and readium- are reserved by the Readium toolkit. */ -@ExperimentalDecorator public data class HtmlDecorationTemplate( val layout: Layout, val width: Width = Width.WRAP, @@ -168,7 +166,6 @@ public data class HtmlDecorationTemplate( } } -@ExperimentalDecorator public class HtmlDecorationTemplates private constructor( internal val styles: MutableMap, HtmlDecorationTemplate> = mutableMapOf() ) : JSONable { diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/media/ExoMediaPlayer.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/media/ExoMediaPlayer.kt index 9ca55d6450..d1440c5159 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/media/ExoMediaPlayer.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/media/ExoMediaPlayer.kt @@ -42,9 +42,9 @@ import kotlinx.coroutines.MainScope import kotlinx.coroutines.async import kotlinx.coroutines.cancel import kotlinx.coroutines.launch -import org.readium.r2.navigator.ExperimentalAudiobook import org.readium.r2.navigator.R import org.readium.r2.navigator.extensions.timeWithDuration +import org.readium.r2.shared.InternalReadiumApi import org.readium.r2.shared.extensions.findInstance import org.readium.r2.shared.publication.Link import org.readium.r2.shared.publication.Locator @@ -59,7 +59,7 @@ import timber.log.Timber /** * An implementation of [MediaPlayer] using ExoPlayer. */ -@ExperimentalAudiobook +@InternalReadiumApi public class ExoMediaPlayer( context: Context, mediaSession: MediaSessionCompat, diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/media/MediaPlayback.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/media/MediaPlayback.kt index d242310e91..80d9d1bb36 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/media/MediaPlayback.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/media/MediaPlayback.kt @@ -7,7 +7,7 @@ package org.readium.r2.navigator.media import kotlin.time.Duration -import org.readium.r2.navigator.ExperimentalAudiobook +import org.readium.r2.shared.InternalReadiumApi /** * State of the playback at a point in time. @@ -16,7 +16,7 @@ import org.readium.r2.navigator.ExperimentalAudiobook * @param rate Speed of the playback, defaults to 1.0. * @param timeline Position and duration of the current resource. */ -@ExperimentalAudiobook +@InternalReadiumApi public data class MediaPlayback(val state: State, val rate: Double, val timeline: Timeline) { public enum class State { diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/media/MediaPlayer.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/media/MediaPlayer.kt index 320fa79e6c..f9c66bb7e4 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/media/MediaPlayer.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/media/MediaPlayer.kt @@ -10,7 +10,7 @@ import android.app.Notification import android.graphics.Bitmap import android.os.Bundle import android.os.ResultReceiver -import org.readium.r2.navigator.ExperimentalAudiobook +import org.readium.r2.shared.InternalReadiumApi import org.readium.r2.shared.publication.Link import org.readium.r2.shared.publication.Locator import org.readium.r2.shared.publication.Publication @@ -25,7 +25,7 @@ import org.readium.r2.shared.util.data.ReadError * [MediaService], implementers MUST map a location in the [Publication] to a media ID * `publicationId#resourceHref` with a [Locator] as a `locator` extra field. */ -@ExperimentalAudiobook +@InternalReadiumApi public interface MediaPlayer { public data class NotificationMetadata( diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/media/MediaService.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/media/MediaService.kt index 2ffc585458..9a110d442c 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/media/MediaService.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/media/MediaService.kt @@ -26,10 +26,10 @@ import kotlin.reflect.KMutableProperty0 import kotlinx.coroutines.* import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.* -import org.readium.r2.navigator.ExperimentalAudiobook import org.readium.r2.navigator.extensions.let import org.readium.r2.navigator.extensions.splitAt import org.readium.r2.navigator.media.extensions.publicationId +import org.readium.r2.shared.InternalReadiumApi import org.readium.r2.shared.publication.Link import org.readium.r2.shared.publication.Locator import org.readium.r2.shared.publication.Publication @@ -47,9 +47,11 @@ import timber.log.Timber * * See https://developer.android.com/guide/topics/media-apps/audio-app/building-a-mediabrowserservice */ -@ExperimentalAudiobook @OptIn(ExperimentalCoroutinesApi::class) -@Deprecated("Use the new AudioNavigator from the readium-navigator-media-audio module.") +@Deprecated( + "Use the new AudioNavigator from the readium-navigator-media-audio module. This class will be removed in a future 3.x release." +) +@InternalReadiumApi public open class MediaService : MediaBrowserServiceCompat(), CoroutineScope by MainScope() { /** diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/media/MediaSessionNavigator.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/media/MediaSessionNavigator.kt index af8578395c..f90213cdc6 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/media/MediaSessionNavigator.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/media/MediaSessionNavigator.kt @@ -20,7 +20,6 @@ import kotlin.time.Duration.Companion.seconds import kotlin.time.ExperimentalTime import kotlinx.coroutines.* import kotlinx.coroutines.flow.* -import org.readium.r2.navigator.ExperimentalAudiobook import org.readium.r2.navigator.MediaNavigator import org.readium.r2.navigator.extensions.normalizeLocator import org.readium.r2.navigator.extensions.sum @@ -31,6 +30,7 @@ import org.readium.r2.navigator.media.extensions.publicationId import org.readium.r2.navigator.media.extensions.resourceHref import org.readium.r2.navigator.media.extensions.toPlaybackState import org.readium.r2.shared.DelicateReadiumApi +import org.readium.r2.shared.InternalReadiumApi import org.readium.r2.shared.publication.* import org.readium.r2.shared.util.Url import org.readium.r2.shared.util.mediatype.MediaType @@ -47,8 +47,11 @@ private val skipBackwardInterval: Duration = 30.seconds /** * An implementation of [MediaNavigator] using an Android's MediaSession compatible media player. */ -@Deprecated("Use the new AudioNavigator from the readium-navigator-media-audio module.") -@OptIn(ExperimentalTime::class, ExperimentalAudiobook::class) +@Deprecated( + "Use the new AudioNavigator from the readium-navigator-media-audio module. This class will be removed in a future 3.x release." +) +@InternalReadiumApi +@OptIn(ExperimentalTime::class) public class MediaSessionNavigator( public val publication: Publication, public val publicationId: PublicationId, diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/media/PendingMedia.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/media/PendingMedia.kt index da036017d2..a53425c20a 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/media/PendingMedia.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/media/PendingMedia.kt @@ -6,7 +6,7 @@ package org.readium.r2.navigator.media -import org.readium.r2.navigator.ExperimentalAudiobook +import org.readium.r2.shared.InternalReadiumApi import org.readium.r2.shared.publication.Locator import org.readium.r2.shared.publication.Publication import org.readium.r2.shared.publication.PublicationId @@ -14,7 +14,7 @@ import org.readium.r2.shared.publication.PublicationId /** * Holds information about a media-based [publication] waiting to be rendered by a [MediaPlayer]. */ -@ExperimentalAudiobook +@InternalReadiumApi public data class PendingMedia( val publication: Publication, val publicationId: PublicationId, diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/media/extensions/MediaControllerCompat.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/media/extensions/MediaControllerCompat.kt index ec7723fe1f..cc3539567a 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/media/extensions/MediaControllerCompat.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/media/extensions/MediaControllerCompat.kt @@ -9,10 +9,10 @@ package org.readium.r2.navigator.media.extensions import android.support.v4.media.session.MediaControllerCompat -import org.readium.r2.navigator.ExperimentalAudiobook import org.readium.r2.navigator.media.MediaService +import org.readium.r2.shared.InternalReadiumApi import org.readium.r2.shared.publication.PublicationId -@ExperimentalAudiobook +@InternalReadiumApi internal val MediaControllerCompat.publicationId: PublicationId? get() = extras?.getString(MediaService.EXTRA_PUBLICATION_ID) diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/media/extensions/MediaSessionCompat.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/media/extensions/MediaSessionCompat.kt index 7ddee9864a..ec54d505b5 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/media/extensions/MediaSessionCompat.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/media/extensions/MediaSessionCompat.kt @@ -10,11 +10,11 @@ package org.readium.r2.navigator.media.extensions import android.os.Bundle import android.support.v4.media.session.MediaSessionCompat -import org.readium.r2.navigator.ExperimentalAudiobook import org.readium.r2.navigator.media.MediaService +import org.readium.r2.shared.InternalReadiumApi import org.readium.r2.shared.publication.PublicationId -@ExperimentalAudiobook +@InternalReadiumApi internal var MediaSessionCompat.publicationId: PublicationId? get() = controller.publicationId set(value) { diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/media/extensions/PlaybackStateCompat.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/media/extensions/PlaybackStateCompat.kt index dc4f9db22c..d56c2be08b 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/media/extensions/PlaybackStateCompat.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/media/extensions/PlaybackStateCompat.kt @@ -8,8 +8,8 @@ package org.readium.r2.navigator.media.extensions import android.os.SystemClock import android.support.v4.media.session.PlaybackStateCompat -import org.readium.r2.navigator.ExperimentalAudiobook import org.readium.r2.navigator.media.MediaPlayback +import org.readium.r2.shared.InternalReadiumApi internal inline val PlaybackStateCompat.isPrepared get() = (state == PlaybackStateCompat.STATE_BUFFERING) || @@ -36,7 +36,7 @@ internal inline val PlaybackStateCompat.elapsedPosition: Long get() = position } -@ExperimentalAudiobook +@InternalReadiumApi internal fun PlaybackStateCompat.toPlaybackState(): MediaPlayback.State = when (state) { PlaybackStateCompat.STATE_BUFFERING, PlaybackStateCompat.STATE_CONNECTING, diff --git a/readium/navigator/src/test/java/org/readium/r2/navigator/DecorationTest.kt b/readium/navigator/src/test/java/org/readium/r2/navigator/DecorationTest.kt index ee32a5595e..64aede1576 100644 --- a/readium/navigator/src/test/java/org/readium/r2/navigator/DecorationTest.kt +++ b/readium/navigator/src/test/java/org/readium/r2/navigator/DecorationTest.kt @@ -10,7 +10,6 @@ import org.readium.r2.shared.util.Url import org.readium.r2.shared.util.mediatype.MediaType import org.robolectric.RobolectricTestRunner -@OptIn(ExperimentalDecorator::class) @RunWith(RobolectricTestRunner::class) class DecorationTest { diff --git a/test-app/src/main/java/org/readium/r2/testapp/reader/EpubReaderFragment.kt b/test-app/src/main/java/org/readium/r2/testapp/reader/EpubReaderFragment.kt index 8c203d33a3..fb905fc393 100644 --- a/test-app/src/main/java/org/readium/r2/testapp/reader/EpubReaderFragment.kt +++ b/test-app/src/main/java/org/readium/r2/testapp/reader/EpubReaderFragment.kt @@ -26,7 +26,6 @@ import androidx.lifecycle.repeatOnLifecycle import kotlinx.coroutines.launch import org.readium.r2.navigator.DecorableNavigator import org.readium.r2.navigator.Decoration -import org.readium.r2.navigator.ExperimentalDecorator import org.readium.r2.navigator.epub.* import org.readium.r2.navigator.epub.css.FontStyle import org.readium.r2.navigator.html.HtmlDecorationTemplate @@ -40,7 +39,7 @@ import org.readium.r2.testapp.R import org.readium.r2.testapp.reader.preferences.UserPreferencesViewModel import org.readium.r2.testapp.search.SearchFragment -@OptIn(ExperimentalReadiumApi::class, ExperimentalDecorator::class) +@OptIn(ExperimentalReadiumApi::class) class EpubReaderFragment : VisualReaderFragment() { override lateinit var navigator: EpubNavigatorFragment @@ -293,7 +292,6 @@ class EpubReaderFragment : VisualReaderFragment() { * * Note that the icon is served from the app assets folder. */ -@OptIn(ExperimentalDecorator::class) private fun annotationMarkTemplate(@ColorInt defaultTint: Int = Color.YELLOW): HtmlDecorationTemplate { val className = "testapp-annotation-mark" val iconUrl = checkNotNull(EpubNavigatorFragment.assetUrl("annotation-icon.svg")) @@ -330,7 +328,6 @@ private fun annotationMarkTemplate(@ColorInt defaultTint: Int = Color.YELLOW): H * * See http://kb.daisy.org/publishing/docs/navigation/pagelist.html */ -@OptIn(ExperimentalDecorator::class) private fun pageNumberTemplate(): HtmlDecorationTemplate { val className = "testapp-page-number" return HtmlDecorationTemplate( diff --git a/test-app/src/main/java/org/readium/r2/testapp/reader/ReaderViewModel.kt b/test-app/src/main/java/org/readium/r2/testapp/reader/ReaderViewModel.kt index cf8bb34e19..bffd025e65 100644 --- a/test-app/src/main/java/org/readium/r2/testapp/reader/ReaderViewModel.kt +++ b/test-app/src/main/java/org/readium/r2/testapp/reader/ReaderViewModel.kt @@ -25,7 +25,6 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import org.readium.r2.navigator.Decoration -import org.readium.r2.navigator.ExperimentalDecorator import org.readium.r2.navigator.HyperlinkNavigator import org.readium.r2.navigator.epub.EpubNavigatorFragment import org.readium.r2.navigator.image.ImageNavigatorFragment @@ -56,10 +55,7 @@ import org.readium.r2.testapp.utils.createViewModelFactory import org.readium.r2.testapp.utils.extensions.toHtml import timber.log.Timber -@OptIn( - ExperimentalDecorator::class, - ExperimentalReadiumApi::class -) +@OptIn(ExperimentalReadiumApi::class) class ReaderViewModel( private val bookId: Long, private val readerRepository: ReaderRepository, diff --git a/test-app/src/main/java/org/readium/r2/testapp/reader/VisualReaderFragment.kt b/test-app/src/main/java/org/readium/r2/testapp/reader/VisualReaderFragment.kt index 30e4ef9437..a270d026a6 100644 --- a/test-app/src/main/java/org/readium/r2/testapp/reader/VisualReaderFragment.kt +++ b/test-app/src/main/java/org/readium/r2/testapp/reader/VisualReaderFragment.kt @@ -59,7 +59,6 @@ import kotlinx.parcelize.Parcelize import org.readium.navigator.media.tts.android.AndroidTtsEngine import org.readium.r2.navigator.DecorableNavigator import org.readium.r2.navigator.Decoration -import org.readium.r2.navigator.ExperimentalDecorator import org.readium.r2.navigator.OverflowableNavigator import org.readium.r2.navigator.SelectableNavigator import org.readium.r2.navigator.VisualNavigator @@ -91,7 +90,7 @@ import org.readium.r2.testapp.utils.viewLifecycle * * Provides common menu items and saves last location on stop. */ -@OptIn(ExperimentalDecorator::class, ExperimentalReadiumApi::class) +@OptIn(ExperimentalReadiumApi::class) abstract class VisualReaderFragment : BaseReaderFragment() { protected var binding: FragmentReaderBinding by viewLifecycle() @@ -642,7 +641,6 @@ abstract class VisualReaderFragment : BaseReaderFragment() { * This is an example of a custom Decoration Style declaration. */ @Parcelize -@OptIn(ExperimentalDecorator::class) data class DecorationStyleAnnotationMark(@ColorInt val tint: Int) : Decoration.Style /** @@ -653,5 +651,4 @@ data class DecorationStyleAnnotationMark(@ColorInt val tint: Int) : Decoration.S * @param label Page number label as declared in the `page-list` link object. */ @Parcelize -@OptIn(ExperimentalDecorator::class) data class DecorationStylePageNumber(val label: String) : Decoration.Style