Reader fixes

This commit is contained in:
Koitharu
2020-02-27 20:27:44 +02:00
parent 2405ca26cc
commit 3ef6b3a59c
6 changed files with 92 additions and 21 deletions

View File

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

View File

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

View File

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

View File

@@ -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) {

View File

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

View File

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