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