From 99ed2b35d3c564c07daa5b599478830d054ff95d Mon Sep 17 00:00:00 2001 From: tarsin Date: Mon, 1 May 2023 11:45:32 +0800 Subject: [PATCH] Store imageKey in GalleryPreview to mitigate Parcelable too large --- .../hippo/ehviewer/client/EhCacheKeyFactory.kt | 15 +++++++++++++++ .../hippo/ehviewer/client/data/GalleryPreview.kt | 6 +++--- .../ehviewer/client/parser/GalleryDetailParser.kt | 9 +++++---- .../java/com/hippo/ehviewer/coil/Extensions.kt | 12 +++++++++++- .../hippo/ehviewer/ui/scene/GalleryDetailScene.kt | 4 ++-- .../ehviewer/ui/scene/GalleryPreviewsScene.kt | 2 +- .../com/hippo/ehviewer/ui/widget/EhAsyncThumb.kt | 8 +++++++- 7 files changed, 44 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhCacheKeyFactory.kt b/app/src/main/java/com/hippo/ehviewer/client/EhCacheKeyFactory.kt index ecb9349d0..beef112fa 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhCacheKeyFactory.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhCacheKeyFactory.kt @@ -15,6 +15,14 @@ */ package com.hippo.ehviewer.client +import com.hippo.ehviewer.client.data.GalleryPreview +import com.hippo.ehviewer.client.data.NormalGalleryPreview + +// ExHentai Large Preview: https://exhentai.org/t/*** +// ExHentai Normal Preview: https://exhentai.org/m/*** +// EHentai Normal Preview: https://ehgt.org/m/*** +// EHentai Large Preview: https://ehgt.org/*** + private const val URL_PREFIX_THUMB_E = "https://ehgt.org/" private const val URL_PREFIX_THUMB_EX = "https://exhentai.org/" @@ -27,3 +35,10 @@ fun getPreviewThumbKey(url: String): String { .removePrefix(URL_PREFIX_THUMB_EX) .removePrefix("t/") } + +val GalleryPreview.url + get() = if (this is NormalGalleryPreview) { + if (EhUtils.isExHentai) URL_PREFIX_THUMB_EX + imageKey else URL_PREFIX_THUMB_E + imageKey + } else { + if (EhUtils.isExHentai) URL_PREFIX_THUMB_EX + "t/" + imageKey else URL_PREFIX_THUMB_E + imageKey + } diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/GalleryPreview.kt b/app/src/main/java/com/hippo/ehviewer/client/data/GalleryPreview.kt index e6e5008f5..98383acfa 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/data/GalleryPreview.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/data/GalleryPreview.kt @@ -19,19 +19,19 @@ import android.os.Parcelable import kotlinx.parcelize.Parcelize interface GalleryPreview : Parcelable { - val imageUrl: String + val imageKey: String val position: Int } @Parcelize data class LargeGalleryPreview( - override val imageUrl: String, + override val imageKey: String, override val position: Int, ) : GalleryPreview @Parcelize data class NormalGalleryPreview( - override val imageUrl: String, + override val imageKey: String, override val position: Int, val offsetX: Int, val offsetY: Int, diff --git a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryDetailParser.kt b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryDetailParser.kt index 49d00123c..b478c9756 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryDetailParser.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryDetailParser.kt @@ -33,6 +33,7 @@ import com.hippo.ehviewer.client.exception.EhException import com.hippo.ehviewer.client.exception.OffensiveException import com.hippo.ehviewer.client.exception.ParseException import com.hippo.ehviewer.client.exception.PiningException +import com.hippo.ehviewer.client.getPreviewThumbKey import com.hippo.util.ExceptionUtils import com.hippo.util.JsoupUtils import com.hippo.yorozuya.NumberUtils @@ -480,9 +481,9 @@ object GalleryDetailParser { check(PATTERN_LARGE_PREVIEW.containsMatchIn(body)) return PATTERN_LARGE_PREVIEW.findAll(body).unzip { val position = it.groupValues[2].toInt() - 1 - val imageUrl = it.groupValues[3].trim() + val imageKey = getPreviewThumbKey(it.groupValues[3].trim()) val pageUrl = it.groupValues[1].trim() - LargeGalleryPreview(imageUrl, position) to pageUrl + LargeGalleryPreview(imageKey, position) to pageUrl }.run { first.toList() to second.toList() } @@ -492,13 +493,13 @@ object GalleryDetailParser { check(PATTERN_NORMAL_PREVIEW.containsMatchIn(body)) return PATTERN_NORMAL_PREVIEW.findAll(body).unzip { val position = it.groupValues[6].toInt() - 1 - val imageUrl = it.groupValues[3].trim() + val imageKey = getPreviewThumbKey(it.groupValues[3].trim()) val xOffset = it.groupValues[4].toIntOrNull() ?: 0 val yOffset = 0 val width = it.groupValues[1].toInt() val height = it.groupValues[2].toInt() val pageUrl = it.groupValues[5].trim() - NormalGalleryPreview(imageUrl, position, xOffset, yOffset, width, height) to pageUrl + NormalGalleryPreview(imageKey, position, xOffset, yOffset, width, height) to pageUrl }.run { first.toList() to second.toList() } diff --git a/app/src/main/java/com/hippo/ehviewer/coil/Extensions.kt b/app/src/main/java/com/hippo/ehviewer/coil/Extensions.kt index 14794fa1a..6e23453f3 100644 --- a/app/src/main/java/com/hippo/ehviewer/coil/Extensions.kt +++ b/app/src/main/java/com/hippo/ehviewer/coil/Extensions.kt @@ -4,7 +4,9 @@ import android.content.Context import coil.disk.DiskCache import coil.request.ImageRequest import coil.size.Size +import com.hippo.ehviewer.client.data.GalleryPreview import com.hippo.ehviewer.client.getPreviewThumbKey +import com.hippo.ehviewer.client.url fun ImageRequest.Builder.ehUrl(url: String?) = apply { url?.let { @@ -16,5 +18,13 @@ fun ImageRequest.Builder.ehUrl(url: String?) = apply { } } -inline fun Context.imageRequest(url: String?, builder: ImageRequest.Builder.() -> Unit = {}) = ImageRequest.Builder(this).ehUrl(url).apply(builder).build() +fun ImageRequest.Builder.ehPreviewKey(key: GalleryPreview) = apply { + data(key.url) + memoryCacheKey(key.imageKey) + diskCacheKey(key.imageKey) + size(Size.ORIGINAL) +} + +inline fun Context.imageRequest(key: GalleryPreview, builder: ImageRequest.Builder.() -> Unit = {}) = ImageRequest.Builder(this).ehPreviewKey(key).apply(builder).build() +inline fun Context.imageRequest(key: String?, builder: ImageRequest.Builder.() -> Unit = {}) = ImageRequest.Builder(this).ehUrl(key).apply(builder).build() inline fun diskCache(builder: DiskCache.Builder.() -> Unit) = DiskCache.Builder().apply(builder).build() diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt index 6c6f470c6..78c3af939 100755 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt @@ -837,7 +837,7 @@ class GalleryDetailScene : BaseScene(), DownloadInfoListener { } Spacer(modifier = Modifier.size(dimensionResource(id = R.dimen.keyline_margin))) if (Settings.showComments) { - GalleryDetailComment(galleryDetail.comments?.comments) + GalleryDetailComment(galleryDetail.comments.comments) Spacer(modifier = Modifier.size(dimensionResource(id = R.dimen.strip_item_padding_v))) } } @@ -931,7 +931,7 @@ class GalleryDetailScene : BaseScene(), DownloadInfoListener { lifecycleScope.launchIO { galleryDetail.previewList.forEach { context?.run { - imageLoader.enqueue(imageRequest(it.imageUrl)) + imageLoader.enqueue(imageRequest(it)) } } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.kt index e7f5b79e7..9cb5339c5 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.kt @@ -187,7 +187,7 @@ class GalleryPreviewsScene : BaseToolbarScene() { val previewList = result.first.first previewList.forEach { context.run { - imageLoader.enqueue(imageRequest(it.imageUrl)) + imageLoader.enqueue(imageRequest(it)) } } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/widget/EhAsyncThumb.kt b/app/src/main/java/com/hippo/ehviewer/ui/widget/EhAsyncThumb.kt index bf4e1821c..d01f70081 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/widget/EhAsyncThumb.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/widget/EhAsyncThumb.kt @@ -27,6 +27,12 @@ fun requestOf(model: String?): ImageRequest { return LocalContext.current.imageRequest(model) } +@Composable +@ReadOnlyComposable +fun requestOf(model: GalleryPreview): ImageRequest { + return LocalContext.current.imageRequest(model) +} + @Composable fun EhAsyncThumb( model: String?, @@ -49,7 +55,7 @@ fun EhAsyncPreview( ) { var contentScale by remember { mutableStateOf(ContentScale.Fit) } AsyncImage( - model = requestOf(model.imageUrl), + model = requestOf(model), contentDescription = "", modifier = modifier, transform = {