refactor: Refactor PagerPageHolder

This commit is contained in:
Ahmad Ansori Palembani 2024-06-12 10:54:13 +07:00
parent 644032190c
commit 9857ff943e
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6

View file

@ -33,11 +33,13 @@ import eu.kanade.tachiyomi.util.system.ImageUtil.isPagePadded
import eu.kanade.tachiyomi.util.system.ThemeUtil import eu.kanade.tachiyomi.util.system.ThemeUtil
import eu.kanade.tachiyomi.util.system.bottomCutoutInset import eu.kanade.tachiyomi.util.system.bottomCutoutInset
import eu.kanade.tachiyomi.util.system.dpToPx import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.util.system.isInNightMode import eu.kanade.tachiyomi.util.system.isInNightMode
import eu.kanade.tachiyomi.util.system.launchIO import eu.kanade.tachiyomi.util.system.launchIO
import eu.kanade.tachiyomi.util.system.launchUI import eu.kanade.tachiyomi.util.system.launchUI
import eu.kanade.tachiyomi.util.system.topCutoutInset import eu.kanade.tachiyomi.util.system.topCutoutInset
import eu.kanade.tachiyomi.util.system.withIOContext
import eu.kanade.tachiyomi.util.system.withUIContext import eu.kanade.tachiyomi.util.system.withUIContext
import eu.kanade.tachiyomi.util.view.backgroundColor import eu.kanade.tachiyomi.util.view.backgroundColor
import eu.kanade.tachiyomi.util.view.isVisibleOnScreen import eu.kanade.tachiyomi.util.view.isVisibleOnScreen
@ -87,41 +89,12 @@ class PagerPageHolder(
*/ */
private var loadJob: Job? = null private var loadJob: Job? = null
/**
* Job for status changes of the page.
*/
private var statusJob: Job? = null
/**
* Job for progress changes of the page.
*/
private var progressJob: Job? = null
/** /**
* Job for loading the page. * Job for loading the page.
*/ */
private var extraLoadJob: Job? = null private var extraLoadJob: Job? = null
/**
* Job for status changes of the page.
*/
private var extraStatusJob: Job? = null
/**
* Job for progress changes of the page.
*/
private var extraProgressJob: Job? = null
/**
* Job used to read the header of the image. This is needed in order to instantiate
* the appropriate image view depending if the image is animated (GIF).
*/
private var readImageHeaderJob: Job? = null
private var status = Page.State.READY private var status = Page.State.READY
private var extraStatus = Page.State.READY
private var progress: Int = 0
private var extraProgress: Int = 0
private var scope = MainScope() private var scope = MainScope()
@ -190,12 +163,12 @@ class PagerPageHolder(
*/ */
override fun onDetachedFromWindow() { override fun onDetachedFromWindow() {
super.onDetachedFromWindow() super.onDetachedFromWindow()
loadJob?.cancel() loadJob?.cancel()
loadJob = null loadJob = null
extraLoadJob?.cancel() extraLoadJob?.cancel()
extraLoadJob = null extraLoadJob = null
cancelReadImageHeader()
(pageView as? SubsamplingScaleImageView)?.setOnImageEventListener(null) (pageView as? SubsamplingScaleImageView)?.setOnImageEventListener(null)
} }
@ -334,14 +307,6 @@ class PagerPageHolder(
} }
} }
/**
* Unsubscribes from the read image header subscription.
*/
private fun cancelReadImageHeader() {
readImageHeaderJob?.cancel()
readImageHeaderJob = null
}
/** /**
* Called when the page is queued. * Called when the page is queued.
*/ */
@ -369,7 +334,7 @@ class PagerPageHolder(
/** /**
* Called when the page is ready. * Called when the page is ready.
*/ */
private fun setImage() { private suspend fun setImage() {
progressBar.isVisible = true progressBar.isVisible = true
if (extraPage == null) { if (extraPage == null) {
progressBar.completeAndFadeOut() progressBar.completeAndFadeOut()
@ -378,59 +343,60 @@ class PagerPageHolder(
} }
errorLayout?.isVisible = false errorLayout?.isVisible = false
cancelReadImageHeader() val streamFn = page.stream ?: return
readImageHeaderJob = scope.launchIO {
val streamFn = page.stream ?: return@launchIO
val streamFn2 = extraPage?.stream val streamFn2 = extraPage?.stream
var actualSource: BufferedSource? = null
try { try {
val source1 = streamFn().buffered(16).use { Buffer().readFrom(it) } val (source, isAnimated, _bg) = withIOContext {
val source2 = streamFn2?.invoke()?.buffered(16)?.use { Buffer().readFrom(it) } streamFn().buffered(16).use { source1 ->
if (extraPage != null) {
streamFn2?.invoke()
?.buffered(16)
} else {
null
}.use { source2 ->
val actualSource = this@PagerPageHolder.mergeOrSplitPages(
Buffer().readFrom(source1),
source2?.let { Buffer().readFrom(it) },
)
actualSource = this@PagerPageHolder.mergeOrSplitPages(source1, source2) val isAnimated = ImageUtil.isAnimatedAndSupported(actualSource)
val isAnimated = ImageUtil.isAnimatedAndSupported(source1) ||
(source2?.let { ImageUtil.isAnimatedAndSupported(source2) } ?: false)
withUIContext {
val bgColor = ReaderBackgroundColor.fromPreference(viewer.config.readerTheme) val bgColor = ReaderBackgroundColor.fromPreference(viewer.config.readerTheme)
if (!isAnimated) {
if (bgColor.isSmartColor) {
val bgType = getBGType(viewer.config.readerTheme, context) val bgType = getBGType(viewer.config.readerTheme, context)
if (page.bg != null && page.bgType == bgType) { val background = if (!isAnimated && bgColor.isSmartColor) {
setImage(actualSource, false, imageConfig) if (page.bg != null && page.bgType == bgType) page.bg
pageView?.background = page.bg
}
// if the user switches to automatic when pages are already cached, the bg needs to be loaded
else { else {
val background =
try { try {
setBG(actualSource.peek().inputStream()) setBG(actualSource.peek().inputStream())
} catch (e: Exception) { } catch (e: Exception) {
Logger.e(e) { e.localizedMessage?.toString() ?: "" } Logger.e(e) { e.localizedMessage?.toString() ?: "" }
ColorDrawable(Color.WHITE) ColorDrawable(Color.WHITE)
} }
setImage(actualSource, false, imageConfig) }
} else if (bgColor.isSmartColor && page.bg != null) {
page.bg
} else {
null
}
pageView?.background = background Triple(actualSource, isAnimated, Pair(background, bgType))
}
}
}
withUIContext {
val (bg, bgType) = _bg
if (bg != null) pageView?.background = bg
if (!isAnimated && page.bg == null && page.bgType != bgType) {
page.bg = pageView?.background page.bg = pageView?.background
page.bgType = bgType page.bgType = bgType
} }
} else { setImage(source, isAnimated, imageConfig)
setImage(actualSource, false, imageConfig)
}
} else {
setImage(actualSource, true, imageConfig)
if (bgColor.isSmartColor && page.bg != null) {
pageView?.background = page.bg
}
}
}
} catch (_: Exception) {
try {
actualSource?.let { closeSources(it) }
} catch (_: Exception) {
} }
} catch (e: Exception) {
Logger.e(e)
withUIContext {
setError()
} }
} }
} }