Maybe help with double page jankyness

This commit is contained in:
Jobobby04 2021-10-23 22:19:18 -04:00
parent ef9a4ee643
commit 4d7d451fde
3 changed files with 45 additions and 9 deletions

View File

@ -26,6 +26,7 @@ import eu.kanade.tachiyomi.widget.ViewPagerAdapter
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import logcat.LogPriority import logcat.LogPriority
import rx.Observable import rx.Observable
import rx.Subscription import rx.Subscription
@ -103,7 +104,6 @@ class PagerPageHolder(
var extraStatus: Int = 0 var extraStatus: Int = 0
var progress: Int = 0 var progress: Int = 0
var extraProgress: Int = 0 var extraProgress: Int = 0
private var skipExtra = false
var scope: CoroutineScope? = null var scope: CoroutineScope? = null
// SY <-- // SY <--
@ -374,12 +374,12 @@ class PagerPageHolder(
if (page.fullPage) return imageStream if (page.fullPage) return imageStream
if (ImageUtil.isAnimatedAndSupported(imageStream)) { if (ImageUtil.isAnimatedAndSupported(imageStream)) {
page.fullPage = true page.fullPage = true
skipExtra = true splitDoublePages()
return imageStream return imageStream
} else if (ImageUtil.isAnimatedAndSupported(imageStream2)) { } else if (ImageUtil.isAnimatedAndSupported(imageStream2)) {
page.isolatedPage = true page.isolatedPage = true
extraPage?.fullPage = true extraPage?.fullPage = true
skipExtra = true splitDoublePages()
return imageStream return imageStream
} }
val imageBytes = imageStream.readBytes() val imageBytes = imageStream.readBytes()
@ -389,7 +389,7 @@ class PagerPageHolder(
imageStream2.close() imageStream2.close()
imageStream.close() imageStream.close()
page.fullPage = true page.fullPage = true
skipExtra = true splitDoublePages()
logcat(LogPriority.ERROR, e) { "Cannot combine pages" } logcat(LogPriority.ERROR, e) { "Cannot combine pages" }
return imageBytes.inputStream() return imageBytes.inputStream()
} }
@ -401,7 +401,7 @@ class PagerPageHolder(
imageStream2.close() imageStream2.close()
imageStream.close() imageStream.close()
page.fullPage = true page.fullPage = true
skipExtra = true splitDoublePages()
return imageBytes.inputStream() return imageBytes.inputStream()
} }
@ -412,8 +412,8 @@ class PagerPageHolder(
imageStream2.close() imageStream2.close()
imageStream.close() imageStream.close()
extraPage?.fullPage = true extraPage?.fullPage = true
skipExtra = true
page.isolatedPage = true page.isolatedPage = true
splitDoublePages()
logcat(LogPriority.ERROR, e) { "Cannot combine pages" } logcat(LogPriority.ERROR, e) { "Cannot combine pages" }
return imageBytes.inputStream() return imageBytes.inputStream()
} }
@ -426,7 +426,7 @@ class PagerPageHolder(
imageStream.close() imageStream.close()
extraPage?.fullPage = true extraPage?.fullPage = true
page.isolatedPage = true page.isolatedPage = true
skipExtra = true splitDoublePages()
return imageBytes.inputStream() return imageBytes.inputStream()
} }
val isLTR = (viewer !is R2LPagerViewer).xor(viewer.config.invertDoublePages) val isLTR = (viewer !is R2LPagerViewer).xor(viewer.config.invertDoublePages)
@ -444,6 +444,16 @@ class PagerPageHolder(
} }
} }
private fun splitDoublePages() {
scope?.launchUI {
delay(100)
viewer.splitDoublePages(page)
if (extraPage?.fullPage == true || page.fullPage) {
extraPage = null
}
}
}
private fun splitInHalf(imageStream: InputStream): InputStream { private fun splitInHalf(imageStream: InputStream): InputStream {
var side = when { var side = when {
viewer is L2RPagerViewer && page is InsertPage -> ImageUtil.Side.RIGHT viewer is L2RPagerViewer && page is InsertPage -> ImageUtil.Side.RIGHT

View File

@ -28,7 +28,7 @@ import kotlin.math.min
@Suppress("LeakingThis") @Suppress("LeakingThis")
abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer { abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
private val scope = MainScope() val scope = MainScope()
/** /**
* View pager used by this viewer. It's abstract to implement L2R, R2L and vertical pagers on * View pager used by this viewer. It's abstract to implement L2R, R2L and vertical pagers on
@ -167,7 +167,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
/** /**
* Called when a new page (either a [ReaderPage] or [ChapterTransition]) is marked as active * Called when a new page (either a [ReaderPage] or [ChapterTransition]) is marked as active
*/ */
private fun onPageChange(position: Int) { fun onPageChange(position: Int) {
val page = adapter.joinedItems.getOrNull(position) val page = adapter.joinedItems.getOrNull(position)
if (page != null && currentPage != page) { if (page != null && currentPage != page) {
val allowPreload = checkAllowPreload(page.first as? ReaderPage) val allowPreload = checkAllowPreload(page.first as? ReaderPage)
@ -439,6 +439,10 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
adapter.pageToShift = page ?: adapter.joinedItems.getOrNull(pager.currentItem)?.first as? ReaderPage adapter.pageToShift = page ?: adapter.joinedItems.getOrNull(pager.currentItem)?.first as? ReaderPage
} }
fun splitDoublePages(currentPage: ReaderPage) {
adapter.splitDoublePages(currentPage)
}
fun getShiftedPage(): ReaderPage? = adapter.pageToShift fun getShiftedPage(): ReaderPage? = adapter.pageToShift
// SY <-- // SY <--
} }

View File

@ -8,9 +8,11 @@ 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
import eu.kanade.tachiyomi.ui.reader.viewer.hasMissingChapters import eu.kanade.tachiyomi.ui.reader.viewer.hasMissingChapters
import eu.kanade.tachiyomi.util.lang.launchUI
import eu.kanade.tachiyomi.util.system.createReaderThemeContext import eu.kanade.tachiyomi.util.system.createReaderThemeContext
import eu.kanade.tachiyomi.util.system.logcat import eu.kanade.tachiyomi.util.system.logcat
import eu.kanade.tachiyomi.widget.ViewPagerAdapter import eu.kanade.tachiyomi.widget.ViewPagerAdapter
import kotlinx.coroutines.delay
import kotlin.math.max import kotlin.math.max
/** /**
@ -358,5 +360,25 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() {
} }
viewer.pager.setCurrentItem(index, false) viewer.pager.setCurrentItem(index, false)
} }
fun splitDoublePages(current: ReaderPage) {
val oldCurrent = joinedItems.getOrNull(viewer.pager.currentItem)
setJoinedItems(
oldCurrent?.second == current ||
(current.index + 1) < (
(
oldCurrent?.second
?: oldCurrent?.first
) as? ReaderPage
)?.index ?: 0
)
// The listener may be removed when we split a page, so the ui may not have updated properly
// This case usually happens when we load a new chapter and the first 2 pages need to split og
viewer.scope.launchUI {
delay(100)
viewer.onPageChange(viewer.pager.currentItem)
}
}
// SY <-- // SY <--
} }