Add autoscroll support

This commit is contained in:
NerdNumber9 2018-06-10 00:50:17 -04:00
parent ad2819a3bc
commit b6a3f6ebd2
6 changed files with 196 additions and 7 deletions

View File

@ -170,4 +170,8 @@ object PreferenceKeys {
const val eh_readerThreads = "eh_reader_threads" const val eh_readerThreads = "eh_reader_threads"
const val eh_readerInstantRetry = "eh_reader_instant_retry" const val eh_readerInstantRetry = "eh_reader_instant_retry"
const val eh_utilAutoscrollState = "eh_util_autoscroll_state"
const val eh_utilAutoscrollInterval = "eh_util_autoscroll_interval"
} }

View File

@ -242,4 +242,8 @@ class PreferencesHelper(val context: Context) {
fun eh_readerThreads() = rxPrefs.getInteger(Keys.eh_readerThreads, 2) fun eh_readerThreads() = rxPrefs.getInteger(Keys.eh_readerThreads, 2)
fun eh_readerInstantRetry() = rxPrefs.getBoolean(Keys.eh_readerInstantRetry, true) fun eh_readerInstantRetry() = rxPrefs.getBoolean(Keys.eh_readerInstantRetry, true)
fun eh_utilAutoscrollState() = rxPrefs.getBoolean(Keys.eh_utilAutoscrollState, false)
fun eh_utilAutoscrollInterval() = rxPrefs.getFloat(Keys.eh_utilAutoscrollInterval, 3f)
} }

View File

@ -8,12 +8,17 @@ import android.graphics.Color
import android.os.Build import android.os.Build
import android.os.Build.VERSION_CODES.KITKAT import android.os.Build.VERSION_CODES.KITKAT
import android.os.Bundle import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.view.* import android.view.*
import android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS import android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
import android.view.animation.Animation import android.view.animation.Animation
import android.view.animation.AnimationUtils import android.view.animation.AnimationUtils
import android.widget.SeekBar import android.widget.SeekBar
import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.MaterialDialog
import com.jakewharton.rxbinding.view.clicks
import com.jakewharton.rxbinding.widget.checkedChanges
import com.jakewharton.rxbinding.widget.textChanges
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
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
@ -33,6 +38,7 @@ import kotlinx.android.synthetic.main.reader_activity.*
import me.zhanghai.android.systemuihelper.SystemUiHelper import me.zhanghai.android.systemuihelper.SystemUiHelper
import me.zhanghai.android.systemuihelper.SystemUiHelper.* import me.zhanghai.android.systemuihelper.SystemUiHelper.*
import nucleus.factory.RequiresPresenter import nucleus.factory.RequiresPresenter
import rx.Observable
import rx.Subscription import rx.Subscription
import rx.android.schedulers.AndroidSchedulers import rx.android.schedulers.AndroidSchedulers
import rx.subscriptions.CompositeSubscription import rx.subscriptions.CompositeSubscription
@ -41,6 +47,7 @@ import uy.kohesive.injekt.injectLazy
import java.io.File import java.io.File
import java.text.DecimalFormat import java.text.DecimalFormat
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import kotlin.math.roundToLong
@RequiresPresenter(ReaderPresenter::class) @RequiresPresenter(ReaderPresenter::class)
class ReaderActivity : BaseRxActivity<ReaderPresenter>() { class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
@ -56,6 +63,9 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
const val BLACK_THEME = 1 const val BLACK_THEME = 1
const val MENU_VISIBLE = "menu_visible" const val MENU_VISIBLE = "menu_visible"
// --> EH
const val EH_UTILS_VISIBLE = "eh_utils_visible"
// <-- EH
fun newIntent(context: Context, manga: Manga, chapter: Chapter): Intent { fun newIntent(context: Context, manga: Manga, chapter: Chapter): Intent {
SharedData.put(ReaderEvent(manga, chapter)) SharedData.put(ReaderEvent(manga, chapter))
@ -67,6 +77,10 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
val subscriptions by lazy { CompositeSubscription() } val subscriptions by lazy { CompositeSubscription() }
// --> EH
private var autoscrollSubscription: Subscription? = null
// <-- EH
private var customBrightnessSubscription: Subscription? = null private var customBrightnessSubscription: Subscription? = null
private var customFilterColorSubscription: Subscription? = null private var customFilterColorSubscription: Subscription? = null
@ -89,6 +103,10 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
private var menuVisible = false private var menuVisible = false
// --> EH
private var ehUtilsVisible = false
// <-- EH
override fun onCreate(savedState: Bundle?) { override fun onCreate(savedState: Bundle?) {
super.onCreate(savedState) super.onCreate(savedState)
setContentView(R.layout.reader_activity) setContentView(R.layout.reader_activity)
@ -109,10 +127,18 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
if (savedState != null) { if (savedState != null) {
menuVisible = savedState.getBoolean(MENU_VISIBLE) menuVisible = savedState.getBoolean(MENU_VISIBLE)
// --> EH
ehUtilsVisible = savedState.getBoolean(EH_UTILS_VISIBLE)
// <-- EH
} }
setMenuVisibility(menuVisible) setMenuVisibility(menuVisible)
// --> EH
setEhUtilsVisibility(ehUtilsVisible)
// <-- EH
maxBitmapSize = GLUtil.getMaxTextureSize() maxBitmapSize = GLUtil.getMaxTextureSize()
left_chapter.setOnClickListener { left_chapter.setOnClickListener {
@ -131,6 +157,56 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
requestNextChapter() requestNextChapter()
} }
} }
// --> EH
subscriptions += expand_eh_button.clicks().subscribe {
ehUtilsVisible = !ehUtilsVisible
setEhUtilsVisibility(ehUtilsVisible)
}
subscriptions += preferences.eh_utilAutoscrollState().asObservable()
.combineLatest(preferences.eh_utilAutoscrollInterval().asObservable()) { state, interval ->
state to interval
}.observeOn(AndroidSchedulers.mainThread())
.subscribe { (state, interval) ->
if(state && interval != -1f) {
setupAutoscroll(interval)
} else {
autoscrollSubscription?.unsubscribe()
autoscrollSubscription = null
}
eh_autoscroll.isChecked = state
if(interval != -1f && eh_autoscroll_freq.text?.toString()?.toFloatOrNull() != interval)
eh_autoscroll_freq.setText(interval.toString())
}
subscriptions += eh_autoscroll.checkedChanges().subscribe {
preferences.eh_utilAutoscrollState().set(it)
}
subscriptions += eh_autoscroll_freq.textChanges().subscribe {
val parsed = it?.toString()?.toFloatOrNull()
if(parsed == null || parsed <= 0 || parsed > 9999) {
eh_autoscroll_freq.error = "Invalid frequency"
preferences.eh_utilAutoscrollInterval().set(-1f)
eh_autoscroll.isEnabled = false
} else {
eh_autoscroll_freq.error = null
preferences.eh_utilAutoscrollInterval().set(parsed)
eh_autoscroll.isEnabled = true
}
}
subscriptions += eh_autoscroll_help.clicks().subscribe {
MaterialDialog.Builder(this)
.title("Autoscroll help")
.content("Automatically scroll to the next page in the specified interval. Interval is specified in seconds.")
.positiveText("Ok")
.show()
}
// <-- EH
} }
override fun onDestroy() { override fun onDestroy() {
@ -156,6 +232,11 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
override fun onSaveInstanceState(outState: Bundle) { override fun onSaveInstanceState(outState: Bundle) {
outState.putBoolean(MENU_VISIBLE, menuVisible) outState.putBoolean(MENU_VISIBLE, menuVisible)
// --> EH
outState.putBoolean(EH_UTILS_VISIBLE, eh_utils.visibility == View.VISIBLE)
// <-- EH
super.onSaveInstanceState(outState) super.onSaveInstanceState(outState)
} }
@ -523,6 +604,18 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
} }
} }
// --> EH
private fun setEhUtilsVisibility(visible: Boolean) {
if(visible) {
eh_utils.visible()
expand_eh_button.setImageResource(R.drawable.ic_keyboard_arrow_up_white_32dp)
} else {
eh_utils.gone()
expand_eh_button.setImageResource(R.drawable.ic_keyboard_arrow_down_white_32dp)
}
}
// <-- EH
private fun setMenuVisibility(visible: Boolean, animate: Boolean = true) { private fun setMenuVisibility(visible: Boolean, animate: Boolean = true) {
menuVisible = visible menuVisible = visible
if (visible) { if (visible) {
@ -539,7 +632,7 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
} }
} }
}) })
toolbar.startAnimation(toolbarAnimation) header.startAnimation(toolbarAnimation)
val bottomMenuAnimation = AnimationUtils.loadAnimation(this, R.anim.enter_from_bottom) val bottomMenuAnimation = AnimationUtils.loadAnimation(this, R.anim.enter_from_bottom)
reader_menu_bottom.startAnimation(bottomMenuAnimation) reader_menu_bottom.startAnimation(bottomMenuAnimation)
@ -554,7 +647,7 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
reader_menu.visibility = View.GONE reader_menu.visibility = View.GONE
} }
}) })
toolbar.startAnimation(toolbarAnimation) header.startAnimation(toolbarAnimation)
val bottomMenuAnimation = AnimationUtils.loadAnimation(this, R.anim.exit_to_bottom) val bottomMenuAnimation = AnimationUtils.loadAnimation(this, R.anim.exit_to_bottom)
reader_menu_bottom.startAnimation(bottomMenuAnimation) reader_menu_bottom.startAnimation(bottomMenuAnimation)
@ -601,4 +694,19 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
} }
// --> EH
private fun setupAutoscroll(interval: Float) {
autoscrollSubscription?.unsubscribe()
val intervalMs = (interval * 1000).roundToLong()
val sub = Observable.interval(intervalMs, intervalMs, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
viewer?.moveRight()
}
autoscrollSubscription = sub
subscriptions += sub
}
// <-- EH
} }

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M7.41,7.84L12,12.42l4.59,-4.58L18,9.25l-6,6 -6,-6z"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M7.41,15.41L12,10.83l4.59,4.58L18,14l-6,-6 -6,6z"/>
</vector>

View File

@ -42,13 +42,68 @@
android:visibility="invisible" android:visibility="invisible"
tools:visibility="visible"> tools:visibility="visible">
<android.support.v7.widget.Toolbar <android.support.design.widget.AppBarLayout
android:id="@+id/toolbar" android:id="@+id/header"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="wrap_content"
android:animateLayoutChanges="true"
android:background="?colorPrimary" android:background="?colorPrimary"
android:elevation="4dp" android:elevation="4dp">
android:theme="?attr/actionBarTheme"/>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" />
<LinearLayout
android:id="@+id/eh_utils"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:visibility="gone"
tools:visibility="visible">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Switch
android:id="@+id/eh_autoscroll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="8dp"
android:text="Autoscroll" />
<EditText
android:id="@+id/eh_autoscroll_freq"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_weight="0.2"
android:ems="10"
android:inputType="numberDecimal"
android:maxLength="10" />
<Button
android:id="@+id/eh_autoscroll_help"
style="?android:attr/borderlessButtonStyle"
android:layout_width="40dp"
android:layout_height="wrap_content"
android:text="\?" />
</LinearLayout>
</LinearLayout>
<ImageButton
android:id="@+id/expand_eh_button"
style="?android:attr/borderlessButtonStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="0dp"
app:srcCompat="@drawable/ic_keyboard_arrow_down_white_32dp" />
</android.support.design.widget.AppBarLayout>
<LinearLayout <LinearLayout
android:id="@+id/reader_menu_bottom" android:id="@+id/reader_menu_bottom"