1818package com.wire.android.ui.home.conversations.model.messagetypes.multipart.standalone
1919
2020import android.graphics.drawable.Drawable
21+ import androidx.compose.foundation.Image
2122import androidx.compose.foundation.background
2223import androidx.compose.foundation.border
2324import androidx.compose.foundation.layout.Arrangement
2425import androidx.compose.foundation.layout.Box
2526import androidx.compose.foundation.layout.Column
27+ import androidx.compose.foundation.layout.aspectRatio
2628import androidx.compose.foundation.layout.fillMaxSize
2729import androidx.compose.foundation.layout.fillMaxWidth
30+ import androidx.compose.foundation.layout.heightIn
2831import androidx.compose.foundation.layout.padding
2932import androidx.compose.foundation.layout.sizeIn
3033import androidx.compose.foundation.shape.RoundedCornerShape
@@ -39,12 +42,14 @@ import androidx.compose.ui.Alignment
3942import androidx.compose.ui.Modifier
4043import androidx.compose.ui.draw.clip
4144import androidx.compose.ui.graphics.Color
45+ import androidx.compose.ui.graphics.asImageBitmap
46+ import androidx.compose.ui.graphics.painter.BitmapPainter
4247import androidx.compose.ui.layout.ContentScale
43- import androidx.compose.ui.platform.LocalContext
4448import androidx.compose.ui.text.style.TextOverflow
45- import coil.compose.AsyncImage
46- import coil.request.CachePolicy
47- import coil.request.ImageRequest
49+ import androidx.core.graphics.drawable.toBitmap
50+ import coil.compose.AsyncImagePainter
51+ import coil.compose.SubcomposeAsyncImage
52+ import coil.compose.SubcomposeAsyncImageContent
4853import com.wire.android.ui.common.applyIf
4954import com.wire.android.ui.common.attachmentdraft.ui.FileHeaderView
5055import com.wire.android.ui.common.colorsScheme
@@ -67,6 +72,7 @@ internal fun EditableAssetPreview(
6772) {
6873 Column (
6974 modifier = Modifier
75+ .heightIn(min = dimensions().spacing80x)
7076 .applyIf(messageStyle == MessageStyle .BUBBLE_SELF ) {
7177 background(colorsScheme().selfBubble.secondary)
7278 }
@@ -100,16 +106,23 @@ internal fun EditableAssetPreview(
100106 )
101107
102108 item.fileName?.let {
103- Text (
104- modifier = Modifier
105- .fillMaxWidth()
106- .padding(start = dimensions().spacing8x, end = dimensions().spacing8x),
107- text = it,
108- style = MaterialTheme .wireTypography.body02,
109- color = messageStyle.textColor(),
110- maxLines = 2 ,
111- overflow = TextOverflow .Ellipsis
112- )
109+ Box (
110+ modifier = Modifier .then(
111+ if (item.previewUrl == null ) Modifier .weight(1f ) else Modifier
112+ )
113+ ) {
114+ Text (
115+ modifier = Modifier
116+ .fillMaxWidth()
117+ .padding(start = dimensions().spacing8x, end = dimensions().spacing8x)
118+ .align(Alignment .BottomStart ),
119+ text = it,
120+ style = MaterialTheme .wireTypography.body02,
121+ maxLines = 2 ,
122+ color = messageStyle.textColor(),
123+ overflow = TextOverflow .Ellipsis
124+ )
125+ }
113126 }
114127
115128 Box (
@@ -124,32 +137,49 @@ internal fun EditableAssetPreview(
124137
125138 item.previewUrl?.let {
126139
127- // Remember recent drawable to use as placeholder to avoid blink on update
128140 var drawable by remember { mutableStateOf<Drawable ?>(null ) }
129141
130- val request = ImageRequest .Builder (LocalContext .current)
131- .diskCacheKey(item.contentHash)
132- .memoryCacheKey(item.contentHash)
133- .placeholderMemoryCacheKey(item.contentHash)
134- .diskCachePolicy(CachePolicy .ENABLED )
135- .memoryCachePolicy(CachePolicy .ENABLED )
136- .placeholder(drawable)
137- .crossfade(true )
138- .data(item.previewUrl)
139- .build()
140-
141- AsyncImage (
142+ SubcomposeAsyncImage (
143+ model = item.previewUrl,
144+ contentDescription = null ,
142145 modifier = Modifier
143146 .fillMaxSize()
147+ .aspectRatio(.8f )
144148 .sizeIn(maxHeight = dimensions().messageDocumentPreviewMaxHeight),
145- model = request,
146- contentDescription = null ,
147- alignment = Alignment .TopStart ,
148149 contentScale = ContentScale .FillWidth ,
149- onSuccess = { result ->
150- drawable = result.result.drawable
150+ ) {
151+ when (painter.state) {
152+ is AsyncImagePainter .State .Loading -> {
153+ drawable?.let {
154+ val painter = drawable?.toBitmap()?.asImageBitmap()?.let { BitmapPainter (it) }
155+ painter?.let { paint ->
156+ Image (
157+ painter = paint,
158+ contentDescription = null ,
159+ contentScale = ContentScale .FillWidth ,
160+ modifier = Modifier .fillMaxSize()
161+ )
162+ }
163+ }
164+ }
165+
166+ is AsyncImagePainter .State .Success -> {
167+ // Show the loaded image
168+ SubcomposeAsyncImageContent ()
169+
170+ // Update drawable state to use as placeholder next time
171+ drawable = (painter.state as AsyncImagePainter .State .Success ).result.drawable
172+ }
173+
174+ else -> {
175+ Box (
176+ modifier = Modifier
177+ .fillMaxSize()
178+ .background(Color .Gray )
179+ )
180+ }
151181 }
152- )
182+ }
153183 }
154184
155185 // Download progress
0 commit comments