minor reader bugs: (#2491)

- fix preload on last page for R2L reader
 - page 3 bug

(cherry picked from commit 8b0458cdf6)
This commit is contained in:
MCAxiaz 2020-01-16 18:45:06 -08:00 committed by arkon
parent 647a78b791
commit 7a4763ee68
2 changed files with 38 additions and 23 deletions

View File

@ -70,14 +70,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
pager.adapter = adapter pager.adapter = adapter
pager.addOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() { pager.addOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() {
override fun onPageSelected(position: Int) { override fun onPageSelected(position: Int) {
val page = adapter.items.getOrNull(position) onPageChange(position)
if (page != null && currentPage != page) {
currentPage = page
when (page) {
is ReaderPage -> onPageSelected(page, position)
is ChapterTransition -> onTransitionSelected(page)
}
}
} }
override fun onPageScrollStateChanged(state: Int) { override fun onPageScrollStateChanged(state: Int) {
@ -129,25 +122,38 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
} }
/** /**
* Called from the ViewPager listener when a [page] is marked as active. It notifies the * Called when a new page (either a [ReaderPage] or [ChapterTransition]) is marked as active
* activity of the change and requests the preload of the next chapter if this is the last page.
*/ */
private fun onPageSelected(page: ReaderPage, position: Int) { private fun onPageChange(position: Int) {
val pages = page.chapter.pages!! // Won't be null because it's the loaded chapter val page = adapter.items.getOrNull(position)
Timber.d("onPageSelected: ${page.number}/${pages.size}") if (page != null && currentPage != page) {
activity.onPageSelected(page) currentPage = page
when (page) {
if (page === pages.last()) { is ReaderPage -> onReaderPageSelected(page)
Timber.d("Request preload next chapter because we're at the last page") is ChapterTransition -> onTransitionSelected(page)
val transition = adapter.items.getOrNull(position + 1) as? ChapterTransition.Next
if (transition?.to != null) {
activity.requestPreloadChapter(transition.to)
} }
} }
} }
/** /**
* Called from the ViewPager listener when a [transition] is marked as active. It request the * Called when a [ReaderPage] is marked as active. It notifies the
* activity of the change and requests the preload of the next chapter if this is the last page.
*/
private fun onReaderPageSelected(page: ReaderPage) {
val pages = page.chapter.pages!! // Won't be null because it's the loaded chapter
Timber.d("onReaderPageSelected: ${page.number}/${pages.size}")
activity.onPageSelected(page)
if (page === pages.last()) {
Timber.d("Request preload next chapter because we're at the last page")
adapter.nextTransition?.to?.let {
activity.requestPreloadChapter(it)
}
}
}
/**
* Called when a [ChapterTransition] is marked as active. It request the
* preload of the destination chapter of the transition. * preload of the destination chapter of the transition.
*/ */
private fun onTransitionSelected(transition: ChapterTransition) { private fun onTransitionSelected(transition: ChapterTransition) {
@ -194,10 +200,15 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
* Tells this viewer to move to the given [page]. * Tells this viewer to move to the given [page].
*/ */
override fun moveToPage(page: ReaderPage) { override fun moveToPage(page: ReaderPage) {
Timber.d("moveToPage") Timber.d("moveToPage ${page.number}")
val position = adapter.items.indexOf(page) val position = adapter.items.indexOf(page)
if (position != -1) { if (position != -1) {
val currentPosition = pager.currentItem
pager.setCurrentItem(position, true) pager.setCurrentItem(position, true)
// manually call onPageChange since ViewPager listener is not triggered in this case
if (currentPosition == position) {
onPageChange(position)
}
} else { } else {
Timber.d("Page $page not found in adapter") Timber.d("Page $page not found in adapter")
} }

View File

@ -20,6 +20,9 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() {
var items: List<Any> = emptyList() var items: List<Any> = emptyList()
private set private set
var nextTransition: ChapterTransition.Next? = null
private set
/** /**
* Updates this adapter with the given [chapters]. It handles setting a few pages of the * Updates this adapter with the given [chapters]. It handles setting a few pages of the
* next/previous chapter to allow seamless transitions and inverting the pages if the viewer * next/previous chapter to allow seamless transitions and inverting the pages if the viewer
@ -46,7 +49,8 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() {
} }
// Add next chapter transition and pages. // Add next chapter transition and pages.
newItems.add(ChapterTransition.Next(chapters.currChapter, chapters.nextChapter)) nextTransition = ChapterTransition.Next(chapters.currChapter, chapters.nextChapter)
.also { newItems.add(it) }
if (chapters.nextChapter != null) { if (chapters.nextChapter != null) {
// Add at most two pages, because this chapter will be selected before the user can // Add at most two pages, because this chapter will be selected before the user can
// swap more pages. // swap more pages.