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:
arkon 2021-10-03 11:14:49 -04:00 committed by Jobobby04
parent 7574b4baef
commit d74e43b6a6
4 changed files with 55 additions and 87 deletions

View File

@ -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 <--
} }
/** /**

View File

@ -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
}
}
}

View File

@ -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
}

View File

@ -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"