|
@@ -8,13 +8,16 @@ import android.os.Looper
|
|
|
import android.view.KeyEvent
|
|
import android.view.KeyEvent
|
|
|
import android.view.Menu
|
|
import android.view.Menu
|
|
|
import android.view.MenuItem
|
|
import android.view.MenuItem
|
|
|
|
|
+import android.view.View
|
|
|
import android.view.WindowManager
|
|
import android.view.WindowManager
|
|
|
import androidx.activity.viewModels
|
|
import androidx.activity.viewModels
|
|
|
import androidx.appcompat.app.AlertDialog
|
|
import androidx.appcompat.app.AlertDialog
|
|
|
import androidx.core.view.isGone
|
|
import androidx.core.view.isGone
|
|
|
import androidx.core.view.isVisible
|
|
import androidx.core.view.isVisible
|
|
|
import androidx.recyclerview.widget.LinearLayoutManager
|
|
import androidx.recyclerview.widget.LinearLayoutManager
|
|
|
|
|
+import androidx.recyclerview.widget.LinearSmoothScroller
|
|
|
import androidx.recyclerview.widget.PagerSnapHelper
|
|
import androidx.recyclerview.widget.PagerSnapHelper
|
|
|
|
|
+import androidx.recyclerview.widget.RecyclerView
|
|
|
import com.bumptech.glide.Glide
|
|
import com.bumptech.glide.Glide
|
|
|
import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader
|
|
import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader
|
|
|
import com.bumptech.glide.request.target.Target.SIZE_ORIGINAL
|
|
import com.bumptech.glide.request.target.Target.SIZE_ORIGINAL
|
|
@@ -76,6 +79,18 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
|
|
|
AppConfig.disableMangaScaling
|
|
AppConfig.disableMangaScaling
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private val mDisableClickScroller by lazy {
|
|
|
|
|
+ AppConfig.disableClickScroller
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private val mSmoothScroller by lazy {
|
|
|
|
|
+ object : LinearSmoothScroller(this@ReadMangaActivity) {
|
|
|
|
|
+ override fun getVerticalSnapPreference(): Int {
|
|
|
|
|
+ return SNAP_TO_START
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private val mSizeProvider by lazy {
|
|
private val mSizeProvider by lazy {
|
|
|
FixedPreloadSizeProvider<Any>(
|
|
FixedPreloadSizeProvider<Any>(
|
|
|
this@ReadMangaActivity.resources.displayMetrics.widthPixels, SIZE_ORIGINAL
|
|
this@ReadMangaActivity.resources.displayMetrics.widthPixels, SIZE_ORIGINAL
|
|
@@ -83,7 +98,16 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private val mPagerSnapHelper: PagerSnapHelper by lazy {
|
|
private val mPagerSnapHelper: PagerSnapHelper by lazy {
|
|
|
- PagerSnapHelper()
|
|
|
|
|
|
|
+ object : PagerSnapHelper() {
|
|
|
|
|
+ override fun calculateDistanceToFinalSnap(
|
|
|
|
|
+ layoutManager: RecyclerView.LayoutManager,
|
|
|
|
|
+ targetView: View
|
|
|
|
|
+ ): IntArray {
|
|
|
|
|
+ val out = IntArray(2)
|
|
|
|
|
+ out[1] = targetView.top - binding.mRecyclerMange.paddingTop
|
|
|
|
|
+ return out
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private var mRecyclerViewPreloader: RecyclerViewPreloader<Any>? = null
|
|
private var mRecyclerViewPreloader: RecyclerViewPreloader<Any>? = null
|
|
@@ -138,6 +162,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
|
|
|
mLayoutManager.isItemPrefetchEnabled = true
|
|
mLayoutManager.isItemPrefetchEnabled = true
|
|
|
setItemViewCacheSize(AppConfig.preDownloadNum)
|
|
setItemViewCacheSize(AppConfig.preDownloadNum)
|
|
|
singlePagerScroller(mSinglePageScroller)
|
|
singlePagerScroller(mSinglePageScroller)
|
|
|
|
|
+ disabledClickScroller(mDisableClickScroller)
|
|
|
setPreScrollListener { _, _, dy, position ->
|
|
setPreScrollListener { _, _, dy, position ->
|
|
|
if (dy > 0 && position + 2 > mAdapter.getCurrentList().size - 3) {
|
|
if (dy > 0 && position + 2 > mAdapter.getCurrentList().size - 3) {
|
|
|
if (mAdapter.getCurrentList().last() is ReaderLoading) {
|
|
if (mAdapter.getCurrentList().last() is ReaderLoading) {
|
|
@@ -176,6 +201,12 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
|
|
|
binding.mangaMenu.runMenuIn()
|
|
binding.mangaMenu.runMenuIn()
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ onNextPage {
|
|
|
|
|
+ scrollToNext()
|
|
|
|
|
+ }
|
|
|
|
|
+ onPrevPage {
|
|
|
|
|
+ scrollToPrev()
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
binding.tvRetry.setOnClickListener {
|
|
binding.tvRetry.setOnClickListener {
|
|
|
binding.llLoading.isVisible = true
|
|
binding.llLoading.isVisible = true
|
|
@@ -405,6 +436,12 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
|
|
|
AppConfig.disableMangaScaling = item.isChecked
|
|
AppConfig.disableMangaScaling = item.isChecked
|
|
|
disableMangaScaling(item.isChecked)
|
|
disableMangaScaling(item.isChecked)
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ R.id.menu_disable_click_scroller -> {
|
|
|
|
|
+ item.isChecked = !item.isChecked
|
|
|
|
|
+ AppConfig.disableClickScroller = item.isChecked
|
|
|
|
|
+ disabledClickScroller(item.isChecked)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
return super.onCompatOptionsItemSelected(item)
|
|
return super.onCompatOptionsItemSelected(item)
|
|
|
}
|
|
}
|
|
@@ -464,6 +501,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
|
|
|
getString(R.string.pre_download_m, mPreDownloadNum)
|
|
getString(R.string.pre_download_m, mPreDownloadNum)
|
|
|
menu.findItem(R.id.menu_scroller_page).isChecked = mSinglePageScroller
|
|
menu.findItem(R.id.menu_scroller_page).isChecked = mSinglePageScroller
|
|
|
menu.findItem(R.id.menu_disable_manga_scaling).isChecked = mDisableMangaScaling
|
|
menu.findItem(R.id.menu_disable_manga_scaling).isChecked = mDisableMangaScaling
|
|
|
|
|
+ menu.findItem(R.id.menu_disable_click_scroller).isChecked = mDisableClickScroller
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private fun disableMangaScaling(disable: Boolean) {
|
|
private fun disableMangaScaling(disable: Boolean) {
|
|
@@ -474,6 +512,10 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private fun disabledClickScroller(disable: Boolean) {
|
|
|
|
|
+ binding.mRecyclerMange.disabledClickScroller = disable
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private fun upLayoutInDisplayCutoutMode() {
|
|
private fun upLayoutInDisplayCutoutMode() {
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
|
|
window.attributes = window.attributes.apply {
|
|
window.attributes = window.attributes.apply {
|
|
@@ -482,4 +524,36 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ private fun scrollToNext() {
|
|
|
|
|
+ val lastCompletelyVisiblePosition = mLayoutManager.findLastCompletelyVisibleItemPosition()
|
|
|
|
|
+ val nextPosition = if (lastCompletelyVisiblePosition != RecyclerView.NO_POSITION) {
|
|
|
|
|
+ lastCompletelyVisiblePosition + 1
|
|
|
|
|
+ } else {
|
|
|
|
|
+ mLayoutManager.findFirstVisibleItemPosition() + 1
|
|
|
|
|
+ }
|
|
|
|
|
+ if (nextPosition > mAdapter.getCurrentList().lastIndex) {
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ smoothScrollToPosition(nextPosition)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ private fun scrollToPrev() {
|
|
|
|
|
+ val firstCompletelyVisiblePosition = mLayoutManager.findFirstCompletelyVisibleItemPosition()
|
|
|
|
|
+ val prevPosition = if (firstCompletelyVisiblePosition != RecyclerView.NO_POSITION) {
|
|
|
|
|
+ firstCompletelyVisiblePosition - 1
|
|
|
|
|
+ } else {
|
|
|
|
|
+ mLayoutManager.findFirstVisibleItemPosition() - 1
|
|
|
|
|
+ }
|
|
|
|
|
+ if (prevPosition < 0) {
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ smoothScrollToPosition(prevPosition)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private fun smoothScrollToPosition(position: Int) {
|
|
|
|
|
+ mSmoothScroller.targetPosition = position
|
|
|
|
|
+ mLayoutManager.startSmoothScroll(mSmoothScroller)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|