Fix reader zoom buttons
This commit is contained in:
@@ -12,6 +12,7 @@ import androidx.core.view.children
|
|||||||
import androidx.core.view.descendants
|
import androidx.core.view.descendants
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import androidx.recyclerview.widget.RecyclerView.ViewHolder
|
||||||
import androidx.viewpager2.widget.ViewPager2
|
import androidx.viewpager2.widget.ViewPager2
|
||||||
import com.google.android.material.progressindicator.BaseProgressIndicator
|
import com.google.android.material.progressindicator.BaseProgressIndicator
|
||||||
import com.google.android.material.slider.Slider
|
import com.google.android.material.slider.Slider
|
||||||
@@ -68,6 +69,10 @@ inline fun ViewPager2.doOnPageChanged(crossinline callback: (Int) -> Unit) {
|
|||||||
val ViewPager2.recyclerView: RecyclerView?
|
val ViewPager2.recyclerView: RecyclerView?
|
||||||
get() = children.firstNotNullOfOrNull { it as? RecyclerView }
|
get() = children.firstNotNullOfOrNull { it as? RecyclerView }
|
||||||
|
|
||||||
|
fun ViewPager2.findCurrentViewHolder(): ViewHolder? {
|
||||||
|
return recyclerView?.findViewHolderForAdapterPosition(currentItem)
|
||||||
|
}
|
||||||
|
|
||||||
fun View.resetTransformations() {
|
fun View.resetTransformations() {
|
||||||
alpha = 1f
|
alpha = 1f
|
||||||
translationX = 0f
|
translationX = 0f
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ import org.koitharu.kotatsu.core.parser.MangaIntent
|
|||||||
import org.koitharu.kotatsu.core.prefs.AppSettings
|
import org.koitharu.kotatsu.core.prefs.AppSettings
|
||||||
import org.koitharu.kotatsu.core.prefs.ReaderMode
|
import org.koitharu.kotatsu.core.prefs.ReaderMode
|
||||||
import org.koitharu.kotatsu.core.ui.BaseFullscreenActivity
|
import org.koitharu.kotatsu.core.ui.BaseFullscreenActivity
|
||||||
|
import org.koitharu.kotatsu.core.ui.widgets.ZoomControl
|
||||||
import org.koitharu.kotatsu.core.util.GridTouchHelper
|
import org.koitharu.kotatsu.core.util.GridTouchHelper
|
||||||
import org.koitharu.kotatsu.core.util.IdlingDetector
|
import org.koitharu.kotatsu.core.util.IdlingDetector
|
||||||
import org.koitharu.kotatsu.core.util.ShareHelper
|
import org.koitharu.kotatsu.core.util.ShareHelper
|
||||||
@@ -73,7 +74,8 @@ class ReaderActivity :
|
|||||||
ReaderConfigSheet.Callback,
|
ReaderConfigSheet.Callback,
|
||||||
ReaderControlDelegate.OnInteractionListener,
|
ReaderControlDelegate.OnInteractionListener,
|
||||||
OnApplyWindowInsetsListener,
|
OnApplyWindowInsetsListener,
|
||||||
IdlingDetector.Callback {
|
IdlingDetector.Callback,
|
||||||
|
ZoomControl.ZoomControlListener {
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
lateinit var settings: AppSettings
|
lateinit var settings: AppSettings
|
||||||
@@ -111,6 +113,7 @@ class ReaderActivity :
|
|||||||
controlDelegate = ReaderControlDelegate(resources, settings, this, this)
|
controlDelegate = ReaderControlDelegate(resources, settings, this, this)
|
||||||
viewBinding.toolbarBottom.setOnMenuItemClickListener(::onOptionsItemSelected)
|
viewBinding.toolbarBottom.setOnMenuItemClickListener(::onOptionsItemSelected)
|
||||||
viewBinding.slider.setLabelFormatter(PageLabelFormatter())
|
viewBinding.slider.setLabelFormatter(PageLabelFormatter())
|
||||||
|
viewBinding.zoomControl.listener = this
|
||||||
ReaderSliderListener(this, viewModel).attachToSlider(viewBinding.slider)
|
ReaderSliderListener(this, viewModel).attachToSlider(viewBinding.slider)
|
||||||
insetsDelegate.interceptingWindowInsetsListener = this
|
insetsDelegate.interceptingWindowInsetsListener = this
|
||||||
idlingDetector.bindToLifecycle(this)
|
idlingDetector.bindToLifecycle(this)
|
||||||
@@ -146,6 +149,9 @@ class ReaderActivity :
|
|||||||
.setAnchorView(viewBinding.appbarBottom)
|
.setAnchorView(viewBinding.appbarBottom)
|
||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
|
viewModel.isZoomControlsEnabled.observe(this) {
|
||||||
|
viewBinding.zoomControl.isVisible = it
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getParentActivityIntent(): Intent? {
|
override fun getParentActivityIntent(): Intent? {
|
||||||
@@ -163,6 +169,14 @@ class ReaderActivity :
|
|||||||
viewModel.saveCurrentState(readerManager.currentReader?.getCurrentState())
|
viewModel.saveCurrentState(readerManager.currentReader?.getCurrentState())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onZoomIn() {
|
||||||
|
readerManager.currentReader?.onZoomIn()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onZoomOut() {
|
||||||
|
readerManager.currentReader?.onZoomOut()
|
||||||
|
}
|
||||||
|
|
||||||
private fun onInitReader(mode: ReaderMode?) {
|
private fun onInitReader(mode: ReaderMode?) {
|
||||||
if (mode == null) {
|
if (mode == null) {
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -118,17 +118,13 @@ class ReaderViewModel @Inject constructor(
|
|||||||
valueProducer = { isReaderKeepScreenOn },
|
valueProducer = { isReaderKeepScreenOn },
|
||||||
)
|
)
|
||||||
|
|
||||||
val isWebtoonZoomEnabled = settings.observeAsStateFlow(
|
val isZoomControlsEnabled = getObserveIsZoomControlEnabled().flatMapLatest { zoom ->
|
||||||
scope = viewModelScope + Dispatchers.Default,
|
if (zoom) {
|
||||||
key = AppSettings.KEY_WEBTOON_ZOOM,
|
combine(readerMode, observeIsWebtoonZoomEnabled()) { mode, ze -> ze || mode != ReaderMode.WEBTOON }
|
||||||
valueProducer = { isWebtoonZoomEnable },
|
} else {
|
||||||
)
|
flowOf(false)
|
||||||
|
}
|
||||||
val isZoomControlEnabled = settings.observeAsStateFlow(
|
}.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Lazily, false)
|
||||||
scope = viewModelScope + Dispatchers.Default,
|
|
||||||
key = AppSettings.KEY_READER_ZOOM_BUTTONS,
|
|
||||||
valueProducer = { isReaderZoomButtonsEnabled },
|
|
||||||
)
|
|
||||||
|
|
||||||
val readerSettings = ReaderSettings(
|
val readerSettings = ReaderSettings(
|
||||||
parentScope = viewModelScope,
|
parentScope = viewModelScope,
|
||||||
@@ -402,4 +398,14 @@ class ReaderViewModel @Inject constructor(
|
|||||||
val ppc = 1f / chaptersCount
|
val ppc = 1f / chaptersCount
|
||||||
return ppc * chapterIndex + ppc * pagePercent
|
return ppc * chapterIndex + ppc * pagePercent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun observeIsWebtoonZoomEnabled() = settings.observeAsFlow(
|
||||||
|
key = AppSettings.KEY_WEBTOON_ZOOM,
|
||||||
|
valueProducer = { isWebtoonZoomEnable },
|
||||||
|
)
|
||||||
|
|
||||||
|
private fun getObserveIsZoomControlEnabled() = settings.observeAsFlow(
|
||||||
|
key = AppSettings.KEY_READER_ZOOM_BUTTONS,
|
||||||
|
valueProducer = { isReaderZoomButtonsEnabled },
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,9 +46,6 @@ class ReaderSettings(
|
|||||||
val isPagesNumbersEnabled: Boolean
|
val isPagesNumbersEnabled: Boolean
|
||||||
get() = settings.isPagesNumbersEnabled
|
get() = settings.isPagesNumbersEnabled
|
||||||
|
|
||||||
val isZoomControlsEnabled: Boolean
|
|
||||||
get() = settings.isReaderZoomButtonsEnabled
|
|
||||||
|
|
||||||
fun applyBackground(view: View) {
|
fun applyBackground(view: View) {
|
||||||
val bg = settings.readerBackground
|
val bg = settings.readerBackground
|
||||||
view.background = bg.resolve(view.context)
|
view.background = bg.resolve(view.context)
|
||||||
@@ -106,8 +103,6 @@ class ReaderSettings(
|
|||||||
if (
|
if (
|
||||||
key == AppSettings.KEY_ZOOM_MODE ||
|
key == AppSettings.KEY_ZOOM_MODE ||
|
||||||
key == AppSettings.KEY_PAGES_NUMBERS ||
|
key == AppSettings.KEY_PAGES_NUMBERS ||
|
||||||
key == AppSettings.KEY_WEBTOON_ZOOM ||
|
|
||||||
key == AppSettings.KEY_READER_ZOOM_BUTTONS ||
|
|
||||||
key == AppSettings.KEY_READER_BACKGROUND ||
|
key == AppSettings.KEY_READER_BACKGROUND ||
|
||||||
key == AppSettings.KEY_32BIT_COLOR
|
key == AppSettings.KEY_32BIT_COLOR
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import androidx.fragment.app.activityViewModels
|
|||||||
import androidx.viewbinding.ViewBinding
|
import androidx.viewbinding.ViewBinding
|
||||||
import org.koitharu.kotatsu.core.prefs.ReaderAnimation
|
import org.koitharu.kotatsu.core.prefs.ReaderAnimation
|
||||||
import org.koitharu.kotatsu.core.ui.BaseFragment
|
import org.koitharu.kotatsu.core.ui.BaseFragment
|
||||||
|
import org.koitharu.kotatsu.core.ui.widgets.ZoomControl
|
||||||
import org.koitharu.kotatsu.core.util.ext.getParcelableCompat
|
import org.koitharu.kotatsu.core.util.ext.getParcelableCompat
|
||||||
import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled
|
import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled
|
||||||
import org.koitharu.kotatsu.core.util.ext.observe
|
import org.koitharu.kotatsu.core.util.ext.observe
|
||||||
@@ -14,7 +15,7 @@ import org.koitharu.kotatsu.reader.ui.ReaderViewModel
|
|||||||
|
|
||||||
private const val KEY_STATE = "state"
|
private const val KEY_STATE = "state"
|
||||||
|
|
||||||
abstract class BaseReaderFragment<B : ViewBinding> : BaseFragment<B>() {
|
abstract class BaseReaderFragment<B : ViewBinding> : BaseFragment<B>(), ZoomControl.ZoomControlListener {
|
||||||
|
|
||||||
protected val viewModel by activityViewModels<ReaderViewModel>()
|
protected val viewModel by activityViewModels<ReaderViewModel>()
|
||||||
private var stateToSave: ReaderState? = null
|
private var stateToSave: ReaderState? = null
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import org.koitharu.kotatsu.R
|
|||||||
import org.koitharu.kotatsu.core.os.NetworkState
|
import org.koitharu.kotatsu.core.os.NetworkState
|
||||||
import org.koitharu.kotatsu.core.prefs.ReaderAnimation
|
import org.koitharu.kotatsu.core.prefs.ReaderAnimation
|
||||||
import org.koitharu.kotatsu.core.util.ext.doOnPageChanged
|
import org.koitharu.kotatsu.core.util.ext.doOnPageChanged
|
||||||
|
import org.koitharu.kotatsu.core.util.ext.findCurrentViewHolder
|
||||||
import org.koitharu.kotatsu.core.util.ext.observe
|
import org.koitharu.kotatsu.core.util.ext.observe
|
||||||
import org.koitharu.kotatsu.core.util.ext.recyclerView
|
import org.koitharu.kotatsu.core.util.ext.recyclerView
|
||||||
import org.koitharu.kotatsu.core.util.ext.resetTransformations
|
import org.koitharu.kotatsu.core.util.ext.resetTransformations
|
||||||
@@ -28,6 +29,7 @@ import org.koitharu.kotatsu.reader.ui.pager.BaseReaderAdapter
|
|||||||
import org.koitharu.kotatsu.reader.ui.pager.BaseReaderFragment
|
import org.koitharu.kotatsu.reader.ui.pager.BaseReaderFragment
|
||||||
import org.koitharu.kotatsu.reader.ui.pager.ReaderPage
|
import org.koitharu.kotatsu.reader.ui.pager.ReaderPage
|
||||||
import org.koitharu.kotatsu.reader.ui.pager.standard.NoAnimPageTransformer
|
import org.koitharu.kotatsu.reader.ui.pager.standard.NoAnimPageTransformer
|
||||||
|
import org.koitharu.kotatsu.reader.ui.pager.standard.PageHolder
|
||||||
import org.koitharu.kotatsu.reader.ui.pager.standard.PagerEventSupplier
|
import org.koitharu.kotatsu.reader.ui.pager.standard.PagerEventSupplier
|
||||||
import org.koitharu.kotatsu.reader.ui.pager.standard.PagerReaderFragment
|
import org.koitharu.kotatsu.reader.ui.pager.standard.PagerReaderFragment
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@@ -104,6 +106,15 @@ class ReversedReaderFragment : BaseReaderFragment<FragmentReaderStandardBinding>
|
|||||||
exceptionResolver = exceptionResolver,
|
exceptionResolver = exceptionResolver,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
override fun onZoomIn() {
|
||||||
|
(viewBinding?.pager?.findCurrentViewHolder() as? PageHolder)?.onZoomIn()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onZoomOut() {
|
||||||
|
(viewBinding?.pager?.findCurrentViewHolder() as? PageHolder)?.onZoomOut()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun switchPageBy(delta: Int) {
|
override fun switchPageBy(delta: Int) {
|
||||||
with(requireViewBinding().pager) {
|
with(requireViewBinding().pager) {
|
||||||
setCurrentItem(currentItem - delta, isAnimationEnabled())
|
setCurrentItem(currentItem - delta, isAnimationEnabled())
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import android.annotation.SuppressLint
|
|||||||
import android.graphics.PointF
|
import android.graphics.PointF
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import android.view.animation.DecelerateInterpolator
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.lifecycle.LifecycleOwner
|
import androidx.lifecycle.LifecycleOwner
|
||||||
import com.davemorrissey.labs.subscaleview.ImageSource
|
import com.davemorrissey.labs.subscaleview.ImageSource
|
||||||
@@ -12,6 +13,7 @@ import org.koitharu.kotatsu.R
|
|||||||
import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver
|
import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver
|
||||||
import org.koitharu.kotatsu.core.model.ZoomMode
|
import org.koitharu.kotatsu.core.model.ZoomMode
|
||||||
import org.koitharu.kotatsu.core.os.NetworkState
|
import org.koitharu.kotatsu.core.os.NetworkState
|
||||||
|
import org.koitharu.kotatsu.core.ui.widgets.ZoomControl
|
||||||
import org.koitharu.kotatsu.core.util.ext.getDisplayMessage
|
import org.koitharu.kotatsu.core.util.ext.getDisplayMessage
|
||||||
import org.koitharu.kotatsu.core.util.ext.ifZero
|
import org.koitharu.kotatsu.core.util.ext.ifZero
|
||||||
import org.koitharu.kotatsu.core.util.ext.isLowRamDevice
|
import org.koitharu.kotatsu.core.util.ext.isLowRamDevice
|
||||||
@@ -29,7 +31,8 @@ open class PageHolder(
|
|||||||
networkState: NetworkState,
|
networkState: NetworkState,
|
||||||
exceptionResolver: ExceptionResolver,
|
exceptionResolver: ExceptionResolver,
|
||||||
) : BasePageHolder<ItemPageBinding>(binding, loader, settings, networkState, exceptionResolver),
|
) : BasePageHolder<ItemPageBinding>(binding, loader, settings, networkState, exceptionResolver),
|
||||||
View.OnClickListener {
|
View.OnClickListener,
|
||||||
|
ZoomControl.ZoomControlListener {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
binding.ssiv.bindToLifecycle(owner)
|
binding.ssiv.bindToLifecycle(owner)
|
||||||
@@ -40,12 +43,10 @@ open class PageHolder(
|
|||||||
@Suppress("LeakingThis")
|
@Suppress("LeakingThis")
|
||||||
bindingInfo.buttonErrorDetails.setOnClickListener(this)
|
bindingInfo.buttonErrorDetails.setOnClickListener(this)
|
||||||
binding.textViewNumber.isVisible = settings.isPagesNumbersEnabled
|
binding.textViewNumber.isVisible = settings.isPagesNumbersEnabled
|
||||||
binding.zoomControl.listener = SsivZoomListener(binding.ssiv)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onConfigChanged() {
|
override fun onConfigChanged() {
|
||||||
super.onConfigChanged()
|
super.onConfigChanged()
|
||||||
binding.zoomControl.isVisible = settings.isZoomControlsEnabled
|
|
||||||
@Suppress("SENSELESS_COMPARISON")
|
@Suppress("SENSELESS_COMPARISON")
|
||||||
if (settings.applyBitmapConfig(binding.ssiv) && delegate != null) {
|
if (settings.applyBitmapConfig(binding.ssiv) && delegate != null) {
|
||||||
delegate.reload()
|
delegate.reload()
|
||||||
@@ -141,4 +142,23 @@ open class PageHolder(
|
|||||||
bindingInfo.layoutError.isVisible = true
|
bindingInfo.layoutError.isVisible = true
|
||||||
bindingInfo.progressBar.hide()
|
bindingInfo.progressBar.hide()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onZoomIn() {
|
||||||
|
scaleBy(1.2f)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onZoomOut() {
|
||||||
|
scaleBy(0.8f)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun scaleBy(factor: Float) {
|
||||||
|
val ssiv = binding.ssiv
|
||||||
|
val center = ssiv.getCenter() ?: return
|
||||||
|
val newScale = ssiv.scale * factor
|
||||||
|
ssiv.animateScaleAndCenter(newScale, center)?.apply {
|
||||||
|
withDuration(ssiv.resources.getInteger(android.R.integer.config_shortAnimTime).toLong())
|
||||||
|
withInterpolator(DecelerateInterpolator())
|
||||||
|
start()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import org.koitharu.kotatsu.R
|
|||||||
import org.koitharu.kotatsu.core.os.NetworkState
|
import org.koitharu.kotatsu.core.os.NetworkState
|
||||||
import org.koitharu.kotatsu.core.prefs.ReaderAnimation
|
import org.koitharu.kotatsu.core.prefs.ReaderAnimation
|
||||||
import org.koitharu.kotatsu.core.util.ext.doOnPageChanged
|
import org.koitharu.kotatsu.core.util.ext.doOnPageChanged
|
||||||
|
import org.koitharu.kotatsu.core.util.ext.findCurrentViewHolder
|
||||||
import org.koitharu.kotatsu.core.util.ext.observe
|
import org.koitharu.kotatsu.core.util.ext.observe
|
||||||
import org.koitharu.kotatsu.core.util.ext.recyclerView
|
import org.koitharu.kotatsu.core.util.ext.recyclerView
|
||||||
import org.koitharu.kotatsu.core.util.ext.resetTransformations
|
import org.koitharu.kotatsu.core.util.ext.resetTransformations
|
||||||
@@ -82,6 +83,14 @@ class PagerReaderFragment : BaseReaderFragment<FragmentReaderStandardBinding>(),
|
|||||||
super.onDestroyView()
|
super.onDestroyView()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onZoomIn() {
|
||||||
|
(viewBinding?.pager?.findCurrentViewHolder() as? PageHolder)?.onZoomIn()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onZoomOut() {
|
||||||
|
(viewBinding?.pager?.findCurrentViewHolder() as? PageHolder)?.onZoomOut()
|
||||||
|
}
|
||||||
|
|
||||||
override fun onGenericMotion(v: View?, event: MotionEvent): Boolean {
|
override fun onGenericMotion(v: View?, event: MotionEvent): Boolean {
|
||||||
if (event.source and InputDevice.SOURCE_CLASS_POINTER != 0) {
|
if (event.source and InputDevice.SOURCE_CLASS_POINTER != 0) {
|
||||||
if (event.actionMasked == MotionEvent.ACTION_SCROLL) {
|
if (event.actionMasked == MotionEvent.ACTION_SCROLL) {
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.reader.ui.pager.standard
|
|
||||||
|
|
||||||
import android.view.animation.DecelerateInterpolator
|
|
||||||
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
|
|
||||||
import org.koitharu.kotatsu.core.ui.widgets.ZoomControl
|
|
||||||
|
|
||||||
class SsivZoomListener(
|
|
||||||
private val ssiv: SubsamplingScaleImageView,
|
|
||||||
) : ZoomControl.ZoomControlListener {
|
|
||||||
|
|
||||||
override fun onZoomIn() {
|
|
||||||
scaleBy(1.2f)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onZoomOut() {
|
|
||||||
scaleBy(0.8f)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun scaleBy(factor: Float) {
|
|
||||||
val center = ssiv.getCenter() ?: return
|
|
||||||
val newScale = ssiv.scale * factor
|
|
||||||
ssiv.animateScaleAndCenter(newScale, center)?.apply {
|
|
||||||
withDuration(ssiv.resources.getInteger(android.R.integer.config_shortAnimTime).toLong())
|
|
||||||
withInterpolator(DecelerateInterpolator())
|
|
||||||
start()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4,18 +4,15 @@ import android.os.Bundle
|
|||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.view.animation.DecelerateInterpolator
|
import android.view.animation.DecelerateInterpolator
|
||||||
import androidx.core.view.isVisible
|
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import kotlinx.coroutines.async
|
import kotlinx.coroutines.async
|
||||||
import kotlinx.coroutines.coroutineScope
|
import kotlinx.coroutines.coroutineScope
|
||||||
import kotlinx.coroutines.flow.combine
|
|
||||||
import kotlinx.coroutines.yield
|
import kotlinx.coroutines.yield
|
||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
import org.koitharu.kotatsu.core.os.NetworkState
|
import org.koitharu.kotatsu.core.os.NetworkState
|
||||||
import org.koitharu.kotatsu.core.util.ext.findCenterViewPosition
|
import org.koitharu.kotatsu.core.util.ext.findCenterViewPosition
|
||||||
import org.koitharu.kotatsu.core.util.ext.firstVisibleItemPosition
|
import org.koitharu.kotatsu.core.util.ext.firstVisibleItemPosition
|
||||||
import org.koitharu.kotatsu.core.util.ext.observe
|
|
||||||
import org.koitharu.kotatsu.databinding.FragmentReaderWebtoonBinding
|
import org.koitharu.kotatsu.databinding.FragmentReaderWebtoonBinding
|
||||||
import org.koitharu.kotatsu.reader.domain.PageLoader
|
import org.koitharu.kotatsu.reader.domain.PageLoader
|
||||||
import org.koitharu.kotatsu.reader.ui.ReaderState
|
import org.koitharu.kotatsu.reader.ui.ReaderState
|
||||||
@@ -47,15 +44,6 @@ class WebtoonReaderFragment : BaseReaderFragment<FragmentReaderWebtoonBinding>()
|
|||||||
adapter = readerAdapter
|
adapter = readerAdapter
|
||||||
addOnPageScrollListener(PageScrollListener())
|
addOnPageScrollListener(PageScrollListener())
|
||||||
}
|
}
|
||||||
binding.zoomControl.listener = binding.frame
|
|
||||||
|
|
||||||
viewModel.isWebtoonZoomEnabled.observe(viewLifecycleOwner) {
|
|
||||||
binding.frame.isZoomEnable = it
|
|
||||||
}
|
|
||||||
combine(viewModel.isWebtoonZoomEnabled, viewModel.isZoomControlEnabled, Boolean::and)
|
|
||||||
.observe(viewLifecycleOwner) {
|
|
||||||
binding.zoomControl.isVisible = it
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroyView() {
|
override fun onDestroyView() {
|
||||||
@@ -111,6 +99,14 @@ class WebtoonReaderFragment : BaseReaderFragment<FragmentReaderWebtoonBinding>()
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onZoomIn() {
|
||||||
|
viewBinding?.frame?.onZoomIn()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onZoomOut() {
|
||||||
|
viewBinding?.frame?.onZoomOut()
|
||||||
|
}
|
||||||
|
|
||||||
private fun notifyPageChanged(page: Int) {
|
private fun notifyPageChanged(page: Int) {
|
||||||
viewModel.onCurrentPageChanged(page)
|
viewModel.onCurrentPageChanged(page)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,17 @@
|
|||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
<org.koitharu.kotatsu.core.ui.widgets.ZoomControl
|
||||||
|
android:id="@+id/zoomControl"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="bottom|end"
|
||||||
|
android:layout_margin="16dp"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:layout_dodgeInsetEdges="bottom"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<com.google.android.material.appbar.AppBarLayout
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
android:id="@+id/appbar_top"
|
android:id="@+id/appbar_top"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|||||||
@@ -12,6 +12,17 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:background="@color/grey" />
|
tools:background="@color/grey" />
|
||||||
|
|
||||||
|
<org.koitharu.kotatsu.core.ui.widgets.ZoomControl
|
||||||
|
android:id="@+id/zoomControl"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="bottom|end"
|
||||||
|
android:layout_margin="16dp"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:layout_dodgeInsetEdges="bottom"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<org.koitharu.kotatsu.reader.ui.ReaderInfoBarView
|
<org.koitharu.kotatsu.reader.ui.ReaderInfoBarView
|
||||||
android:id="@+id/infoBar"
|
android:id="@+id/infoBar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@@ -62,9 +73,9 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:stepSize="1"
|
android:stepSize="1"
|
||||||
android:valueFrom="0"
|
android:valueFrom="0"
|
||||||
app:trackColorInactive="?attr/m3ColorBackground"
|
|
||||||
app:labelBehavior="floating"
|
app:labelBehavior="floating"
|
||||||
app:tickVisible="false" />
|
app:tickVisible="false"
|
||||||
|
app:trackColorInactive="?attr/m3ColorBackground" />
|
||||||
|
|
||||||
</com.google.android.material.appbar.MaterialToolbar>
|
</com.google.android.material.appbar.MaterialToolbar>
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
<org.koitharu.kotatsu.reader.ui.pager.webtoon.WebtoonScalingFrame
|
<org.koitharu.kotatsu.reader.ui.pager.webtoon.WebtoonScalingFrame
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:id="@+id/frame"
|
android:id="@+id/frame"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
@@ -17,14 +16,4 @@
|
|||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
app:layoutManager="org.koitharu.kotatsu.reader.ui.pager.webtoon.WebtoonLayoutManager" />
|
app:layoutManager="org.koitharu.kotatsu.reader.ui.pager.webtoon.WebtoonLayoutManager" />
|
||||||
|
|
||||||
<org.koitharu.kotatsu.core.ui.widgets.ZoomControl
|
|
||||||
android:id="@+id/zoomControl"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="bottom|end"
|
|
||||||
android:layout_margin="16dp"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:visibility="gone"
|
|
||||||
tools:visibility="visible" />
|
|
||||||
|
|
||||||
</org.koitharu.kotatsu.reader.ui.pager.webtoon.WebtoonScalingFrame>
|
</org.koitharu.kotatsu.reader.ui.pager.webtoon.WebtoonScalingFrame>
|
||||||
|
|||||||
@@ -27,14 +27,4 @@
|
|||||||
|
|
||||||
<include layout="@layout/layout_page_info" />
|
<include layout="@layout/layout_page_info" />
|
||||||
|
|
||||||
<org.koitharu.kotatsu.core.ui.widgets.ZoomControl
|
|
||||||
android:id="@+id/zoomControl"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="bottom|end"
|
|
||||||
android:layout_margin="16dp"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:visibility="gone"
|
|
||||||
tools:visibility="visible" />
|
|
||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|||||||
Reference in New Issue
Block a user