From aa1e2102fccae8d125336a213abc0e19b94c9740 Mon Sep 17 00:00:00 2001 From: tarsin Date: Mon, 22 May 2023 21:53:59 +0800 Subject: [PATCH] Fix deprecated coil API --- .../java/com/hippo/ehviewer/coil/DiskCache.kt | 21 ------------- .../hippo/ehviewer/coil/DiskCacheScoped.kt | 18 +++++++++++ .../com/hippo/ehviewer/spider/SpiderDen.kt | 22 +++++++------- .../com/hippo/ehviewer/spider/SpiderInfo.kt | 30 +++++++++---------- .../com/hippo/ehviewer/spider/SpiderQueen.kt | 6 ++-- .../hippo/ehviewer/ui/scene/DownloadsScene.kt | 5 ++-- .../ehviewer/ui/scene/GalleryDetailScene.kt | 4 ++- 7 files changed, 52 insertions(+), 54 deletions(-) delete mode 100644 app/src/main/java/com/hippo/ehviewer/coil/DiskCache.kt create mode 100644 app/src/main/java/com/hippo/ehviewer/coil/DiskCacheScoped.kt diff --git a/app/src/main/java/com/hippo/ehviewer/coil/DiskCache.kt b/app/src/main/java/com/hippo/ehviewer/coil/DiskCache.kt deleted file mode 100644 index f916ba67f..000000000 --- a/app/src/main/java/com/hippo/ehviewer/coil/DiskCache.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.hippo.ehviewer.coil - -import coil.disk.DiskCache - -inline fun DiskCache.edit(key: String, block: DiskCache.Editor.() -> Unit): Boolean { - val editor = edit(key) ?: return false - editor.runCatching { - block(this) - }.onFailure { - editor.abort() - throw it - }.onSuccess { - editor.commit() - } - return true -} - -inline fun DiskCache.read(key: String, block: DiskCache.Snapshot.() -> Unit): Boolean { - (get(key) ?: return false).use { block(it) } - return true -} diff --git a/app/src/main/java/com/hippo/ehviewer/coil/DiskCacheScoped.kt b/app/src/main/java/com/hippo/ehviewer/coil/DiskCacheScoped.kt new file mode 100644 index 000000000..6e52e9972 --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/coil/DiskCacheScoped.kt @@ -0,0 +1,18 @@ +package com.hippo.ehviewer.coil + +import coil.disk.DiskCache + +suspend inline fun DiskCache.edit(key: String, crossinline block: suspend DiskCache.Editor.() -> Unit): Boolean { + val editor = openEditor(key) ?: return false + editor.runCatching { + block(this) + }.onFailure { + editor.abort() + throw it + }.onSuccess { + editor.commit() + } + return true +} + +inline fun DiskCache.read(key: String, block: DiskCache.Snapshot.() -> T): T? = openSnapshot(key)?.use(block) diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt index 1eb93e828..b44318941 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt @@ -64,7 +64,7 @@ class SpiderDen(private val mGalleryInfo: GalleryInfo) { private fun containInCache(index: Int): Boolean { val key = getImageKey(mGid, index) - return sCache[key]?.use { true } ?: false + return sCache.read(key) { true } ?: false } private fun containInDownloadDir(index: Int): Boolean { @@ -84,11 +84,11 @@ class SpiderDen(private val mGalleryInfo: GalleryInfo) { it sendTo outFd } } - } - }.getOrElse { + true + } ?: false + }.onFailure { it.printStackTrace() - false - } + }.getOrDefault(false) } operator fun contains(index: Int): Boolean { @@ -199,12 +199,11 @@ class SpiderDen(private val mGalleryInfo: GalleryInfo) { val key = getImageKey(mGid, index) // Read from diskCache first - sCache[key]?.use { snapshot -> + sCache.read(key) { runCatching { - UniFile.fromFile(snapshot.data.toFile())!!.openFileDescriptor("r").use { + UniFile.fromFile(data.toFile())!!.openFileDescriptor("r").use { it sendTo toFd } - }.onSuccess { return true }.onFailure { it.printStackTrace() @@ -235,15 +234,14 @@ class SpiderDen(private val mGalleryInfo: GalleryInfo) { fun getExtension(index: Int): String? { val key = getImageKey(mGid, index) - return sCache[key]?.use { it.metadata.toNioPath().readText() } - ?: downloadDir?.let { findImageFile(it, index) } - ?.name.let { FileUtils.getExtensionFromFilename(it) } + return sCache.read(key) { metadata.toNioPath().readText() } + ?: downloadDir?.let { findImageFile(it, index) }?.name.let { FileUtils.getExtensionFromFilename(it) } } fun getImageSource(index: Int): CloseableSource? { if (mode == SpiderQueen.MODE_READ) { val key = getImageKey(mGid, index) - val snapshot = sCache[key] + val snapshot = sCache.openSnapshot(key) if (snapshot != null) { val source = ImageDecoder.createSource(snapshot.data.toFile()) return object : CloseableSource, AutoCloseable by snapshot { diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfo.kt b/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfo.kt index b18c97e33..d4ea01f75 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfo.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfo.kt @@ -2,6 +2,8 @@ package com.hippo.ehviewer.spider import coil.disk.DiskCache import com.hippo.ehviewer.EhApplication +import com.hippo.ehviewer.coil.edit +import com.hippo.ehviewer.coil.read import com.hippo.ehviewer.legacy.readLegacySpiderInfo import com.hippo.unifile.UniFile import com.hippo.unifile.openInputStream @@ -10,6 +12,7 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.cbor.Cbor import kotlinx.serialization.decodeFromByteArray import kotlinx.serialization.encodeToByteArray +import moe.tarsin.coroutines.runSuspendCatching import java.io.File @Serializable @@ -35,15 +38,13 @@ fun SpiderInfo.write(file: UniFile) { } } -fun SpiderInfo.saveToCache() { - val entry = spiderInfoCache.edit(gid.toString()) ?: return - runCatching { - entry.data.toFile().writeBytes(Cbor.encodeToByteArray(this)) +suspend fun SpiderInfo.saveToCache() { + runSuspendCatching { + spiderInfoCache.edit(gid.toString()) { + data.toFile().writeBytes(Cbor.encodeToByteArray(this)) + } }.onFailure { it.printStackTrace() - entry.abort() - }.onSuccess { - entry.commit() } } @@ -54,14 +55,13 @@ private val spiderInfoCache by lazy { } fun readFromCache(gid: Long): SpiderInfo? { - val snapshot = spiderInfoCache[gid.toString()] ?: return null - return runCatching { - snapshot.use { - return Cbor.decodeFromByteArray(it.data.toFile().readBytes()) - } - }.onFailure { - it.printStackTrace() - }.getOrNull() + return spiderInfoCache.read(gid.toString()) { + runCatching { + Cbor.decodeFromByteArray(data.toFile().readBytes()) + }.onFailure { + it.printStackTrace() + }.getOrNull() + } } fun readCompatFromUniFile(file: UniFile): SpiderInfo? { diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.kt b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.kt index 6db2d2f19..41a2aa60e 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.kt @@ -49,6 +49,7 @@ import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.delay import kotlinx.coroutines.ensureActive import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withLock @@ -335,8 +336,7 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS it.gid == galleryInfo.gid && it.token == galleryInfo.token } } - } - ?: readFromCache(galleryInfo.gid)?.takeIf { it.gid == galleryInfo.gid && it.token == galleryInfo.token } + } ?: readFromCache(galleryInfo.gid)?.takeIf { it.gid == galleryInfo.gid && it.token == galleryInfo.token } } @Throws(ParseException::class) @@ -427,7 +427,7 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS private fun writeSpiderInfoToLocal() { if (!isReady) return mSpiderDen.downloadDir?.run { createFile(SPIDER_INFO_FILENAME).also { mSpiderInfo.write(it) } } - mSpiderInfo.saveToCache() + runBlocking { mSpiderInfo.saveToCache() } } private fun isStateDone(state: Int): Boolean { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt index 88518c769..873d3c266 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt @@ -59,6 +59,7 @@ import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.coil.imageRequest +import com.hippo.ehviewer.coil.read import com.hippo.ehviewer.dao.DownloadInfo import com.hippo.ehviewer.databinding.DrawerListRvBinding import com.hippo.ehviewer.databinding.ItemDownloadBinding @@ -912,8 +913,8 @@ class DownloadsScene : if (!thumbLocation.exists()) { thumbLocation.ensureFile() val key = info.thumbKey!! - imageCache[key]?.use { - UniFile.fromFile(it.data.toFile())!!.openFileDescriptor("r").use { src -> + imageCache.read(key) { + UniFile.fromFile(data.toFile())!!.openFileDescriptor("r").use { src -> thumbLocation.openFileDescriptor("w").use { dst -> src sendTo dst } 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 22cf8d630..4f14f4d10 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 @@ -116,6 +116,7 @@ import coil.imageLoader import com.google.android.material.progressindicator.CircularProgressIndicator import com.google.android.material.snackbar.Snackbar import com.hippo.ehviewer.EhApplication.Companion.galleryDetailCache +import com.hippo.ehviewer.EhApplication.Companion.imageCache import com.hippo.ehviewer.EhDB import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings @@ -139,6 +140,7 @@ import com.hippo.ehviewer.client.parser.ParserUtils import com.hippo.ehviewer.client.parser.TorrentParser import com.hippo.ehviewer.coil.imageRequest import com.hippo.ehviewer.coil.justDownload +import com.hippo.ehviewer.coil.read import com.hippo.ehviewer.dao.DownloadInfo import com.hippo.ehviewer.dao.Filter import com.hippo.ehviewer.download.DownloadManager.DownloadInfoListener @@ -1217,7 +1219,7 @@ class GalleryDetailScene : BaseScene(), DownloadInfoListener { } try { val key = composeBindingGI!!.thumbKey!! - val path = imageLoader(context).diskCache!![key]!!.use { it.data } + val path = imageCache.read(key) { data } val lub = ListUrlBuilder() lub.mode = ListUrlBuilder.MODE_IMAGE_SEARCH lub.imagePath = path.toString()