ComposeImageHelper.kt (2392B) - raw
1 package me.rhunk.snapenhance.ui.util.coil 2 3 import android.content.Context 4 import android.graphics.drawable.ColorDrawable 5 import androidx.compose.foundation.Image 6 import androidx.compose.foundation.layout.height 7 import androidx.compose.foundation.layout.requiredWidthIn 8 import androidx.compose.material3.MaterialTheme 9 import androidx.compose.runtime.Composable 10 import androidx.compose.ui.Modifier 11 import androidx.compose.ui.draw.clip 12 import androidx.compose.ui.layout.ContentScale 13 import androidx.compose.ui.unit.dp 14 import coil.compose.rememberAsyncImagePainter 15 import coil.request.ImageRequest 16 import coil.size.Precision 17 import me.rhunk.snapenhance.R 18 import me.rhunk.snapenhance.RemoteSideContext 19 import me.rhunk.snapenhance.common.data.download.MediaEncryptionKeyPair 20 21 @Composable 22 fun BitmojiImage(context: RemoteSideContext, modifier: Modifier = Modifier, size: Int = 48, url: String?) { 23 Image( 24 painter = rememberAsyncImagePainter( 25 model = ImageRequestHelper.newBitmojiImageRequest( 26 context.androidContext, 27 url 28 ), 29 imageLoader = context.imageLoader 30 ), 31 contentDescription = null, 32 contentScale = ContentScale.Inside, 33 modifier = Modifier 34 .requiredWidthIn(min = 0.dp, max = size.dp) 35 .height(size.dp) 36 .clip(MaterialTheme.shapes.medium) 37 .then(modifier) 38 ) 39 } 40 41 fun ImageRequest.Builder.cacheKey(key: String?) = apply { 42 memoryCacheKey(key) 43 diskCacheKey(key) 44 } 45 46 object ImageRequestHelper { 47 fun newBitmojiImageRequest(context: Context, url: String?) = ImageRequest.Builder(context) 48 .data(url) 49 .fallback(R.drawable.bitmoji_blank) 50 .precision(Precision.INEXACT) 51 .crossfade(true) 52 .cacheKey(url) 53 .build() 54 55 fun newPreviewImageRequest(context: Context, url: String, mediaEncryptionKeyPair: MediaEncryptionKeyPair? = null) = ImageRequest.Builder(context) 56 .cacheKey(url) 57 .precision(Precision.INEXACT) 58 .crossfade(true) 59 .placeholder(ColorDrawable(0x1EFFFFFF)) 60 .crossfade(200) 61 .data(url) 62 .decoderFactory { result, _, _ -> 63 CoilPreviewDecoder( 64 context.resources, 65 result, 66 mediaEncryptionKeyPair, 67 mergeOverlay = true 68 ) 69 } 70 .build() 71 }