From b86eebf0a73f22b9f95ef79d7fb1af67f437a58e Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Tue, 13 Feb 2024 21:43:05 +0800 Subject: [PATCH] Refactor `Context.decodeBitmap` to non-blocking --- .../main/kotlin/com/hippo/ehviewer/image/Image.kt | 5 ++--- .../kotlin/com/hippo/ehviewer/ui/MainActivity.kt | 12 +++++------- .../hippo/ehviewer/ui/screen/GalleryListScreen.kt | 2 +- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/image/Image.kt b/app/src/main/kotlin/com/hippo/ehviewer/image/Image.kt index 5007c916c..1b3acbe00 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/image/Image.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/image/Image.kt @@ -32,7 +32,6 @@ import coil3.BitmapImage import coil3.DrawableImage import coil3.Image as CoilImage import coil3.asCoilImage -import coil3.executeBlocking import coil3.imageLoader import coil3.request.CachePolicy import coil3.request.ErrorResult @@ -168,14 +167,14 @@ class Image private constructor(image: CoilImage, private val src: AutoCloseable }.getOrNull() } - fun Context.decodeBitmap(uri: Uri): Bitmap { + suspend fun Context.decodeBitmap(uri: Uri): Bitmap { val req = imageRequest { memoryCachePolicy(CachePolicy.DISABLED) data(uri) size(imageSearchMaxSize) scale(Scale.FILL) } - val image = when (val result = appCtx.imageLoader.executeBlocking(req)) { + val image = when (val result = appCtx.imageLoader.execute(req)) { is SuccessResult -> result.image is ErrorResult -> throw result.throwable } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt index f97c93fd2..ae8c9445e 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt @@ -185,12 +185,10 @@ class MainActivity : EhActivity() { } } - private fun saveImageToTempFile(uri: Uri): File? { - val bitmap = runCatching { - decodeBitmap(uri) - }.getOrNull() ?: return null - val temp = AppConfig.createTempFile() ?: return null - return runCatching { + private suspend fun saveImageToTempFile(uri: Uri): File? { + return runSuspendCatching { + val bitmap = decodeBitmap(uri) + val temp = AppConfig.createTempFile() FileOutputStream(temp).use { bitmap.compress(Bitmap.CompressFormat.JPEG, 90, it) } temp }.getOrElse { @@ -274,7 +272,7 @@ class MainActivity : EhActivity() { } else if (type != null && type.startsWith("image/")) { val uri = intent.getParcelableExtraCompat(Intent.EXTRA_STREAM) if (null != uri) { - val temp = saveImageToTempFile(uri) + val temp = withIOContext { saveImageToTempFile(uri) } if (null != temp) { navController.navigate( ListUrlBuilder( diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt index 7b924627c..266a6b1f7 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt @@ -552,7 +552,7 @@ fun GalleryListScreen(lub: ListUrlBuilder, navigator: DestinationsNavigator) { } val uri = Uri.parse(imagePath) val temp = AppConfig.createTempFile() ?: return@SearchBarScreen - val bitmap = context.decodeBitmap(uri) ?: return@SearchBarScreen + val bitmap = context.decodeBitmap(uri) temp.outputStream().use { bitmap.compress(Bitmap.CompressFormat.JPEG, 90, it) } builder.imagePath = temp.path builder.isUseSimilarityScan = useSimilarityScan