mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2025-09-28 06:57:10 +02:00
@@ -20,6 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.amethyst.ui.components
|
package com.vitorpamplona.amethyst.ui.components
|
||||||
|
|
||||||
|
import android.util.Base64
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.border
|
import androidx.compose.foundation.border
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
@@ -70,6 +71,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel
|
|||||||
import coil.compose.AsyncImagePainter
|
import coil.compose.AsyncImagePainter
|
||||||
import coil.compose.SubcomposeAsyncImage
|
import coil.compose.SubcomposeAsyncImage
|
||||||
import coil.compose.SubcomposeAsyncImageContent
|
import coil.compose.SubcomposeAsyncImageContent
|
||||||
|
import coil.request.ImageRequest
|
||||||
import com.vitorpamplona.amethyst.commons.compose.produceCachedState
|
import com.vitorpamplona.amethyst.commons.compose.produceCachedState
|
||||||
import com.vitorpamplona.amethyst.commons.richtext.Base64Segment
|
import com.vitorpamplona.amethyst.commons.richtext.Base64Segment
|
||||||
import com.vitorpamplona.amethyst.commons.richtext.BechSegment
|
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.LinkSegment
|
||||||
import com.vitorpamplona.amethyst.commons.richtext.PhoneSegment
|
import com.vitorpamplona.amethyst.commons.richtext.PhoneSegment
|
||||||
import com.vitorpamplona.amethyst.commons.richtext.RegularTextSegment
|
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.RichTextViewerState
|
||||||
import com.vitorpamplona.amethyst.commons.richtext.SchemelessUrlSegment
|
import com.vitorpamplona.amethyst.commons.richtext.SchemelessUrlSegment
|
||||||
import com.vitorpamplona.amethyst.commons.richtext.Segment
|
import com.vitorpamplona.amethyst.commons.richtext.Segment
|
||||||
@@ -452,8 +455,23 @@ private fun RenderWordWithPreview(
|
|||||||
fun ImageFromBase64(base64String: String) {
|
fun ImageFromBase64(base64String: String) {
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
|
|
||||||
|
var base64String2 = base64String.removePrefix("data:image/jpeg;base64,")
|
||||||
|
RichTextParser.imageExtensions.forEach {
|
||||||
|
base64String2 = base64String2.removePrefix("data:image/$it;base64,")
|
||||||
|
}
|
||||||
|
|
||||||
|
val imageBytes = runCatching { Base64.decode(base64String2, Base64.DEFAULT) }.getOrNull()
|
||||||
|
|
||||||
|
if (imageBytes == null) {
|
||||||
|
BlankNote()
|
||||||
|
} else {
|
||||||
|
val request =
|
||||||
|
ImageRequest.Builder(context)
|
||||||
|
.data(imageBytes)
|
||||||
|
.build()
|
||||||
|
|
||||||
SubcomposeAsyncImage(
|
SubcomposeAsyncImage(
|
||||||
model = Base64Requester.imageRequest(context, base64String),
|
model = request,
|
||||||
contentDescription = null,
|
contentDescription = null,
|
||||||
contentScale = ContentScale.FillWidth,
|
contentScale = ContentScale.FillWidth,
|
||||||
modifier = Modifier.fillMaxWidth(),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
@@ -467,6 +485,7 @@ fun ImageFromBase64(base64String: String) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun ZoomableContentView(
|
private fun ZoomableContentView(
|
||||||
|
@@ -48,7 +48,6 @@ import coil.fetch.FetchResult
|
|||||||
import coil.fetch.Fetcher
|
import coil.fetch.Fetcher
|
||||||
import coil.request.ImageRequest
|
import coil.request.ImageRequest
|
||||||
import coil.request.Options
|
import coil.request.Options
|
||||||
import com.vitorpamplona.amethyst.commons.richtext.RichTextParser
|
|
||||||
import com.vitorpamplona.amethyst.commons.robohash.CachedRobohash
|
import com.vitorpamplona.amethyst.commons.robohash.CachedRobohash
|
||||||
import com.vitorpamplona.amethyst.service.checkNotInMainThread
|
import com.vitorpamplona.amethyst.service.checkNotInMainThread
|
||||||
import com.vitorpamplona.amethyst.ui.theme.isLight
|
import com.vitorpamplona.amethyst.ui.theme.isLight
|
||||||
@@ -183,10 +182,7 @@ class Base64Fetcher(
|
|||||||
override suspend fun fetch(): FetchResult {
|
override suspend fun fetch(): FetchResult {
|
||||||
checkNotInMainThread()
|
checkNotInMainThread()
|
||||||
|
|
||||||
var base64String = data.toString().removePrefix("data:image/jpeg;base64,")
|
val base64String = data.toString().removePrefix("data:image/jpeg;base64,")
|
||||||
RichTextParser.imageExtensions.forEach {
|
|
||||||
base64String = base64String.removePrefix("data:image/$it;base64,")
|
|
||||||
}
|
|
||||||
|
|
||||||
val byteArray = Base64.getDecoder().decode(base64String)
|
val byteArray = Base64.getDecoder().decode(base64String)
|
||||||
val bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)
|
val bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)
|
||||||
|
Reference in New Issue
Block a user