From 766210d7bf693c1f286f7f864331832645a5465e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mickae=CC=88l=20Menu?= Date: Fri, 13 Jan 2023 13:19:19 +0100 Subject: [PATCH 1/3] EPUB: Option to revert to the 2.2.0 font size strategy --- CHANGELOG.md | 10 ++++++- .../navigator/epub/EpubNavigatorFragment.kt | 27 +++++++++++++++---- .../navigator/epub/EpubNavigatorViewModel.kt | 4 +-- .../readium/r2/navigator/epub/EpubSettings.kt | 7 +++-- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c45abc3207..f1b610ab03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,15 @@ All notable changes to this project will be documented in this file. Take a look **Warning:** Features marked as *experimental* may change or be removed in a future release without notice. Use with caution. - +## [Unreleased] + +### Added + +#### Navigator + +* New `EPUBNavigatorFragment.Configuration.useNativeFontSizeStrategy` option to revert to the 2.2.0 strategy for setting the font size of reflowable EPUB publications. + * The native font size strategy introduced in 2.3.0 uses the Android web view's [`WebSettings.textZoom`](https://developer.android.com/reference/android/webkit/WebSettings#setTextZoom(int)) property to adjust the font size. 2.2.0 was using Readium CSS's [`--USER__fontSize` variable](https://readium.org/readium-css/docs/CSS12-user_prefs.html#font-size). + * `WebSettings.textZoom` will work with more publications than `--USER__fontSize`, even the ones poorly authored. However the page width is not adjusted when changing the font size to keep the optimal line length. ## [2.3.0] 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 5ebca0739f..d522c8ca3d 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 @@ -132,6 +132,21 @@ class EpubNavigatorFragment internal constructor( @ExperimentalReadiumApi var readiumCssRsProperties: RsProperties, + /** + * When true, the Android web view's `WebSettings.textZoom` will be used to adjust the font + * size, instead of using the Readium CSS's `--USER__fontSize` variable. + * + * `WebSettings.textZoom` will work with more publications than `--USER__fontSize`, even the + * ones poorly authored. However the page width is not adjusted when changing the font + * size to keep the optimal line length. + * + * See: + * - https://github.com/readium/mobile/issues/5 + * - https://github.com/readium/mobile/issues/1#issuecomment-652431984 + */ + @ExperimentalReadiumApi + var useNativeFontSizeStrategy: Boolean = true, + /** * Supported HTML decoration templates. */ @@ -503,18 +518,20 @@ class EpubNavigatorFragment internal constructor( } private fun R2PagerAdapter.setFontSize(fontSize: Double) { - r2PagerAdapter?.mFragments?.forEach { _, fragment -> + if (!config.useNativeFontSizeStrategy) return + + mFragments.forEach { _, fragment -> (fragment as? R2EpubPageFragment)?.setFontSize(fontSize) } } private inner class PagerAdapterListener : R2PagerAdapter.Listener { override fun onCreatePageFragment(fragment: Fragment) { - if (viewModel.layout == EpubLayout.FIXED) { - return + if (viewModel.layout == EpubLayout.REFLOWABLE) { + if (config.useNativeFontSizeStrategy) { + (fragment as? R2EpubPageFragment)?.setFontSize(settings.value.fontSize) + } } - - (fragment as? R2EpubPageFragment)?.setFontSize(settings.value.fontSize) } } 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 06848d4905..68a3442a00 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 @@ -118,7 +118,7 @@ internal class EpubNavigatorViewModel( fontFamilyDeclarations = config.fontFamilyDeclarations, googleFonts = googleFonts, assetsBaseHref = WebViewServer.assetsBaseHref - ).update(settings.value) + ).update(settings.value, useNativeFontSizeStrategy = config.useNativeFontSizeStrategy) ) init { @@ -230,7 +230,7 @@ internal class EpubNavigatorViewModel( val newSettings = settingsPolicy.settings(preferences) _settings.value = newSettings - css.update { it.update(newSettings) } + css.update { it.update(newSettings, useNativeFontSizeStrategy = config.useNativeFontSizeStrategy) } val needsInvalidation: Boolean = ( oldSettings.readingProgression != newSettings.readingProgression || diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubSettings.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubSettings.kt index 1ba34459e9..edf9c2f556 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubSettings.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubSettings.kt @@ -65,7 +65,7 @@ data class EpubSettings( ) : Configurable.Settings @OptIn(ExperimentalReadiumApi::class) -internal fun ReadiumCss.update(settings: EpubSettings): ReadiumCss { +internal fun ReadiumCss.update(settings: EpubSettings, useNativeFontSizeStrategy: Boolean): ReadiumCss { fun resolveFontStack(fontFamily: String): List = buildList { add(fontFamily) @@ -109,9 +109,8 @@ internal fun ReadiumCss.update(settings: EpubSettings): ReadiumCss { backgroundColor = backgroundColor?.toCss(), fontOverride = (fontFamily != null || textNormalization), fontFamily = fontFamily?.toCss(), - // Font size is handled natively with WebSettings.textZoom. - // See https://github.com/readium/mobile/issues/1#issuecomment-652431984 -// fontSize = fontSize?.let { Length.Percent(it) }, + fontSize = if (useNativeFontSizeStrategy) null + else Length.Percent(fontSize), advancedSettings = !publisherStyles, typeScale = typeScale, textAlign = when (textAlign) { From 564d6087bc971e13eb0b5c2ee3987743fd77e25f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mickae=CC=88l=20Menu?= Date: Wed, 18 Jan 2023 13:29:20 +0100 Subject: [PATCH 2/3] Invert the config property --- CHANGELOG.md | 2 +- .../r2/navigator/epub/EpubNavigatorFragment.kt | 15 ++++++++------- .../r2/navigator/epub/EpubNavigatorViewModel.kt | 7 ++++--- .../org/readium/r2/navigator/epub/EpubSettings.kt | 6 +++--- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1b610ab03..cc5d814d1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ All notable changes to this project will be documented in this file. Take a look #### Navigator -* New `EPUBNavigatorFragment.Configuration.useNativeFontSizeStrategy` option to revert to the 2.2.0 strategy for setting the font size of reflowable EPUB publications. +* New `EPUBNavigatorFragment.Configuration.useReadiumCssFontSize` option to revert to the 2.2.0 strategy for setting the font size of reflowable EPUB publications. * The native font size strategy introduced in 2.3.0 uses the Android web view's [`WebSettings.textZoom`](https://developer.android.com/reference/android/webkit/WebSettings#setTextZoom(int)) property to adjust the font size. 2.2.0 was using Readium CSS's [`--USER__fontSize` variable](https://readium.org/readium-css/docs/CSS12-user_prefs.html#font-size). * `WebSettings.textZoom` will work with more publications than `--USER__fontSize`, even the ones poorly authored. However the page width is not adjusted when changing the font size to keep the optimal line length. 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 d522c8ca3d..a449880996 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 @@ -86,7 +86,7 @@ typealias JavascriptInterfaceFactory = (resource: Link) -> Any? * * To use this [Fragment], create a factory with `EpubNavigatorFragment.createFactory()`. */ -@OptIn(ExperimentalDecorator::class, ExperimentalReadiumApi::class) +@OptIn(ExperimentalDecorator::class, ExperimentalReadiumApi::class, DelicateReadiumApi::class) class EpubNavigatorFragment internal constructor( override val publication: Publication, private val baseUrl: String?, @@ -133,11 +133,11 @@ class EpubNavigatorFragment internal constructor( var readiumCssRsProperties: RsProperties, /** - * When true, the Android web view's `WebSettings.textZoom` will be used to adjust the font - * size, instead of using the Readium CSS's `--USER__fontSize` variable. + * When disabled, the Android web view's `WebSettings.textZoom` will be used to adjust the + * font size, instead of using the Readium CSS's `--USER__fontSize` variable. * * `WebSettings.textZoom` will work with more publications than `--USER__fontSize`, even the - * ones poorly authored. However the page width is not adjusted when changing the font + * ones poorly authored. However, the page width is not adjusted when changing the font * size to keep the optimal line length. * * See: @@ -145,7 +145,8 @@ class EpubNavigatorFragment internal constructor( * - https://github.com/readium/mobile/issues/1#issuecomment-652431984 */ @ExperimentalReadiumApi - var useNativeFontSizeStrategy: Boolean = true, + @DelicateReadiumApi + var useReadiumCssFontSize: Boolean = true, /** * Supported HTML decoration templates. @@ -518,7 +519,7 @@ class EpubNavigatorFragment internal constructor( } private fun R2PagerAdapter.setFontSize(fontSize: Double) { - if (!config.useNativeFontSizeStrategy) return + if (config.useReadiumCssFontSize) return mFragments.forEach { _, fragment -> (fragment as? R2EpubPageFragment)?.setFontSize(fontSize) @@ -528,7 +529,7 @@ class EpubNavigatorFragment internal constructor( private inner class PagerAdapterListener : R2PagerAdapter.Listener { override fun onCreatePageFragment(fragment: Fragment) { if (viewModel.layout == EpubLayout.REFLOWABLE) { - if (config.useNativeFontSizeStrategy) { + if (!config.useReadiumCssFontSize) { (fragment as? R2EpubPageFragment)?.setFontSize(settings.value.fontSize) } } 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 68a3442a00..4ad1f4d184 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 @@ -37,6 +37,7 @@ import org.readium.r2.shared.extensions.mapStateIn import org.readium.r2.shared.publication.Link import org.readium.r2.shared.publication.Publication import org.readium.r2.shared.publication.ReadingProgression as PublicationReadingProgression +import org.readium.r2.shared.DelicateReadiumApi import org.readium.r2.shared.publication.epub.EpubLayout import org.readium.r2.shared.util.Href @@ -44,7 +45,7 @@ internal enum class DualPage { AUTO, OFF, ON } -@OptIn(ExperimentalReadiumApi::class, ExperimentalDecorator::class) +@OptIn(ExperimentalReadiumApi::class, ExperimentalDecorator::class, DelicateReadiumApi::class) internal class EpubNavigatorViewModel( application: Application, val publication: Publication, @@ -118,7 +119,7 @@ internal class EpubNavigatorViewModel( fontFamilyDeclarations = config.fontFamilyDeclarations, googleFonts = googleFonts, assetsBaseHref = WebViewServer.assetsBaseHref - ).update(settings.value, useNativeFontSizeStrategy = config.useNativeFontSizeStrategy) + ).update(settings.value, useReadiumCssFontSize = config.useReadiumCssFontSize) ) init { @@ -230,7 +231,7 @@ internal class EpubNavigatorViewModel( val newSettings = settingsPolicy.settings(preferences) _settings.value = newSettings - css.update { it.update(newSettings, useNativeFontSizeStrategy = config.useNativeFontSizeStrategy) } + css.update { it.update(newSettings, useReadiumCssFontSize = config.useReadiumCssFontSize) } val needsInvalidation: Boolean = ( oldSettings.readingProgression != newSettings.readingProgression || diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubSettings.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubSettings.kt index edf9c2f556..ba997cca74 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubSettings.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubSettings.kt @@ -65,7 +65,7 @@ data class EpubSettings( ) : Configurable.Settings @OptIn(ExperimentalReadiumApi::class) -internal fun ReadiumCss.update(settings: EpubSettings, useNativeFontSizeStrategy: Boolean): ReadiumCss { +internal fun ReadiumCss.update(settings: EpubSettings, useReadiumCssFontSize: Boolean): ReadiumCss { fun resolveFontStack(fontFamily: String): List = buildList { add(fontFamily) @@ -109,8 +109,8 @@ internal fun ReadiumCss.update(settings: EpubSettings, useNativeFontSizeStrategy backgroundColor = backgroundColor?.toCss(), fontOverride = (fontFamily != null || textNormalization), fontFamily = fontFamily?.toCss(), - fontSize = if (useNativeFontSizeStrategy) null - else Length.Percent(fontSize), + fontSize = if (useReadiumCssFontSize) Length.Percent(fontSize) + else null, advancedSettings = !publisherStyles, typeScale = typeScale, textAlign = when (textAlign) { From 14227e803beedd9b0bf9a6e3fb9a8e2dcf0bb967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mickae=CC=88l=20Menu?= Date: Wed, 18 Jan 2023 13:32:51 +0100 Subject: [PATCH 3/3] Linting --- .../org/readium/r2/navigator/epub/EpubNavigatorViewModel.kt | 2 +- .../src/main/java/org/readium/r2/navigator/epub/EpubSettings.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 4ad1f4d184..9ce65e2f86 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 @@ -30,6 +30,7 @@ import org.readium.r2.navigator.html.HtmlDecorationTemplates import org.readium.r2.navigator.preferences.* import org.readium.r2.navigator.util.createViewModelFactory import org.readium.r2.shared.COLUMN_COUNT_REF +import org.readium.r2.shared.DelicateReadiumApi import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.SCROLL_REF import org.readium.r2.shared.extensions.addPrefix @@ -37,7 +38,6 @@ import org.readium.r2.shared.extensions.mapStateIn import org.readium.r2.shared.publication.Link import org.readium.r2.shared.publication.Publication import org.readium.r2.shared.publication.ReadingProgression as PublicationReadingProgression -import org.readium.r2.shared.DelicateReadiumApi import org.readium.r2.shared.publication.epub.EpubLayout import org.readium.r2.shared.util.Href diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubSettings.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubSettings.kt index ba997cca74..f439ba1071 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubSettings.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubSettings.kt @@ -110,7 +110,7 @@ internal fun ReadiumCss.update(settings: EpubSettings, useReadiumCssFontSize: Bo fontOverride = (fontFamily != null || textNormalization), fontFamily = fontFamily?.toCss(), fontSize = if (useReadiumCssFontSize) Length.Percent(fontSize) - else null, + else null, advancedSettings = !publisherStyles, typeScale = typeScale, textAlign = when (textAlign) {