diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderReadingModeSettings.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderReadingModeSettings.kt
deleted file mode 100644
index 23a8590c6..000000000
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderReadingModeSettings.kt
+++ /dev/null
@@ -1,146 +0,0 @@
-package eu.kanade.tachiyomi.ui.reader.setting
-
-import android.content.Context
-import android.util.AttributeSet
-import android.view.LayoutInflater
-import androidx.core.view.isVisible
-import androidx.core.widget.NestedScrollView
-import androidx.lifecycle.lifecycleScope
-import eu.kanade.domain.manga.model.orientationType
-import eu.kanade.domain.manga.model.readingModeType
-import eu.kanade.tachiyomi.R
-import eu.kanade.tachiyomi.databinding.ReaderReadingModeSettingsBinding
-import eu.kanade.tachiyomi.ui.reader.ReaderActivity
-import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerViewer
-import eu.kanade.tachiyomi.ui.reader.viewer.webtoon.WebtoonViewer
-import eu.kanade.tachiyomi.util.preference.bindToPreference
-import eu.kanade.tachiyomi.util.system.isReleaseBuildType
-import kotlinx.coroutines.flow.launchIn
-import kotlinx.coroutines.flow.onEach
-import uy.kohesive.injekt.injectLazy
-
-/**
- * Sheet to show reader and viewer preferences.
- */
-class ReaderReadingModeSettings @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
- NestedScrollView(context, attrs) {
-
- private val readerPreferences: ReaderPreferences by injectLazy()
-
- private val binding = ReaderReadingModeSettingsBinding.inflate(LayoutInflater.from(context), this, false)
-
- init {
- addView(binding.root)
-
- initGeneralPreferences()
-
- when ((context as ReaderActivity).viewModel.state.value.viewer) {
- is PagerViewer -> initPagerPreferences()
- is WebtoonViewer -> initWebtoonPreferences()
- }
- }
-
- /**
- * Init general reader preferences.
- */
- private fun initGeneralPreferences() {
- binding.viewer.onItemSelectedListener = { position ->
- val readingModeType = ReadingModeType.fromSpinner(position)
- (context as ReaderActivity).viewModel.setMangaReadingMode(readingModeType.flagValue)
-
- val mangaViewer = (context as ReaderActivity).viewModel.getMangaReadingMode()
- if (mangaViewer == ReadingModeType.WEBTOON.flagValue || mangaViewer == ReadingModeType.CONTINUOUS_VERTICAL.flagValue) {
- initWebtoonPreferences()
- } else {
- initPagerPreferences()
- }
- }
- binding.viewer.setSelection((context as ReaderActivity).viewModel.manga?.readingModeType?.let { ReadingModeType.fromPreference(it.toInt()).prefValue } ?: ReadingModeType.DEFAULT.prefValue)
-
- binding.rotationMode.onItemSelectedListener = { position ->
- val rotationType = OrientationType.fromSpinner(position)
- (context as ReaderActivity).viewModel.setMangaOrientationType(rotationType.flagValue)
- }
- binding.rotationMode.setSelection((context as ReaderActivity).viewModel.manga?.orientationType?.let { OrientationType.fromPreference(it.toInt()).prefValue } ?: OrientationType.DEFAULT.prefValue)
- }
-
- /**
- * Init the preferences for the pager reader.
- */
- private fun initPagerPreferences() {
- binding.webtoonPrefsGroup.root.isVisible = false
- binding.pagerPrefsGroup.root.isVisible = true
-
- binding.pagerPrefsGroup.tappingInverted.bindToPreference(readerPreferences.pagerNavInverted(), ReaderPreferences.TappingInvertMode::class.java)
- binding.pagerPrefsGroup.navigatePan.bindToPreference(readerPreferences.navigateToPan())
-
- binding.pagerPrefsGroup.pagerNav.bindToPreference(readerPreferences.navigationModePager())
- readerPreferences.navigationModePager().changes()
- .onEach {
- val isTappingEnabled = it != 5
- binding.pagerPrefsGroup.tappingInverted.isVisible = isTappingEnabled
- binding.pagerPrefsGroup.navigatePan.isVisible = isTappingEnabled
- }
- .launchIn((context as ReaderActivity).lifecycleScope)
- // Makes so that landscape zoom gets hidden away when image scale type is not fit screen
- binding.pagerPrefsGroup.scaleType.bindToPreference(readerPreferences.imageScaleType(), 1)
- readerPreferences.imageScaleType().changes()
- .onEach { binding.pagerPrefsGroup.landscapeZoom.isVisible = it == 1 }
- .launchIn((context as ReaderActivity).lifecycleScope)
- binding.pagerPrefsGroup.landscapeZoom.bindToPreference(readerPreferences.landscapeZoom())
-
- binding.pagerPrefsGroup.zoomStart.bindToPreference(readerPreferences.zoomStart(), 1)
- binding.pagerPrefsGroup.cropBorders.bindToPreference(readerPreferences.cropBorders())
-
- binding.pagerPrefsGroup.dualPageSplit.bindToPreference(readerPreferences.dualPageSplitPaged())
- readerPreferences.dualPageSplitPaged().changes()
- .onEach {
- binding.pagerPrefsGroup.dualPageInvert.isVisible = it
- if (it) {
- binding.pagerPrefsGroup.dualPageRotateToFit.isChecked = false
- }
- }
- .launchIn((context as ReaderActivity).lifecycleScope)
- binding.pagerPrefsGroup.dualPageInvert.bindToPreference(readerPreferences.dualPageInvertPaged())
-
- binding.pagerPrefsGroup.dualPageRotateToFit.bindToPreference(readerPreferences.dualPageRotateToFit())
- readerPreferences.dualPageRotateToFit().changes()
- .onEach {
- binding.pagerPrefsGroup.dualPageRotateToFitInvert.isVisible = it
- if (it) {
- binding.pagerPrefsGroup.dualPageSplit.isChecked = false
- }
- }
- .launchIn((context as ReaderActivity).lifecycleScope)
- binding.pagerPrefsGroup.dualPageRotateToFitInvert.bindToPreference(readerPreferences.dualPageRotateToFitInvert())
- }
-
- /**
- * Init the preferences for the webtoon reader.
- */
- private fun initWebtoonPreferences() {
- binding.pagerPrefsGroup.root.isVisible = false
- binding.webtoonPrefsGroup.root.isVisible = true
-
- binding.webtoonPrefsGroup.tappingInverted.bindToPreference(readerPreferences.webtoonNavInverted(), ReaderPreferences.TappingInvertMode::class.java)
-
- binding.webtoonPrefsGroup.webtoonNav.bindToPreference(readerPreferences.navigationModeWebtoon())
- readerPreferences.navigationModeWebtoon().changes()
- .onEach { binding.webtoonPrefsGroup.tappingInverted.isVisible = it != 5 }
- .launchIn((context as ReaderActivity).lifecycleScope)
- binding.webtoonPrefsGroup.cropBordersWebtoon.bindToPreference(readerPreferences.cropBordersWebtoon())
- binding.webtoonPrefsGroup.webtoonSidePadding.bindToIntPreference(readerPreferences.webtoonSidePadding(), R.array.webtoon_side_padding_values)
-
- binding.webtoonPrefsGroup.dualPageSplit.bindToPreference(readerPreferences.dualPageSplitWebtoon())
- // Makes it so that dual page invert gets hidden away when dual page split is turned off
- readerPreferences.dualPageSplitWebtoon().changes()
- .onEach { binding.webtoonPrefsGroup.dualPageInvert.isVisible = it }
- .launchIn((context as ReaderActivity).lifecycleScope)
- binding.webtoonPrefsGroup.dualPageInvert.bindToPreference(readerPreferences.dualPageInvertWebtoon())
-
- binding.webtoonPrefsGroup.longStripSplit.isVisible = !isReleaseBuildType
- binding.webtoonPrefsGroup.longStripSplit.bindToPreference(readerPreferences.longStripSplitWebtoon())
-
- binding.webtoonPrefsGroup.doubleTapZoom.bindToPreference(readerPreferences.webtoonDoubleTapZoomEnabled())
- }
-}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderSettingsSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderSettingsSheet.kt
index 1d511255e..8fde6830a 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderSettingsSheet.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderSettingsSheet.kt
@@ -1,54 +1,136 @@
package eu.kanade.tachiyomi.ui.reader.setting
import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
+import androidx.core.view.isVisible
+import androidx.lifecycle.lifecycleScope
+import com.google.android.material.bottomsheet.BottomSheetDialog
+import eu.kanade.domain.manga.model.orientationType
+import eu.kanade.domain.manga.model.readingModeType
import eu.kanade.tachiyomi.R
-import eu.kanade.tachiyomi.databinding.CommonTabbedSheetBinding
+import eu.kanade.tachiyomi.databinding.ReaderReadingModeSettingsBinding
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
-import eu.kanade.tachiyomi.widget.ViewPagerAdapter
-import eu.kanade.tachiyomi.widget.sheet.BaseBottomSheetDialog
+import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerViewer
+import eu.kanade.tachiyomi.ui.reader.viewer.webtoon.WebtoonViewer
+import eu.kanade.tachiyomi.util.preference.bindToPreference
+import eu.kanade.tachiyomi.util.system.isReleaseBuildType
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.onEach
+import uy.kohesive.injekt.injectLazy
class ReaderSettingsSheet(
private val activity: ReaderActivity,
-) : BaseBottomSheetDialog(activity) {
+) : BottomSheetDialog(activity) {
- private val tabs = listOf(
- ReaderReadingModeSettings(activity) to R.string.pref_category_reading_mode,
- )
+ private val readerPreferences: ReaderPreferences by injectLazy()
- private lateinit var binding: CommonTabbedSheetBinding
-
- override fun createView(inflater: LayoutInflater): View {
- binding = CommonTabbedSheetBinding.inflate(activity.layoutInflater)
-
- val adapter = Adapter()
- binding.pager.adapter = adapter
- binding.tabs.setupWithViewPager(binding.pager)
-
- return binding.root
- }
+ private lateinit var binding: ReaderReadingModeSettingsBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- behavior.isFitToContents = false
- behavior.halfExpandedRatio = 0.25f
+ binding = ReaderReadingModeSettingsBinding.inflate(activity.layoutInflater)
+ setContentView(binding.root)
+
+ initGeneralPreferences()
+
+ when (activity.viewModel.state.value.viewer) {
+ is PagerViewer -> initPagerPreferences()
+ is WebtoonViewer -> initWebtoonPreferences()
+ }
}
- private inner class Adapter : ViewPagerAdapter() {
+ private fun initGeneralPreferences() {
+ binding.viewer.onItemSelectedListener = { position ->
+ val readingModeType = ReadingModeType.fromSpinner(position)
+ activity.viewModel.setMangaReadingMode(readingModeType.flagValue)
- override fun createView(container: ViewGroup, position: Int): View {
- return tabs[position].first
+ val mangaViewer = activity.viewModel.getMangaReadingMode()
+ if (mangaViewer == ReadingModeType.WEBTOON.flagValue || mangaViewer == ReadingModeType.CONTINUOUS_VERTICAL.flagValue) {
+ initWebtoonPreferences()
+ } else {
+ initPagerPreferences()
+ }
}
+ binding.viewer.setSelection(activity.viewModel.manga?.readingModeType?.let { ReadingModeType.fromPreference(it.toInt()).prefValue } ?: ReadingModeType.DEFAULT.prefValue)
- override fun getCount(): Int {
- return tabs.size
+ binding.rotationMode.onItemSelectedListener = { position ->
+ val rotationType = OrientationType.fromSpinner(position)
+ activity.viewModel.setMangaOrientationType(rotationType.flagValue)
}
+ binding.rotationMode.setSelection(activity.viewModel.manga?.orientationType?.let { OrientationType.fromPreference(it.toInt()).prefValue } ?: OrientationType.DEFAULT.prefValue)
+ }
- override fun getPageTitle(position: Int): CharSequence {
- return activity.resources!!.getString(tabs[position].second)
- }
+ private fun initPagerPreferences() {
+ binding.webtoonPrefsGroup.root.isVisible = false
+ binding.pagerPrefsGroup.root.isVisible = true
+
+ binding.pagerPrefsGroup.tappingInverted.bindToPreference(readerPreferences.pagerNavInverted(), ReaderPreferences.TappingInvertMode::class.java)
+ binding.pagerPrefsGroup.navigatePan.bindToPreference(readerPreferences.navigateToPan())
+
+ binding.pagerPrefsGroup.pagerNav.bindToPreference(readerPreferences.navigationModePager())
+ readerPreferences.navigationModePager().changes()
+ .onEach {
+ val isTappingEnabled = it != 5
+ binding.pagerPrefsGroup.tappingInverted.isVisible = isTappingEnabled
+ binding.pagerPrefsGroup.navigatePan.isVisible = isTappingEnabled
+ }
+ .launchIn(activity.lifecycleScope)
+ // Makes so that landscape zoom gets hidden away when image scale type is not fit screen
+ binding.pagerPrefsGroup.scaleType.bindToPreference(readerPreferences.imageScaleType(), 1)
+ readerPreferences.imageScaleType().changes()
+ .onEach { binding.pagerPrefsGroup.landscapeZoom.isVisible = it == 1 }
+ .launchIn(activity.lifecycleScope)
+ binding.pagerPrefsGroup.landscapeZoom.bindToPreference(readerPreferences.landscapeZoom())
+
+ binding.pagerPrefsGroup.zoomStart.bindToPreference(readerPreferences.zoomStart(), 1)
+ binding.pagerPrefsGroup.cropBorders.bindToPreference(readerPreferences.cropBorders())
+
+ binding.pagerPrefsGroup.dualPageSplit.bindToPreference(readerPreferences.dualPageSplitPaged())
+ readerPreferences.dualPageSplitPaged().changes()
+ .onEach {
+ binding.pagerPrefsGroup.dualPageInvert.isVisible = it
+ if (it) {
+ binding.pagerPrefsGroup.dualPageRotateToFit.isChecked = false
+ }
+ }
+ .launchIn(activity.lifecycleScope)
+ binding.pagerPrefsGroup.dualPageInvert.bindToPreference(readerPreferences.dualPageInvertPaged())
+
+ binding.pagerPrefsGroup.dualPageRotateToFit.bindToPreference(readerPreferences.dualPageRotateToFit())
+ readerPreferences.dualPageRotateToFit().changes()
+ .onEach {
+ binding.pagerPrefsGroup.dualPageRotateToFitInvert.isVisible = it
+ if (it) {
+ binding.pagerPrefsGroup.dualPageSplit.isChecked = false
+ }
+ }
+ .launchIn(activity.lifecycleScope)
+ binding.pagerPrefsGroup.dualPageRotateToFitInvert.bindToPreference(readerPreferences.dualPageRotateToFitInvert())
+ }
+
+ private fun initWebtoonPreferences() {
+ binding.pagerPrefsGroup.root.isVisible = false
+ binding.webtoonPrefsGroup.root.isVisible = true
+
+ binding.webtoonPrefsGroup.tappingInverted.bindToPreference(readerPreferences.webtoonNavInverted(), ReaderPreferences.TappingInvertMode::class.java)
+
+ binding.webtoonPrefsGroup.webtoonNav.bindToPreference(readerPreferences.navigationModeWebtoon())
+ readerPreferences.navigationModeWebtoon().changes()
+ .onEach { binding.webtoonPrefsGroup.tappingInverted.isVisible = it != 5 }
+ .launchIn(activity.lifecycleScope)
+ binding.webtoonPrefsGroup.cropBordersWebtoon.bindToPreference(readerPreferences.cropBordersWebtoon())
+ binding.webtoonPrefsGroup.webtoonSidePadding.bindToIntPreference(readerPreferences.webtoonSidePadding(), R.array.webtoon_side_padding_values)
+
+ binding.webtoonPrefsGroup.dualPageSplit.bindToPreference(readerPreferences.dualPageSplitWebtoon())
+ // Makes it so that dual page invert gets hidden away when dual page split is turned off
+ readerPreferences.dualPageSplitWebtoon().changes()
+ .onEach { binding.webtoonPrefsGroup.dualPageInvert.isVisible = it }
+ .launchIn(activity.lifecycleScope)
+ binding.webtoonPrefsGroup.dualPageInvert.bindToPreference(readerPreferences.dualPageInvertWebtoon())
+
+ binding.webtoonPrefsGroup.longStripSplit.isVisible = !isReleaseBuildType
+ binding.webtoonPrefsGroup.longStripSplit.bindToPreference(readerPreferences.longStripSplitWebtoon())
+
+ binding.webtoonPrefsGroup.doubleTapZoom.bindToPreference(readerPreferences.webtoonDoubleTapZoomEnabled())
}
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/sheet/BaseBottomSheetDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/sheet/BaseBottomSheetDialog.kt
deleted file mode 100644
index d19623525..000000000
--- a/app/src/main/java/eu/kanade/tachiyomi/widget/sheet/BaseBottomSheetDialog.kt
+++ /dev/null
@@ -1,55 +0,0 @@
-package eu.kanade.tachiyomi.widget.sheet
-
-import android.content.Context
-import android.os.Build
-import android.os.Bundle
-import android.util.DisplayMetrics
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import com.google.android.material.bottomsheet.BottomSheetDialog
-import com.google.android.material.bottomsheet.getElevation
-import eu.kanade.tachiyomi.R
-import eu.kanade.tachiyomi.util.system.displayCompat
-import eu.kanade.tachiyomi.util.system.isNightMode
-import eu.kanade.tachiyomi.util.view.setNavigationBarTransparentCompat
-
-abstract class BaseBottomSheetDialog(context: Context) : BottomSheetDialog(context) {
-
- abstract fun createView(inflater: LayoutInflater): View
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
-
- val rootView = createView(layoutInflater)
- setContentView(rootView)
-
- // Enforce max width for tablets
- val width = context.resources.getDimensionPixelSize(R.dimen.bottom_sheet_width)
- if (width > 0) {
- behavior.maxWidth = width
- }
-
- // Set peek height to 50% display height
- context.displayCompat?.let {
- val metrics = DisplayMetrics()
- it.getRealMetrics(metrics)
- behavior.peekHeight = metrics.heightPixels / 2
- }
-
- // Set navbar color to transparent for edge-to-edge bottom sheet if we can use light navigation bar
- // TODO Replace deprecated systemUiVisibility when material-components uses new API to modify status bar icons
- @Suppress("DEPRECATION")
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- window?.setNavigationBarTransparentCompat(context, behavior.getElevation())
- val bottomSheet = rootView.parent as ViewGroup
- var flags = bottomSheet.systemUiVisibility
- flags = if (context.isNightMode()) {
- flags and View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR.inv()
- } else {
- flags or View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
- }
- bottomSheet.systemUiVisibility = flags
- }
- }
-}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/sheet/BottomSheetViewPager.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/sheet/BottomSheetViewPager.kt
deleted file mode 100644
index 91b710757..000000000
--- a/app/src/main/java/eu/kanade/tachiyomi/widget/sheet/BottomSheetViewPager.kt
+++ /dev/null
@@ -1,56 +0,0 @@
-package eu.kanade.tachiyomi.widget.sheet
-import android.content.Context
-import android.util.AttributeSet
-import android.view.View
-import androidx.viewpager.widget.ViewPager
-import java.lang.reflect.Field
-
-/**
- * From https://github.com/kafumi/android-bottomsheet-viewpager
- */
-class BottomSheetViewPager @JvmOverloads constructor(
- context: Context,
- attrs: AttributeSet? = null,
-) : ViewPager(context, attrs) {
-
- private val positionField: Field = LayoutParams::class.java.getDeclaredField("position").also {
- it.isAccessible = true
- }
-
- override fun getChildAt(index: Int): View {
- val currentView = getCurrentView() ?: return super.getChildAt(index)
- return if (index == 0) {
- currentView
- } else {
- var view = super.getChildAt(index)
- if (view == currentView) {
- view = super.getChildAt(0)
- }
- return view
- }
- }
-
- private fun getCurrentView(): View? {
- for (i in 0 until childCount) {
- val child = super.getChildAt(i)
- val lp = child.layoutParams as? LayoutParams
- if (lp != null) {
- val position = positionField.getInt(lp)
- if (!lp.isDecor && currentItem == position) {
- return child
- }
- }
- }
- return null
- }
-
- init {
- addOnPageChangeListener(
- object : SimpleOnPageChangeListener() {
- override fun onPageSelected(position: Int) {
- requestLayout()
- }
- },
- )
- }
-}
diff --git a/app/src/main/res/layout/common_tabbed_sheet.xml b/app/src/main/res/layout/common_tabbed_sheet.xml
deleted file mode 100644
index 9b6aae965..000000000
--- a/app/src/main/res/layout/common_tabbed_sheet.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-sw720dp/dimens.xml b/app/src/main/res/values-sw720dp/dimens.xml
index cebce1c6a..5cb983dc4 100644
--- a/app/src/main/res/values-sw720dp/dimens.xml
+++ b/app/src/main/res/values-sw720dp/dimens.xml
@@ -1,5 +1,3 @@
- 480dp
-
24dp
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 65275808c..f6f722017 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -1,6 +1,4 @@
- 0dp
-
8dp
16dp