Browse Source

Add "Rotate wide pages to fit" for webtoon reader too

Closes #1977
arkon 1 year ago
parent
commit
4a7c20f5a0

+ 19 - 0
app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt

@@ -245,10 +245,12 @@ object SettingsReaderScreen : SearchableSettings {
 
         val navModePref = readerPreferences.navigationModeWebtoon()
         val dualPageSplitPref = readerPreferences.dualPageSplitWebtoon()
+        val rotateToFitPref = readerPreferences.dualPageRotateToFitWebtoon()
         val webtoonSidePaddingPref = readerPreferences.webtoonSidePadding()
 
         val navMode by navModePref.collectAsState()
         val dualPageSplit by dualPageSplitPref.collectAsState()
+        val rotateToFit by rotateToFitPref.collectAsState()
         val webtoonSidePadding by webtoonSidePaddingPref.collectAsState()
 
         return Preference.PreferenceGroup(
@@ -300,6 +302,10 @@ object SettingsReaderScreen : SearchableSettings {
                 Preference.PreferenceItem.SwitchPreference(
                     pref = dualPageSplitPref,
                     title = stringResource(MR.strings.pref_dual_page_split),
+                    onValueChanged = {
+                        rotateToFitPref.set(false)
+                        true
+                    },
                 ),
                 Preference.PreferenceItem.SwitchPreference(
                     pref = readerPreferences.dualPageInvertWebtoon(),
@@ -307,6 +313,19 @@ object SettingsReaderScreen : SearchableSettings {
                     subtitle = stringResource(MR.strings.pref_dual_page_invert_summary),
                     enabled = dualPageSplit,
                 ),
+                Preference.PreferenceItem.SwitchPreference(
+                    pref = rotateToFitPref,
+                    title = stringResource(MR.strings.pref_page_rotate),
+                    onValueChanged = {
+                        dualPageSplitPref.set(false)
+                        true
+                    },
+                ),
+                Preference.PreferenceItem.SwitchPreference(
+                    pref = readerPreferences.dualPageRotateToFitInvertWebtoon(),
+                    title = stringResource(MR.strings.pref_page_rotate_invert),
+                    enabled = rotateToFit,
+                ),
                 Preference.PreferenceItem.SwitchPreference(
                     pref = readerPreferences.webtoonDoubleTapZoomEnabled(),
                     title = stringResource(MR.strings.pref_double_tap_zoom),

+ 13 - 0
app/src/main/java/eu/kanade/presentation/reader/settings/ReadingModePage.kt

@@ -180,6 +180,19 @@ private fun ColumnScope.WebtoonViewerSettings(screenModel: ReaderSettingsScreenM
         )
     }
 
+    val dualPageRotateToFitWebtoon by screenModel.preferences.dualPageRotateToFitWebtoon().collectAsState()
+    CheckboxItem(
+        label = stringResource(MR.strings.pref_page_rotate),
+        pref = screenModel.preferences.dualPageRotateToFitWebtoon(),
+    )
+
+    if (dualPageRotateToFitWebtoon) {
+        CheckboxItem(
+            label = stringResource(MR.strings.pref_page_rotate_invert),
+            pref = screenModel.preferences.dualPageRotateToFitInvertWebtoon(),
+        )
+    }
+
     CheckboxItem(
         label = stringResource(MR.strings.pref_double_tap_zoom),
         pref = screenModel.preferences.webtoonDoubleTapZoomEnabled(),

+ 4 - 0
app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt

@@ -86,6 +86,10 @@ class ReaderPreferences(
 
     fun dualPageRotateToFitInvert() = preferenceStore.getBoolean("pref_dual_page_rotate_invert", false)
 
+    fun dualPageRotateToFitWebtoon() = preferenceStore.getBoolean("pref_dual_page_rotate_webtoon", false)
+
+    fun dualPageRotateToFitInvertWebtoon() = preferenceStore.getBoolean("pref_dual_page_rotate_invert_webtoon", false)
+
     // endregion
 
     // region Color filter

+ 12 - 0
app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt

@@ -62,6 +62,18 @@ class WebtoonConfig(
         readerPreferences.dualPageInvertWebtoon()
             .register({ dualPageInvert = it }, { imagePropertyChangedListener?.invoke() })
 
+        readerPreferences.dualPageRotateToFitWebtoon()
+            .register(
+                { dualPageRotateToFit = it },
+                { imagePropertyChangedListener?.invoke() },
+            )
+
+        readerPreferences.dualPageRotateToFitInvertWebtoon()
+            .register(
+                { dualPageRotateToFitInvert = it },
+                { imagePropertyChangedListener?.invoke() },
+            )
+
         readerPreferences.webtoonDoubleTapZoomEnabled()
             .register(
                 { doubleTapZoom = it },

+ 14 - 0
app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonPageHolder.kt

@@ -210,6 +210,10 @@ class WebtoonPageHolder(
     }
 
     private fun process(imageStream: BufferedInputStream): InputStream {
+        if (viewer.config.dualPageRotateToFit) {
+            return rotateDualPage(imageStream)
+        }
+
         if (viewer.config.dualPageSplit) {
             val isDoublePage = ImageUtil.isWideImage(imageStream)
             if (isDoublePage) {
@@ -221,6 +225,16 @@ class WebtoonPageHolder(
         return imageStream
     }
 
+    private fun rotateDualPage(imageStream: BufferedInputStream): InputStream {
+        val isDoublePage = ImageUtil.isWideImage(imageStream)
+        return if (isDoublePage) {
+            val rotation = if (viewer.config.dualPageRotateToFitInvert) -90f else 90f
+            ImageUtil.rotateImage(imageStream, rotation)
+        } else {
+            imageStream
+        }
+    }
+
     /**
      * Called when the page has an error.
      */

+ 4 - 4
core/src/main/java/eu/kanade/tachiyomi/util/system/DeviceUtil.kt

@@ -7,7 +7,7 @@ import tachiyomi.core.util.system.logcat
 
 object DeviceUtil {
 
-    val isMiui by lazy {
+    val isMiui: Boolean by lazy {
         getSystemProperty("ro.miui.ui.version.name")?.isNotEmpty() ?: false
     }
 
@@ -16,7 +16,7 @@ object DeviceUtil {
      *
      * @return MIUI major version code (e.g., 13) or null if can't be parsed.
      */
-    val miuiMajorVersion by lazy {
+    val miuiMajorVersion: Int? by lazy {
         if (!isMiui) return@lazy null
 
         Build.VERSION.INCREMENTAL
@@ -41,11 +41,11 @@ object DeviceUtil {
         }
     }
 
-    val isSamsung by lazy {
+    val isSamsung: Boolean by lazy {
         Build.MANUFACTURER.equals("samsung", ignoreCase = true)
     }
 
-    val oneUiVersion by lazy {
+    val oneUiVersion: Double? by lazy {
         try {
             val semPlatformIntField = Build.VERSION::class.java.getDeclaredField("SEM_PLATFORM_INT")
             val version = semPlatformIntField.getInt(null) - 90000