feat: Port "Show content in cutout area" from Tachi

This commit is contained in:
ziro 2024-02-04 12:45:37 +07:00
parent 7386deb72a
commit 4b13a6580a
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6
8 changed files with 60 additions and 15 deletions

View file

@ -0,0 +1,9 @@
package dev.yokai.domain.ui.settings
import eu.kanade.tachiyomi.core.preference.PreferenceStore
class ReaderPreferences(private val preferenceStore: PreferenceStore) {
fun cutoutShort() = preferenceStore.getBoolean("cutout_short", true)
fun landscapeCutoutBehavior() = preferenceStore.getInt("landscape_cutout_behavior", 0)
}

View file

@ -105,10 +105,9 @@ class PreferencesHelper(val context: Context, val preferenceStore: PreferenceSto
fun pageTransitions() = preferenceStore.getBoolean(Keys.enableTransitions, true)
// ReaderPrefs
fun pagerCutoutBehavior() = preferenceStore.getInt(Keys.pagerCutoutBehavior, 0)
fun landscapeCutoutBehavior() = preferenceStore.getInt("landscape_cutout_behavior", 0)
fun doubleTapAnimSpeed() = preferenceStore.getInt(Keys.doubleTapAnimationSpeed, 500)
fun showPageNumber() = preferenceStore.getBoolean(Keys.showPageNumber, true)

View file

@ -5,6 +5,7 @@ import dev.yokai.domain.base.BasePreferences
import dev.yokai.domain.recents.RecentsPreferences
import dev.yokai.domain.source.SourcePreferences
import dev.yokai.domain.ui.UiPreferences
import dev.yokai.domain.ui.settings.ReaderPreferences
import eu.kanade.tachiyomi.core.preference.AndroidPreferenceStore
import eu.kanade.tachiyomi.core.preference.PreferenceStore
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
@ -26,6 +27,8 @@ class PreferenceModule(val application: Application) : InjektModule {
addSingletonFactory { UiPreferences(get()) }
addSingletonFactory { ReaderPreferences(get()) }
addSingletonFactory { RecentsPreferences(get()) }
addSingletonFactory {

View file

@ -71,6 +71,7 @@ import com.google.android.material.slider.Slider
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.transition.platform.MaterialContainerTransform
import com.google.android.material.transition.platform.MaterialContainerTransformSharedElementCallback
import dev.yokai.domain.ui.settings.ReaderPreferences
import eu.kanade.tachiyomi.BuildConfig
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Chapter
@ -150,6 +151,7 @@ import kotlinx.coroutines.flow.sample
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
import java.io.File
import java.text.DecimalFormat
import java.text.DecimalFormatSymbols
@ -233,6 +235,8 @@ class ReaderActivity : BaseActivity<ReaderActivityBinding>() {
(viewer as? PagerViewer)?.config?.hingeGapSize = value
}
private val readerPreferences: ReaderPreferences by injectLazy()
companion object {
const val SHIFT_DOUBLE_PAGES = "shiftingDoublePages"
@ -947,7 +951,7 @@ class ReaderActivity : BaseActivity<ReaderActivityBinding>() {
setNavColor(insets)
val systemInsets = insets.ignoredSystemInsets
val currentOrientation = resources.configuration.orientation
val isLandscapeFully = currentOrientation == Configuration.ORIENTATION_LANDSCAPE && preferences.landscapeCutoutBehavior().get() == 1
val isLandscapeFully = currentOrientation == Configuration.ORIENTATION_LANDSCAPE && readerPreferences.landscapeCutoutBehavior().get() == 1
val cutOutInsets = if (isLandscapeFully) insets.displayCutout else null
val vis = insets.isVisible(statusBars())
val fullscreen = preferences.fullscreen().get() && !isSplitScreen
@ -1823,14 +1827,18 @@ class ReaderActivity : BaseActivity<ReaderActivityBinding>() {
val params = window.attributes
if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
params.layoutInDisplayCutoutMode =
if (preferences.landscapeCutoutBehavior().get() == 0) {
if (readerPreferences.landscapeCutoutBehavior().get() == 0) {
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
} else {
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
}
} else {
params.layoutInDisplayCutoutMode =
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
if (readerPreferences.cutoutShort().get()) {
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
} else {
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
}
}
}
}
@ -1908,7 +1916,12 @@ class ReaderActivity : BaseActivity<ReaderActivityBinding>() {
preferences.showPageNumber().changesIn(scope) { setPageNumberVisibility(it) }
preferences.landscapeCutoutBehavior().changes()
readerPreferences.landscapeCutoutBehavior().changes()
.drop(1)
.onEach { setCutoutMode() }
.launchIn(scope)
readerPreferences.cutoutShort().changes()
.drop(1)
.onEach { setCutoutMode() }
.launchIn(scope)

View file

@ -10,16 +10,20 @@ import android.view.Display
import androidx.core.content.getSystemService
import androidx.core.view.isVisible
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import dev.yokai.domain.ui.settings.ReaderPreferences
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.ReaderPagedLayoutBinding
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
import eu.kanade.tachiyomi.util.bindToPreference
import eu.kanade.tachiyomi.util.lang.addBetaTag
import eu.kanade.tachiyomi.widget.BaseReaderSettingsView
import uy.kohesive.injekt.injectLazy
class ReaderPagedView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
BaseReaderSettingsView<ReaderPagedLayoutBinding>(context, attrs) {
private val readerPreferences: ReaderPreferences by injectLazy()
var needsActivityRecreate = false
override fun inflateBinding() = ReaderPagedLayoutBinding.bind(this)
override fun initGeneralPreferences() {
@ -38,7 +42,7 @@ class ReaderPagedView @JvmOverloads constructor(context: Context, attrs: Attribu
pagerNav.bindToPreference(preferences.navigationModePager())
pagerInvert.bindToPreference(preferences.pagerNavInverted())
extendPastCutout.bindToPreference(preferences.pagerCutoutBehavior())
extendPastCutoutLandscape.bindToPreference(preferences.landscapeCutoutBehavior()) {
extendPastCutoutLandscape.bindToPreference(readerPreferences.landscapeCutoutBehavior()) {
needsActivityRecreate = true
}
pageLayout.bindToPreference(preferences.pageLayout()) {

View file

@ -5,6 +5,7 @@ import android.os.Build
import android.view.Display
import androidx.core.content.getSystemService
import androidx.preference.PreferenceScreen
import dev.yokai.domain.ui.settings.ReaderPreferences
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferenceValues
import eu.kanade.tachiyomi.data.preference.changesIn
@ -15,12 +16,16 @@ import eu.kanade.tachiyomi.ui.reader.settings.ReaderBottomButton
import eu.kanade.tachiyomi.ui.reader.settings.ReadingModeType
import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation
import eu.kanade.tachiyomi.util.lang.addBetaTag
import eu.kanade.tachiyomi.util.system.DeviceUtil
import eu.kanade.tachiyomi.util.system.isTablet
import eu.kanade.tachiyomi.util.view.activityBinding
import uy.kohesive.injekt.injectLazy
import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
class SettingsReaderController : SettingsController() {
private val readerPreferences: ReaderPreferences by injectLazy()
override fun setupPreferenceScreen(screen: PreferenceScreen) = screen.apply {
titleRes = R.string.reader
@ -122,8 +127,13 @@ class SettingsReaderController : SettingsController() {
titleRes = R.string.show_page_number
defaultValue = true
}
switchPreference {
bindTo(readerPreferences.cutoutShort())
titleRes = R.string.pref_cutout_short
isVisible = DeviceUtil.hasCutout(activity) || preferences.fullscreen().get()
}
intListPreference(activity) {
bindTo(preferences.landscapeCutoutBehavior())
bindTo(readerPreferences.landscapeCutoutBehavior())
title = "${context.getString(R.string.cutout_area_behavior)} (${context.getString(R.string.landscape)})"
entriesRes = arrayOf(
R.string.pad_cutout_areas,
@ -131,12 +141,7 @@ class SettingsReaderController : SettingsController() {
)
entryRange = 0..1
defaultValue = 0
isVisible = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
activity?.getSystemService<DisplayManager>()
?.getDisplay(Display.DEFAULT_DISPLAY)?.cutout != null
} else {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
}
isVisible = DeviceUtil.hasCutout(activity)
}
}

View file

@ -1,7 +1,11 @@
package eu.kanade.tachiyomi.util.system
import android.annotation.SuppressLint
import android.app.Activity
import android.hardware.display.DisplayManager
import android.os.Build
import android.view.Display
import androidx.core.content.getSystemService
import timber.log.Timber
object DeviceUtil {
@ -75,4 +79,11 @@ object DeviceUtil {
null
}
}
fun hasCutout(activity: Activity? = null) = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
activity?.getSystemService<DisplayManager>()
?.getDisplay(Display.DEFAULT_DISPLAY)?.cutout != null
} else {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
}
}

View file

@ -502,6 +502,7 @@
<string name="start_past_cutout">Start past cutout</string>
<string name="ignore_cutout_areas">Ignore cutout areas</string>
<string name="cutout_behavior_only_applies">Cutout area behavior only applies in portrait mode with certain scale types</string>
<string name="pref_cutout_short">Show content in cutout area</string>
<string name="page_layout">Page layout</string>
<string name="automatic_can_still_switch">While using automatic page layout, you can still switch between layouts while reading without overriding this setting</string>
<string name="automatic_orientation">Automatic (based on orientation)</string>
@ -1207,4 +1208,4 @@
<string name="sfw">SFW</string>
<string name="nsfw">NSFW</string>
<string name="content_type">Content Type</string>
</resources>
</resources>