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 f92c7df883..ed95af994f 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 @@ -41,7 +41,17 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import org.json.JSONObject -import org.readium.r2.navigator.* +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.ExperimentalDragGesture +import org.readium.r2.navigator.NavigatorDelegate +import org.readium.r2.navigator.R +import org.readium.r2.navigator.R2BasicWebView +import org.readium.r2.navigator.SelectableNavigator +import org.readium.r2.navigator.Selection +import org.readium.r2.navigator.VisualNavigator import org.readium.r2.navigator.databinding.ActivityR2ViewpagerBinding import org.readium.r2.navigator.epub.EpubNavigatorViewModel.RunScriptCommand import org.readium.r2.navigator.epub.css.FontFamilyDeclaration @@ -59,6 +69,7 @@ import org.readium.r2.navigator.preferences.Configurable import org.readium.r2.navigator.preferences.FontFamily import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.navigator.util.createFragmentFactory +import org.readium.r2.shared.DelicateReadiumApi import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.extensions.tryOrLog import org.readium.r2.shared.fetcher.Resource @@ -154,7 +165,18 @@ class EpubNavigatorFragment internal constructor( */ val shouldApplyInsetsPadding: Boolean? = true, - internal val javascriptInterfaces: MutableMap = mutableMapOf() + internal val javascriptInterfaces: MutableMap = mutableMapOf(), + + /** + * Disable user selection if the publication is protected by a DRM (e.g. with LCP). + * + * WARNING: If you choose to disable this, you MUST remove the Copy and Share selection + * menu items in your app. Otherwise, you will void the EDRLab certification for your + * application. If you need help, follow up on: + * https://github.com/readium/kotlin-toolkit/issues/299#issuecomment-1315643577 + */ + @DelicateReadiumApi + val disableSelectionWhenProtected: Boolean = true ) { /** * Registers a new factory for the [JavascriptInterface] named [name]. 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 144f38e70b..f81d2ad2be 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 @@ -390,7 +390,11 @@ internal class EpubNavigatorViewModel( defaults = defaults, baseUrl = baseUrl, server = if (baseUrl != null) null - else WebViewServer(application, publication, servedAssets = config.servedAssets) + else WebViewServer( + application, publication, + servedAssets = config.servedAssets, + disableSelectionWhenProtected = config.disableSelectionWhenProtected + ) ) } } diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/HtmlInjector.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/HtmlInjector.kt index 254ceb1930..d93b172c4a 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/HtmlInjector.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/HtmlInjector.kt @@ -22,7 +22,12 @@ import timber.log.Timber * @param baseHref Base URL where the Readium CSS and scripts are served. */ @OptIn(ExperimentalReadiumApi::class) -internal fun Resource.injectHtml(publication: Publication, css: ReadiumCss, baseHref: String): Resource = +internal fun Resource.injectHtml( + publication: Publication, + css: ReadiumCss, + baseHref: String, + disableSelectionWhenProtected: Boolean +): Resource = TransformingResource(this) { bytes -> val link = link() check(link.mediaType.isHtml) @@ -40,7 +45,7 @@ internal fun Resource.injectHtml(publication: Publication, css: ReadiumCss, base // Disable the text selection if the publication is protected. // FIXME: This is a hack until proper LCP copy is implemented, see https://github.com/readium/kotlin-toolkit/issues/221 - if (publication.isProtected) { + if (disableSelectionWhenProtected && publication.isProtected) { injectables.add( """