Fix bugs in dual-page split (#4983)
If more bugs appear probably better to go back to the main thread and process dual-pages every time a page is shown as it did before
Cette révision appartient à :
Parent
60f18f3b5a
révision
fe373a95a2
4 fichiers modifiés avec 56 ajouts et 14 suppressions
|
@ -17,6 +17,7 @@ import eu.kanade.tachiyomi.source.SourceManager
|
||||||
import eu.kanade.tachiyomi.source.model.Page
|
import eu.kanade.tachiyomi.source.model.Page
|
||||||
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
|
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
|
||||||
import eu.kanade.tachiyomi.ui.reader.loader.ChapterLoader
|
import eu.kanade.tachiyomi.ui.reader.loader.ChapterLoader
|
||||||
|
import eu.kanade.tachiyomi.ui.reader.model.InsertPage
|
||||||
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
|
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
|
||||||
import eu.kanade.tachiyomi.ui.reader.model.ReaderPage
|
import eu.kanade.tachiyomi.ui.reader.model.ReaderPage
|
||||||
import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters
|
import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters
|
||||||
|
@ -367,6 +368,11 @@ class ReaderPresenter(
|
||||||
|
|
||||||
val selectedChapter = page.chapter
|
val selectedChapter = page.chapter
|
||||||
|
|
||||||
|
// Insert page doesn't change page progress
|
||||||
|
if (page is InsertPage) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Save last page read and mark as read if needed
|
// Save last page read and mark as read if needed
|
||||||
selectedChapter.chapter.last_page_read = page.index
|
selectedChapter.chapter.last_page_read = page.index
|
||||||
val shouldTrack = !preferences.incognitoMode().get() || hasTrackers
|
val shouldTrack = !preferences.incognitoMode().get() || hasTrackers
|
||||||
|
|
|
@ -230,7 +230,7 @@ class PagerPageHolder(
|
||||||
readImageHeaderSubscription = Observable
|
readImageHeaderSubscription = Observable
|
||||||
.fromCallable {
|
.fromCallable {
|
||||||
val stream = streamFn().buffered(16)
|
val stream = streamFn().buffered(16)
|
||||||
openStream = process(stream)
|
openStream = process(item, stream)
|
||||||
|
|
||||||
ImageUtil.findImageType(stream) == ImageUtil.ImageType.GIF
|
ImageUtil.findImageType(stream) == ImageUtil.ImageType.GIF
|
||||||
}
|
}
|
||||||
|
@ -249,7 +249,7 @@ class PagerPageHolder(
|
||||||
.subscribe({}, {})
|
.subscribe({}, {})
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun process(imageStream: InputStream): InputStream {
|
private fun process(page: ReaderPage, imageStream: InputStream): InputStream {
|
||||||
if (!viewer.config.dualPageSplit) {
|
if (!viewer.config.dualPageSplit) {
|
||||||
return imageStream
|
return imageStream
|
||||||
}
|
}
|
||||||
|
@ -263,7 +263,7 @@ class PagerPageHolder(
|
||||||
return imageStream
|
return imageStream
|
||||||
}
|
}
|
||||||
|
|
||||||
onPageSplit()
|
onPageSplit(page)
|
||||||
|
|
||||||
return splitInHalf(imageStream)
|
return splitInHalf(imageStream)
|
||||||
}
|
}
|
||||||
|
@ -287,7 +287,7 @@ class PagerPageHolder(
|
||||||
return ImageUtil.splitInHalf(imageStream, side)
|
return ImageUtil.splitInHalf(imageStream, side)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onPageSplit() {
|
private fun onPageSplit(page: ReaderPage) {
|
||||||
val newPage = InsertPage(page)
|
val newPage = InsertPage(page)
|
||||||
viewer.onPageSplit(page, newPage)
|
viewer.onPageSplit(page, newPage)
|
||||||
}
|
}
|
||||||
|
|
|
@ -192,6 +192,11 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
|
||||||
Timber.d("onReaderPageSelected: ${page.number}/${pages.size}")
|
Timber.d("onReaderPageSelected: ${page.number}/${pages.size}")
|
||||||
activity.onPageSelected(page)
|
activity.onPageSelected(page)
|
||||||
|
|
||||||
|
// Skip preload on inserts it causes unwanted page jumping
|
||||||
|
if (page is InsertPage) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Preload next chapter once we're within the last 5 pages of the current chapter
|
// Preload next chapter once we're within the last 5 pages of the current chapter
|
||||||
val inPreloadRange = pages.size - page.number < 5
|
val inPreloadRange = pages.size - page.number < 5
|
||||||
if (inPreloadRange && allowPreload && page.chapter == adapter.currentChapter) {
|
if (inPreloadRange && allowPreload && page.chapter == adapter.currentChapter) {
|
||||||
|
@ -387,7 +392,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
|
||||||
fun onPageSplit(currentPage: ReaderPage, newPage: InsertPage) {
|
fun onPageSplit(currentPage: ReaderPage, newPage: InsertPage) {
|
||||||
activity.runOnUiThread {
|
activity.runOnUiThread {
|
||||||
// Need to insert on UI thread else images will go blank
|
// Need to insert on UI thread else images will go blank
|
||||||
adapter.onPageSplit(currentPage, newPage, this::class.java)
|
adapter.onPageSplit(currentPage, newPage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,11 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() {
|
||||||
var items: MutableList<Any> = mutableListOf()
|
var items: MutableList<Any> = mutableListOf()
|
||||||
private set
|
private set
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holds preprocessed items so they don't get removed when changing chapter
|
||||||
|
*/
|
||||||
|
private var preprocessed: MutableMap<Int, InsertPage> = mutableMapOf()
|
||||||
|
|
||||||
var nextTransition: ChapterTransition.Next? = null
|
var nextTransition: ChapterTransition.Next? = null
|
||||||
private set
|
private set
|
||||||
|
|
||||||
|
@ -54,10 +59,25 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() {
|
||||||
newItems.add(ChapterTransition.Prev(chapters.currChapter, chapters.prevChapter))
|
newItems.add(ChapterTransition.Prev(chapters.currChapter, chapters.prevChapter))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var insertPageLastPage: InsertPage? = null
|
||||||
|
|
||||||
// Add current chapter.
|
// Add current chapter.
|
||||||
val currPages = chapters.currChapter.pages
|
val currPages = chapters.currChapter.pages
|
||||||
if (currPages != null) {
|
if (currPages != null) {
|
||||||
newItems.addAll(currPages)
|
val pages = currPages.toMutableList()
|
||||||
|
|
||||||
|
val lastPage = pages.last()
|
||||||
|
|
||||||
|
// Insert preprocessed pages into current page list
|
||||||
|
preprocessed.keys.sortedDescending()
|
||||||
|
.forEach { key ->
|
||||||
|
if (lastPage.index == key) {
|
||||||
|
insertPageLastPage = preprocessed[key]
|
||||||
|
}
|
||||||
|
preprocessed[key]?.let { pages.add(key + 1, it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
newItems.addAll(pages)
|
||||||
}
|
}
|
||||||
|
|
||||||
currentChapter = chapters.currChapter
|
currentChapter = chapters.currChapter
|
||||||
|
@ -88,8 +108,14 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() {
|
||||||
newItems.reverse()
|
newItems.reverse()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
preprocessed = mutableMapOf()
|
||||||
items = newItems
|
items = newItems
|
||||||
notifyDataSetChanged()
|
notifyDataSetChanged()
|
||||||
|
|
||||||
|
// Will skip insert page otherwise
|
||||||
|
if (insertPageLastPage != null) {
|
||||||
|
viewer.moveToPage(insertPageLastPage!!)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -125,20 +151,25 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() {
|
||||||
return POSITION_NONE
|
return POSITION_NONE
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onPageSplit(current: Any?, newPage: InsertPage, clazz: Class<out PagerViewer>) {
|
fun onPageSplit(currentPage: Any?, newPage: InsertPage) {
|
||||||
if (current !is ReaderPage) return
|
if (currentPage !is ReaderPage) return
|
||||||
|
|
||||||
val currentIndex = items.indexOf(current)
|
val currentIndex = items.indexOf(currentPage)
|
||||||
|
|
||||||
val placeAtIndex = when {
|
// Put aside preprocessed pages for next chapter so they don't get removed when changing chapter
|
||||||
clazz.isAssignableFrom(L2RPagerViewer::class.java) -> currentIndex + 1
|
if (currentPage.chapter.chapter.id != currentChapter?.chapter?.id) {
|
||||||
clazz.isAssignableFrom(VerticalPagerViewer::class.java) -> currentIndex + 1
|
preprocessed[newPage.index] = newPage
|
||||||
clazz.isAssignableFrom(R2LPagerViewer::class.java) -> currentIndex
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val placeAtIndex = when (viewer) {
|
||||||
|
is L2RPagerViewer,
|
||||||
|
is VerticalPagerViewer -> currentIndex + 1
|
||||||
else -> currentIndex
|
else -> currentIndex
|
||||||
}
|
}
|
||||||
|
|
||||||
// It will enter a endless cycle of insert pages
|
// It will enter a endless cycle of insert pages
|
||||||
if (clazz.isAssignableFrom(R2LPagerViewer::class.java) && items[placeAtIndex - 1] is InsertPage) {
|
if (viewer is R2LPagerViewer && placeAtIndex - 1 >= 0 && items[placeAtIndex - 1] is InsertPage) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Référencer dans un nouveau ticket