Reader fixes
This commit is contained in:
@@ -18,7 +18,7 @@ abstract class BaseReaderFragment(@LayoutRes contentLayoutId: Int) : BaseFragmen
|
||||
|
||||
abstract val hasItems: Boolean
|
||||
|
||||
abstract val currentPageIndex: Int
|
||||
protected abstract val currentPageIndex: Int
|
||||
|
||||
abstract val pages: List<MangaPage>
|
||||
|
||||
@@ -46,6 +46,11 @@ abstract class BaseReaderFragment(@LayoutRes contentLayoutId: Int) : BaseFragmen
|
||||
|
||||
override fun onChaptersLoader(chapters: List<MangaChapter>) = Unit
|
||||
|
||||
override fun onDestroyView() {
|
||||
chaptersMap.clear()
|
||||
super.onDestroyView()
|
||||
}
|
||||
|
||||
final override fun onPagesLoaded(chapterId: Long, pages: List<MangaPage>) {
|
||||
when {
|
||||
chaptersMap.isEmpty() -> {
|
||||
@@ -68,6 +73,33 @@ abstract class BaseReaderFragment(@LayoutRes contentLayoutId: Int) : BaseFragmen
|
||||
}
|
||||
}
|
||||
|
||||
fun switchPageBy(delta: Int) {
|
||||
setCurrentPage(currentPageIndex + delta, true)
|
||||
}
|
||||
|
||||
fun findCurrentPageIndex(chapterId: Long): Int {
|
||||
val pages = this.pages
|
||||
var offset = 0
|
||||
for ((id, count) in chaptersMap) {
|
||||
if (id == chapterId) {
|
||||
return currentPageIndex - offset
|
||||
}
|
||||
offset += count
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
fun getPages(chapterId: Long): List<MangaPage>? {
|
||||
var offset = 0
|
||||
for ((id, count) in chaptersMap) {
|
||||
if (id == chapterId) {
|
||||
return pages.subList(offset, offset + count - 1)
|
||||
}
|
||||
offset += count
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
private fun shouldAppend(chapterId: Long): Boolean {
|
||||
val chapters = lastState?.manga?.chapters ?: return false
|
||||
val lastChapterId = chaptersMap.peekLast()?.first ?: return false
|
||||
|
||||
@@ -89,7 +89,7 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
|
||||
|
||||
override fun onPause() {
|
||||
reader?.let {
|
||||
state = state.copy(page = it.currentPageIndex)
|
||||
state = state.copy(page = it.findCurrentPageIndex(state.chapterId))
|
||||
presenter.saveState(state)
|
||||
}
|
||||
super.onPause()
|
||||
@@ -126,10 +126,15 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
|
||||
}
|
||||
R.id.action_pages_thumbs -> {
|
||||
if (reader?.hasItems == true) {
|
||||
PagesThumbnailsSheet.show(
|
||||
supportFragmentManager, reader!!.pages,
|
||||
state.chapter?.name ?: title?.toString().orEmpty()
|
||||
)
|
||||
val pages = reader?.getPages(state.chapterId)
|
||||
if (pages != null) {
|
||||
PagesThumbnailsSheet.show(
|
||||
supportFragmentManager, pages,
|
||||
state.chapter?.name ?: title?.toString().orEmpty()
|
||||
)
|
||||
} else {
|
||||
showWaitWhileLoading()
|
||||
}
|
||||
} else {
|
||||
showWaitWhileLoading()
|
||||
}
|
||||
@@ -154,7 +159,9 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
|
||||
}
|
||||
|
||||
override fun onLoadingStateChanged(isLoading: Boolean) {
|
||||
layout_loading.isVisible = isLoading
|
||||
val hasPages = reader?.hasItems == true
|
||||
layout_loading.isVisible = isLoading && !hasPages
|
||||
progressBar_bottom.isVisible = isLoading && hasPages
|
||||
}
|
||||
|
||||
override fun onError(e: Exception) {
|
||||
@@ -177,15 +184,11 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
|
||||
}
|
||||
GridTouchHelper.AREA_TOP,
|
||||
GridTouchHelper.AREA_LEFT -> {
|
||||
reader?.let {
|
||||
it.setCurrentPage(it.currentPageIndex - 1, true)
|
||||
}
|
||||
reader?.switchPageBy(-1)
|
||||
}
|
||||
GridTouchHelper.AREA_BOTTOM,
|
||||
GridTouchHelper.AREA_RIGHT -> {
|
||||
reader?.let {
|
||||
it.setCurrentPage(it.currentPageIndex + 1, true)
|
||||
}
|
||||
reader?.switchPageBy(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -225,7 +228,7 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
|
||||
|
||||
override fun onReaderModeChanged(mode: ReaderMode) {
|
||||
reader?.let {
|
||||
state = state.copy(page = it.currentPageIndex)
|
||||
state = state.copy(page = it.findCurrentPageIndex(state.chapterId))
|
||||
}
|
||||
presenter.saveState(state, mode)
|
||||
setReader(mode)
|
||||
@@ -248,10 +251,14 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
|
||||
}
|
||||
|
||||
override fun onPageChanged(chapter: MangaChapter, page: Int, total: Int) {
|
||||
title = chapter.name
|
||||
state.manga.chapters?.run {
|
||||
supportActionBar?.subtitle =
|
||||
getString(R.string.chapter_d_of_d, chapter.number, size)
|
||||
if (chapter.id != state.chapterId) {
|
||||
title = chapter.name
|
||||
state = state.copy(chapterId = chapter.id)
|
||||
presenter.saveState(state)
|
||||
state.manga.chapters?.run {
|
||||
supportActionBar?.subtitle =
|
||||
getString(R.string.chapter_d_of_d, chapter.number, size)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -49,7 +49,11 @@ class StandardReaderFragment : BaseReaderFragment(R.layout.fragment_reader_stand
|
||||
}
|
||||
}
|
||||
}
|
||||
Action.PREPEND -> adapter?.prependData(pages)
|
||||
Action.PREPEND -> adapter?.run {
|
||||
val pos = pager.currentItem
|
||||
prependData(pages)
|
||||
pager.setCurrentItem(pos + pages.size, false)
|
||||
}
|
||||
Action.APPEND -> adapter?.appendData(pages)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import org.koitharu.kotatsu.ui.reader.BaseReaderFragment
|
||||
import org.koitharu.kotatsu.ui.reader.OnBoundsScrollListener
|
||||
import org.koitharu.kotatsu.ui.reader.PageLoader
|
||||
import org.koitharu.kotatsu.ui.reader.ReaderPresenter
|
||||
import org.koitharu.kotatsu.utils.ext.doOnCurrentItemChanged
|
||||
import org.koitharu.kotatsu.utils.ext.firstItem
|
||||
|
||||
class WebtoonReaderFragment : BaseReaderFragment(R.layout.fragment_reader_webtoon),
|
||||
@@ -30,6 +31,7 @@ class WebtoonReaderFragment : BaseReaderFragment(R.layout.fragment_reader_webtoo
|
||||
adapter = WebtoonAdapter(loader)
|
||||
recyclerView.adapter = adapter
|
||||
recyclerView.addOnScrollListener(ListPaginationListener(2, this))
|
||||
recyclerView.doOnCurrentItemChanged(::notifyPageChanged)
|
||||
}
|
||||
|
||||
override fun onPagesLoaded(chapterId: Long, pages: List<MangaPage>, action: Action) {
|
||||
|
||||
@@ -172,4 +172,21 @@ fun ViewPager2.doOnPageChanged(callback: (Int) -> Unit) {
|
||||
callback(position)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
fun RecyclerView.doOnCurrentItemChanged(callback: (Int) -> Unit) {
|
||||
addOnScrollListener(object : RecyclerView.OnScrollListener() {
|
||||
|
||||
private var lastItem = -1
|
||||
|
||||
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
|
||||
super.onScrolled(recyclerView, dx, dy)
|
||||
val item = (recyclerView.layoutManager as? LinearLayoutManager)
|
||||
?.findFirstVisibleItemPosition()
|
||||
if (item != null && item != RecyclerView.NO_POSITION && item != lastItem) {
|
||||
lastItem = item
|
||||
callback(item)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<com.google.android.material.circularreveal.CircularRevealFrameLayout
|
||||
<FrameLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/rootLayout"
|
||||
@@ -12,6 +12,15 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/progressBar_bottom"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:indeterminate="true"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginBottom="20dp"
|
||||
style="@style/Widget.AppCompat.ProgressBar.Horizontal" />
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:id="@+id/appbar_top"
|
||||
android:layout_width="match_parent"
|
||||
@@ -74,4 +83,4 @@
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</com.google.android.material.circularreveal.CircularRevealFrameLayout>
|
||||
</FrameLayout>
|
||||
Reference in New Issue
Block a user