diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt index 832a68f95..b86990d5c 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt @@ -20,6 +20,7 @@ */ package com.vitorpamplona.amethyst.ui.components +import android.util.Base64 import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable @@ -70,6 +71,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel import coil.compose.AsyncImagePainter import coil.compose.SubcomposeAsyncImage import coil.compose.SubcomposeAsyncImageContent +import coil.request.ImageRequest import com.vitorpamplona.amethyst.commons.compose.produceCachedState import com.vitorpamplona.amethyst.commons.richtext.Base64Segment import com.vitorpamplona.amethyst.commons.richtext.BechSegment @@ -84,6 +86,7 @@ import com.vitorpamplona.amethyst.commons.richtext.InvoiceSegment import com.vitorpamplona.amethyst.commons.richtext.LinkSegment import com.vitorpamplona.amethyst.commons.richtext.PhoneSegment import com.vitorpamplona.amethyst.commons.richtext.RegularTextSegment +import com.vitorpamplona.amethyst.commons.richtext.RichTextParser import com.vitorpamplona.amethyst.commons.richtext.RichTextViewerState import com.vitorpamplona.amethyst.commons.richtext.SchemelessUrlSegment import com.vitorpamplona.amethyst.commons.richtext.Segment @@ -452,18 +455,34 @@ private fun RenderWordWithPreview( fun ImageFromBase64(base64String: String) { val context = LocalContext.current - SubcomposeAsyncImage( - model = Base64Requester.imageRequest(context, base64String), - contentDescription = null, - contentScale = ContentScale.FillWidth, - modifier = Modifier.fillMaxWidth(), - ) { - when (painter.state) { - is AsyncImagePainter.State.Success -> { - SubcomposeAsyncImageContent() - } + var base64String2 = base64String.removePrefix("data:image/jpeg;base64,") + RichTextParser.imageExtensions.forEach { + base64String2 = base64String2.removePrefix("data:image/$it;base64,") + } - else -> BlankNote() + val imageBytes = runCatching { Base64.decode(base64String2, Base64.DEFAULT) }.getOrNull() + + if (imageBytes == null) { + BlankNote() + } else { + val request = + ImageRequest.Builder(context) + .data(imageBytes) + .build() + + SubcomposeAsyncImage( + model = request, + contentDescription = null, + contentScale = ContentScale.FillWidth, + modifier = Modifier.fillMaxWidth(), + ) { + when (painter.state) { + is AsyncImagePainter.State.Success -> { + SubcomposeAsyncImageContent() + } + + else -> BlankNote() + } } } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt index a1de28941..1970fee3c 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt @@ -48,7 +48,6 @@ import coil.fetch.FetchResult import coil.fetch.Fetcher import coil.request.ImageRequest import coil.request.Options -import com.vitorpamplona.amethyst.commons.richtext.RichTextParser import com.vitorpamplona.amethyst.commons.robohash.CachedRobohash import com.vitorpamplona.amethyst.service.checkNotInMainThread import com.vitorpamplona.amethyst.ui.theme.isLight @@ -183,10 +182,7 @@ class Base64Fetcher( override suspend fun fetch(): FetchResult { checkNotInMainThread() - var base64String = data.toString().removePrefix("data:image/jpeg;base64,") - RichTextParser.imageExtensions.forEach { - base64String = base64String.removePrefix("data:image/$it;base64,") - } + val base64String = data.toString().removePrefix("data:image/jpeg;base64,") val byteArray = Base64.getDecoder().decode(base64String) val bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)