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 }