Switch to Material Slider for reader seekbar
Co-authored-by: Jays2Kings <Jays2Kings@users.noreply.github.com> (cherry picked from commit d149017c60722ba26fe13487437ab542b9bbaebd) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt
This commit is contained in:
parent
7574b4baef
commit
d74e43b6a6
@ -28,7 +28,6 @@ import android.view.animation.Animation
|
|||||||
import android.view.animation.AnimationUtils
|
import android.view.animation.AnimationUtils
|
||||||
import android.widget.FrameLayout
|
import android.widget.FrameLayout
|
||||||
import android.widget.RelativeLayout
|
import android.widget.RelativeLayout
|
||||||
import android.widget.SeekBar
|
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.annotation.ColorInt
|
import androidx.annotation.ColorInt
|
||||||
import androidx.core.graphics.ColorUtils
|
import androidx.core.graphics.ColorUtils
|
||||||
@ -42,6 +41,7 @@ import androidx.lifecycle.lifecycleScope
|
|||||||
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
|
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import com.google.android.material.shape.MaterialShapeDrawable
|
import com.google.android.material.shape.MaterialShapeDrawable
|
||||||
|
import com.google.android.material.slider.Slider
|
||||||
import dev.chrisbanes.insetter.applyInsetter
|
import dev.chrisbanes.insetter.applyInsetter
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.database.models.Chapter
|
import eu.kanade.tachiyomi.data.database.models.Chapter
|
||||||
@ -89,10 +89,10 @@ import eu.kanade.tachiyomi.util.system.toast
|
|||||||
import eu.kanade.tachiyomi.util.view.popupMenu
|
import eu.kanade.tachiyomi.util.view.popupMenu
|
||||||
import eu.kanade.tachiyomi.util.view.setTooltip
|
import eu.kanade.tachiyomi.util.view.setTooltip
|
||||||
import eu.kanade.tachiyomi.widget.listener.SimpleAnimationListener
|
import eu.kanade.tachiyomi.widget.listener.SimpleAnimationListener
|
||||||
import eu.kanade.tachiyomi.widget.listener.SimpleSeekBarListener
|
|
||||||
import exh.log.xLogE
|
import exh.log.xLogE
|
||||||
import exh.source.isEhBasedSource
|
import exh.source.isEhBasedSource
|
||||||
import exh.util.defaultReaderType
|
import exh.util.defaultReaderType
|
||||||
|
import exh.util.floor
|
||||||
import exh.util.mangaType
|
import exh.util.mangaType
|
||||||
import exh.util.seconds
|
import exh.util.seconds
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@ -424,27 +424,18 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
|||||||
|
|
||||||
// SY -->
|
// SY -->
|
||||||
// Init listeners on bottom menu
|
// Init listeners on bottom menu
|
||||||
val listener = object : SimpleSeekBarListener() {
|
val listener = object : Slider.OnSliderTouchListener {
|
||||||
override fun onStartTrackingTouch(seekBar: SeekBar) {
|
override fun onStartTrackingTouch(slider: Slider) {
|
||||||
super.onStartTrackingTouch(seekBar)
|
|
||||||
isScrollingThroughPages = true
|
isScrollingThroughPages = true
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onStopTrackingTouch(seekBar: SeekBar) {
|
override fun onStopTrackingTouch(slider: Slider) {
|
||||||
super.onStopTrackingTouch(seekBar)
|
|
||||||
isScrollingThroughPages = false
|
isScrollingThroughPages = false
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onProgressChanged(seekBar: SeekBar, value: Int, fromUser: Boolean) {
|
|
||||||
if (viewer != null && fromUser) {
|
|
||||||
moveToPageIndex(value)
|
|
||||||
binding.pageSeekbar.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
listOf(binding.pageSeekbar, binding.pageSeekbarVert)
|
listOf(binding.pageSlider, binding.pageSliderVert)
|
||||||
.forEach {
|
.forEach {
|
||||||
it.setOnSeekBarChangeListener(listener)
|
it.addOnSliderTouchListener(listener)
|
||||||
}
|
}
|
||||||
// SY <--
|
// SY <--
|
||||||
|
|
||||||
@ -860,8 +851,8 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
|||||||
if (doublePages) {
|
if (doublePages) {
|
||||||
// If we're moving from singe to double, we want the current page to be the first page
|
// If we're moving from singe to double, we want the current page to be the first page
|
||||||
pViewer.config.shiftDoublePage = (
|
pViewer.config.shiftDoublePage = (
|
||||||
binding.pageSeekbar.progress +
|
binding.pageSlider.value.floor() +
|
||||||
(currentChapter?.pages?.take(binding.pageSeekbar.progress)?.count { it.fullPage || it.isolatedPage } ?: 0)
|
(currentChapter?.pages?.take(binding.pageSlider.value.floor())?.count { it.fullPage || it.isolatedPage } ?: 0)
|
||||||
) % 2 != 0
|
) % 2 != 0
|
||||||
}
|
}
|
||||||
presenter.viewerChaptersRelay.value?.let {
|
presenter.viewerChaptersRelay.value?.let {
|
||||||
@ -1102,7 +1093,7 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
|||||||
// SY <--
|
// SY <--
|
||||||
binding.toolbar.title = manga.title
|
binding.toolbar.title = manga.title
|
||||||
|
|
||||||
binding.pageSeekbar.isRTL = newViewer is R2LPagerViewer
|
binding.pageSlider.isRTL = newViewer is R2LPagerViewer
|
||||||
if (newViewer is R2LPagerViewer) {
|
if (newViewer is R2LPagerViewer) {
|
||||||
binding.leftChapter.setTooltip(R.string.action_next_chapter)
|
binding.leftChapter.setTooltip(R.string.action_next_chapter)
|
||||||
binding.rightChapter.setTooltip(R.string.action_previous_chapter)
|
binding.rightChapter.setTooltip(R.string.action_previous_chapter)
|
||||||
@ -1263,7 +1254,7 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
|||||||
binding.pageNumber.text = "$currentPage/${pages.size}"
|
binding.pageNumber.text = "$currentPage/${pages.size}"
|
||||||
// binding.pageText.text = "${page.number}/${pages.size}"
|
// binding.pageText.text = "${page.number}/${pages.size}"
|
||||||
|
|
||||||
// Set seekbar page number
|
// Set page numbers
|
||||||
if (viewer !is R2LPagerViewer) {
|
if (viewer !is R2LPagerViewer) {
|
||||||
binding.leftPageText.text = currentPage
|
binding.leftPageText.text = currentPage
|
||||||
binding.rightPageText.text = "${pages.size}"
|
binding.rightPageText.text = "${pages.size}"
|
||||||
@ -1272,18 +1263,19 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
|||||||
binding.leftPageText.text = "${pages.size}"
|
binding.leftPageText.text = "${pages.size}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set slider progress
|
||||||
|
binding.pageSlider.valueTo = pages.lastIndex.toFloat()
|
||||||
|
binding.pageSlider.value = page.index.toFloat()
|
||||||
|
|
||||||
|
// SY -->
|
||||||
|
binding.pageSliderVert.valueTo = pages.lastIndex.toFloat()
|
||||||
|
binding.pageSliderVert.value = page.index.toFloat()
|
||||||
|
// SY <--
|
||||||
|
|
||||||
// SY -->
|
// SY -->
|
||||||
binding.abovePageText.text = currentPage
|
binding.abovePageText.text = currentPage
|
||||||
binding.belowPageText.text = "${pages.size}"
|
binding.belowPageText.text = "${pages.size}"
|
||||||
// SY <--
|
// SY <--
|
||||||
|
|
||||||
binding.pageSeekbar.max = pages.lastIndex
|
|
||||||
binding.pageSeekbar.progress = page.index
|
|
||||||
|
|
||||||
// SY -->
|
|
||||||
binding.pageSeekbarVert.max = pages.lastIndex
|
|
||||||
binding.pageSeekbarVert.progress = page.index
|
|
||||||
// SY <--
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,55 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.ui.reader
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.res.ColorStateList
|
|
||||||
import android.graphics.Canvas
|
|
||||||
import android.util.AttributeSet
|
|
||||||
import android.view.MotionEvent
|
|
||||||
import androidx.appcompat.widget.AppCompatSeekBar
|
|
||||||
import eu.kanade.tachiyomi.R
|
|
||||||
import eu.kanade.tachiyomi.util.system.getThemeColor
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Seekbar to show current chapter progress.
|
|
||||||
*/
|
|
||||||
class ReaderSeekBar @JvmOverloads constructor(
|
|
||||||
context: Context,
|
|
||||||
attrs: AttributeSet? = null
|
|
||||||
) : AppCompatSeekBar(context, attrs) {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether the seekbar should draw from right to left.
|
|
||||||
*/
|
|
||||||
var isRTL = false
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Draws the seekbar, translating the canvas if using a right to left reader.
|
|
||||||
*/
|
|
||||||
override fun draw(canvas: Canvas) {
|
|
||||||
if (isRTL) {
|
|
||||||
val px = width / 2f
|
|
||||||
val py = height / 2f
|
|
||||||
|
|
||||||
canvas.scale(-1f, 1f, px, py)
|
|
||||||
}
|
|
||||||
super.draw(canvas)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles touch events, translating coordinates if using a right to left reader.
|
|
||||||
*/
|
|
||||||
override fun onTouchEvent(event: MotionEvent): Boolean {
|
|
||||||
if (isRTL) {
|
|
||||||
event.setLocation(width - event.x, event.y)
|
|
||||||
}
|
|
||||||
return super.onTouchEvent(event)
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
|
||||||
// Set color to onPrimary when ColoredBars theme is applied
|
|
||||||
if (context.getThemeColor(R.attr.colorToolbar) == context.getThemeColor(R.attr.colorPrimary)) {
|
|
||||||
thumbTintList = ColorStateList.valueOf(context.getThemeColor(R.attr.colorOnPrimary))
|
|
||||||
progressTintList = thumbTintList
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,31 @@
|
|||||||
|
package eu.kanade.tachiyomi.ui.reader
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import com.google.android.material.slider.Slider
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Slider to show current chapter progress.
|
||||||
|
*/
|
||||||
|
class ReaderSlider @JvmOverloads constructor(
|
||||||
|
context: Context,
|
||||||
|
attrs: AttributeSet? = null
|
||||||
|
) : Slider(context, attrs) {
|
||||||
|
|
||||||
|
init {
|
||||||
|
isTickVisible = false
|
||||||
|
stepSize = 1f
|
||||||
|
setLabelFormatter { value ->
|
||||||
|
(value.toInt() + 1).toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether the slider should draw from right to left.
|
||||||
|
*/
|
||||||
|
var isRTL: Boolean
|
||||||
|
set(value) {
|
||||||
|
layoutDirection = if (value) LAYOUT_DIRECTION_RTL else LAYOUT_DIRECTION_LTR
|
||||||
|
}
|
||||||
|
get() = layoutDirection == LAYOUT_DIRECTION_RTL
|
||||||
|
}
|
@ -227,8 +227,8 @@
|
|||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
tools:text="1" />
|
tools:text="1" />
|
||||||
|
|
||||||
<eu.kanade.tachiyomi.ui.reader.ReaderSeekBar
|
<eu.kanade.tachiyomi.ui.reader.ReaderSlider
|
||||||
android:id="@+id/page_seekbar_vert"
|
android:id="@+id/page_slider_vert"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_marginTop="27dp"
|
android:layout_marginTop="27dp"
|
||||||
@ -339,8 +339,8 @@
|
|||||||
Wonky way of setting height due to issues with horizontally centering the thumb in Android 5.
|
Wonky way of setting height due to issues with horizontally centering the thumb in Android 5.
|
||||||
See https://stackoverflow.com/questions/15701767/android-thumb-is-not-centered-in-seekbar
|
See https://stackoverflow.com/questions/15701767/android-thumb-is-not-centered-in-seekbar
|
||||||
-->
|
-->
|
||||||
<eu.kanade.tachiyomi.ui.reader.ReaderSeekBar
|
<eu.kanade.tachiyomi.ui.reader.ReaderSlider
|
||||||
android:id="@+id/page_seekbar"
|
android:id="@+id/page_slider"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user