diff --git a/features/messenger/src/main/kotlin/app/dapk/st/messenger/MessengerScreen.kt b/features/messenger/src/main/kotlin/app/dapk/st/messenger/MessengerScreen.kt index 7fe8bdf..3296678 100644 --- a/features/messenger/src/main/kotlin/app/dapk/st/messenger/MessengerScreen.kt +++ b/features/messenger/src/main/kotlin/app/dapk/st/messenger/MessengerScreen.kt @@ -241,7 +241,7 @@ private fun MessageImage(content: BubbleContent) { Spacer(modifier = Modifier.height(4.dp)) Image( - modifier = Modifier.size(content.message.imageMeta.scaleMeta(LocalDensity.current, LocalConfiguration.current)), + modifier = Modifier.size(content.message.imageMeta.scale(LocalDensity.current, LocalConfiguration.current)), painter = rememberImagePainter( data = content.message, builder = { fetcher(decryptingFetcher) } @@ -266,16 +266,18 @@ private fun MessageImage(content: BubbleContent) { } } -private fun RoomEvent.Image.ImageMeta.scaleMeta(density: Density, configuration: Configuration): DpSize { +private fun RoomEvent.Image.ImageMeta.scale(density: Density, configuration: Configuration): DpSize { + val height = this@scale.height ?: 250 + val width = this@scale.width ?: 250 return with(density) { val scaler = minOf( - this@scaleMeta.height.scalerFor(configuration.screenHeightDp.dp.toPx() * 0.5f), - this@scaleMeta.width.scalerFor(configuration.screenWidthDp.dp.toPx() * 0.6f) + height.scalerFor(configuration.screenHeightDp.dp.toPx() * 0.5f), + width.scalerFor(configuration.screenWidthDp.dp.toPx() * 0.6f) ) DpSize( - width = (this@scaleMeta.width * scaler).toDp(), - height = (this@scaleMeta.height * scaler).toDp(), + width = (width * scaler).toDp(), + height = (height * scaler).toDp(), ) } } @@ -405,11 +407,9 @@ private fun ReplyBubbleContent(content: BubbleContent) { ) } is RoomEvent.Image -> { - val width = with(LocalDensity.current) { replyingTo.imageMeta.width.toDp() } - val height = with(LocalDensity.current) { replyingTo.imageMeta.height.toDp() } Spacer(modifier = Modifier.height(4.dp)) Image( - modifier = Modifier.size(width, height), + modifier = Modifier.size(replyingTo.imageMeta.scale(LocalDensity.current, LocalConfiguration.current)), painter = rememberImagePainter( data = replyingTo, builder = { fetcher(DecryptingFetcher()) } @@ -442,11 +442,9 @@ private fun ReplyBubbleContent(content: BubbleContent) { ) } is RoomEvent.Image -> { - val width = with(LocalDensity.current) { message.imageMeta.width.toDp() } - val height = with(LocalDensity.current) { message.imageMeta.height.toDp() } Spacer(modifier = Modifier.height(4.dp)) Image( - modifier = Modifier.size(width, height), + modifier = Modifier.size(message.imageMeta.scale(LocalDensity.current, LocalConfiguration.current)), painter = rememberImagePainter( data = content.message, builder = { fetcher(DecryptingFetcher()) } diff --git a/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/RoomState.kt b/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/RoomState.kt index dc2ba44..139c7cc 100644 --- a/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/RoomState.kt +++ b/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/RoomState.kt @@ -90,8 +90,8 @@ sealed class RoomEvent { @Serializable data class ImageMeta( - @SerialName("width") val width: Int, - @SerialName("height") val height: Int, + @SerialName("width") val width: Int?, + @SerialName("height") val height: Int?, @SerialName("url") val url: String, @SerialName("keys") val keys: Keys?, ) { diff --git a/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/request/ApiSyncResponse.kt b/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/request/ApiSyncResponse.kt index 39ed572..a81db3d 100644 --- a/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/request/ApiSyncResponse.kt +++ b/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/request/ApiSyncResponse.kt @@ -461,7 +461,7 @@ internal sealed class ApiTimelineEvent { data class Image( @SerialName("url") val url: MxUrl? = null, @SerialName("file") val file: File? = null, - @SerialName("info") val info: Info, + @SerialName("info") val info: Info? = null, @SerialName("m.relates_to") override val relation: Relation? = null, @SerialName("msgtype") val messageType: String = "m.image", ) : Content { diff --git a/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/room/RoomEventsDecrypter.kt b/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/room/RoomEventsDecrypter.kt index 9ab0984..b14f5b4 100644 --- a/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/room/RoomEventsDecrypter.kt +++ b/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/room/RoomEventsDecrypter.kt @@ -35,8 +35,8 @@ internal class RoomEventsDecrypter( val content = model.content as ApiTimelineEvent.TimelineMessage.Content.Image this.copy( imageMeta = RoomEvent.Image.ImageMeta( - width = content.info.width, - height = content.info.height, + width = content.info?.width, + height = content.info?.height, url = content.file?.url?.convertMxUrToUrl(userCredentials.homeServer) ?: content.url!!.convertMxUrToUrl(userCredentials.homeServer), keys = content.file?.let { RoomEvent.Image.ImageMeta.Keys(it.key.k, it.iv, it.v, it.hashes) } ), diff --git a/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/sync/RoomEventFactory.kt b/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/sync/RoomEventFactory.kt index 01b08c3..a7d186d 100644 --- a/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/sync/RoomEventFactory.kt +++ b/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/internal/sync/RoomEventFactory.kt @@ -45,8 +45,8 @@ internal class RoomEventFactory( private fun ApiTimelineEvent.TimelineMessage.readImageMeta(userCredentials: UserCredentials): RoomEvent.Image.ImageMeta { val content = this.content as ApiTimelineEvent.TimelineMessage.Content.Image return RoomEvent.Image.ImageMeta( - content.info.width, - content.info.height, + content.info?.width, + content.info?.height, content.file?.url?.convertMxUrToUrl(userCredentials.homeServer) ?: content.url!!.convertMxUrToUrl(userCredentials.homeServer), keys = content.file?.let { RoomEvent.Image.ImageMeta.Keys(it.key.k, it.iv, it.v, it.hashes) } )