Timeline: improve image aspectRatio
This commit is contained in:
parent
ee0e267648
commit
a53b1c6aa2
4 changed files with 43 additions and 6 deletions
|
|
@ -9,6 +9,7 @@ android {
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(project(":libraries:core"))
|
implementation(project(":libraries:core"))
|
||||||
implementation(project(":libraries:matrix"))
|
implementation(project(":libraries:matrix"))
|
||||||
|
implementation(project(":libraries:blurhash"))
|
||||||
implementation(project(":libraries:designsystem"))
|
implementation(project(":libraries:designsystem"))
|
||||||
implementation(project(":libraries:textcomposer"))
|
implementation(project(":libraries:textcomposer"))
|
||||||
implementation(libs.mavericks.compose)
|
implementation(libs.mavericks.compose)
|
||||||
|
|
|
||||||
|
|
@ -88,13 +88,21 @@ class MessageTimelineItemStateMapper(
|
||||||
formattedBody = messageType.content.formatted
|
formattedBody = messageType.content.formatted
|
||||||
)
|
)
|
||||||
is MessageType.Image -> {
|
is MessageType.Image -> {
|
||||||
|
val height = messageType.content.info?.height?.toFloat()
|
||||||
|
val width = messageType.content.info?.width?.toFloat()
|
||||||
|
val aspectRatio = if (height != null && width != null) {
|
||||||
|
width / height
|
||||||
|
} else {
|
||||||
|
0.7f
|
||||||
|
}
|
||||||
MessagesTimelineItemImageContent(
|
MessagesTimelineItemImageContent(
|
||||||
body = messageType.content.body,
|
body = messageType.content.body,
|
||||||
imageMeta = MediaResolver.Meta(
|
imageMeta = MediaResolver.Meta(
|
||||||
source = messageType.content.source,
|
source = messageType.content.source,
|
||||||
kind = MediaResolver.Kind.Content
|
kind = MediaResolver.Kind.Content
|
||||||
),
|
),
|
||||||
blurhash = messageType.content.info?.blurhash
|
blurhash = messageType.content.info?.blurhash,
|
||||||
|
aspectRatio = aspectRatio
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
is MessageType.Notice -> MessagesTimelineItemNoticeContent(
|
is MessageType.Notice -> MessagesTimelineItemNoticeContent(
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,21 @@ package io.element.android.x.features.messages.components
|
||||||
|
|
||||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
import androidx.compose.foundation.ExperimentalFoundationApi
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.aspectRatio
|
||||||
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.heightIn
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.graphics.painter.ColorPainter
|
||||||
import androidx.compose.ui.layout.ContentScale
|
import androidx.compose.ui.layout.ContentScale
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
import coil.compose.AsyncImage
|
import coil.compose.AsyncImage
|
||||||
|
import coil.request.ImageRequest
|
||||||
import io.element.android.x.features.messages.model.content.MessagesTimelineItemImageContent
|
import io.element.android.x.features.messages.model.content.MessagesTimelineItemImageContent
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
@ -16,13 +26,30 @@ fun MessagesTimelineItemImageView(
|
||||||
content: MessagesTimelineItemImageContent,
|
content: MessagesTimelineItemImageContent,
|
||||||
modifier: Modifier = Modifier
|
modifier: Modifier = Modifier
|
||||||
) {
|
) {
|
||||||
|
val widthPercent = if(content.aspectRatio > 1f){
|
||||||
|
1f
|
||||||
|
}else {
|
||||||
|
0.7f
|
||||||
|
}
|
||||||
Box(
|
Box(
|
||||||
modifier = Modifier.fillMaxSize()
|
modifier = Modifier
|
||||||
|
.fillMaxWidth(widthPercent)
|
||||||
|
.aspectRatio(content.aspectRatio),
|
||||||
|
contentAlignment = Alignment.Center,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
var isLoading = rememberSaveable(content.imageMeta) { mutableStateOf(true) }
|
||||||
|
val context = LocalContext.current
|
||||||
|
val model = ImageRequest.Builder(context)
|
||||||
|
.data(content.imageMeta)
|
||||||
|
.build()
|
||||||
|
|
||||||
AsyncImage(
|
AsyncImage(
|
||||||
model = content.imageMeta,
|
model = model,
|
||||||
contentDescription = null,
|
contentDescription = null,
|
||||||
contentScale = ContentScale.Crop
|
placeholder = ColorPainter(MaterialTheme.colorScheme.surfaceVariant),
|
||||||
|
contentScale = ContentScale.Crop,
|
||||||
|
onSuccess = { isLoading.value = false },
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -5,5 +5,6 @@ import io.element.android.x.matrix.media.MediaResolver
|
||||||
data class MessagesTimelineItemImageContent(
|
data class MessagesTimelineItemImageContent(
|
||||||
val body: String,
|
val body: String,
|
||||||
val imageMeta: MediaResolver.Meta,
|
val imageMeta: MediaResolver.Meta,
|
||||||
val blurhash: String?
|
val blurhash: String?,
|
||||||
|
val aspectRatio: Float
|
||||||
) : MessagesTimelineItemContent
|
) : MessagesTimelineItemContent
|
||||||
Loading…
Add table
Add a link
Reference in a new issue