From 188d795bdb3af78dac27cf7b99bbf415c52055c2 Mon Sep 17 00:00:00 2001 From: Marco Antonio Alvarez Date: Sun, 10 Mar 2024 15:02:36 +0100 Subject: [PATCH 1/8] Implement MSC2530 Signed-off-by: Marco Antonio Alvarez --- changelog.d/2521.feature | 1 + .../TimelineItemEventRowWithReplyPreview.kt | 2 +- .../components/event/TimelineItemImageView.kt | 39 +++++++++++++++---- .../TimelineItemContentMessageFactory.kt | 2 + .../model/event/TimelineItemImageContent.kt | 6 +++ .../event/TimelineItemImageContentProvider.kt | 2 + .../api/timeline/item/event/MessageType.kt | 2 + .../timeline/item/event/EventMessageMapper.kt | 2 +- 8 files changed, 46 insertions(+), 10 deletions(-) create mode 100644 changelog.d/2521.feature diff --git a/changelog.d/2521.feature b/changelog.d/2521.feature new file mode 100644 index 00000000000..1abcf68fce7 --- /dev/null +++ b/changelog.d/2521.feature @@ -0,0 +1 @@ +Implement MSC2530 (Body field as media caption) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt index c5cf6dfecd5..0f98c5089f1 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt @@ -113,7 +113,7 @@ open class InReplyToDetailsProvider : PreviewParameterProvider ), aMessageContent( body = "Image", - type = ImageMessageType("Image", MediaSource("url"), null), + type = ImageMessageType("Image", null, null, MediaSource("url"), null), ), aMessageContent( body = "Sticker", diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt index d058df9996d..d1062d97e48 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt @@ -16,19 +16,26 @@ package io.element.android.features.messages.impl.timeline.components.event +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.unit.dp import io.element.android.features.messages.impl.timeline.model.event.TimelineItemImageContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemImageContentProvider import io.element.android.libraries.designsystem.components.BlurHashAsyncImage import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.matrix.ui.media.MediaRequestData +import io.element.android.libraries.textcomposer.ElementRichTextEditorStyle import io.element.android.libraries.ui.strings.CommonStrings +import io.element.android.wysiwyg.compose.EditorStyledText @Composable fun TimelineItemImageView( @@ -36,14 +43,30 @@ fun TimelineItemImageView( modifier: Modifier = Modifier, ) { val description = stringResource(CommonStrings.common_image) - TimelineItemAspectRatioBox( - aspectRatio = content.aspectRatio, - modifier = modifier.semantics { contentDescription = description }, - ) { - BlurHashAsyncImage( - model = MediaRequestData(content.preferredMediaSource, MediaRequestData.Kind.File(content.body, content.mimeType)), - blurHash = content.blurhash, - ) + Column ( ) { + Box (contentAlignment = Alignment.Center) + { + TimelineItemAspectRatioBox( + aspectRatio = content.aspectRatio, + modifier = modifier.semantics { contentDescription = description }, + ) { + BlurHashAsyncImage( + model = MediaRequestData(content.preferredMediaSource, MediaRequestData.Kind.File(content.body, content.mimeType)), + blurHash = content.blurhash, + ) + } + } + + if (content.showCaption) { + Box ( modifier = modifier.padding(8.dp)) + { + EditorStyledText( + text = content.caption, + style = ElementRichTextEditorStyle.textStyle(), + releaseOnDetach = false + ) + } + } } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt index b53d7496133..7133d4d0292 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt @@ -83,6 +83,8 @@ class TimelineItemContentMessageFactory @Inject constructor( val aspectRatio = aspectRatioOf(messageType.info?.width, messageType.info?.height) TimelineItemImageContent( body = messageType.body.trimEnd(), + formatted = messageType.formatted, + filename = messageType.filename, mediaSource = messageType.source, thumbnailSource = messageType.info?.thumbnailSource, mimeType = messageType.info?.mimetype ?: MimeTypes.OctetStream, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContent.kt index 342e0a336b1..d7e8abc67a3 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContent.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContent.kt @@ -18,9 +18,12 @@ package io.element.android.features.messages.impl.timeline.model.event import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.matrix.api.media.MediaSource +import io.element.android.libraries.matrix.api.timeline.item.event.FormattedBody data class TimelineItemImageContent( val body: String, + val formatted: FormattedBody?, + val filename: String?, val mediaSource: MediaSource, val thumbnailSource: MediaSource?, val formattedFileSize: String, @@ -33,6 +36,9 @@ data class TimelineItemImageContent( ) : TimelineItemEventContent { override val type: String = "TimelineItemImageContent" + val showCaption = filename != null && filename != body; + val caption = if (showCaption) body else ""; + val preferredMediaSource = if (mimeType == MimeTypes.Gif) { mediaSource } else { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContentProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContentProvider.kt index dbb32bbab20..e24f84eb4ea 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContentProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContentProvider.kt @@ -32,6 +32,8 @@ open class TimelineItemImageContentProvider : PreviewParameterProvider { - ImageMessageType(type.content.body, type.content.source.map(), type.content.info?.map()) + ImageMessageType(type.content.body, type.content.formatted?.map(), type.content.filename, type.content.source.map(), type.content.info?.map()) } is RustMessageType.Notice -> { NoticeMessageType(type.content.body, type.content.formatted?.map()) From 0fd09fc4fcbd71bfbcc76af32e71b81ae7cc9ac4 Mon Sep 17 00:00:00 2001 From: Marco Antonio Alvarez Date: Thu, 14 Mar 2024 19:00:47 +0100 Subject: [PATCH 2/8] Fix caption width to match the image maximum Signed-off-by: Marco Antonio Alvarez --- .../impl/timeline/components/TimelineItemEventRow.kt | 2 +- .../components/event/TimelineItemAspectRatioBox.kt | 4 ++-- .../timeline/components/event/TimelineItemImageView.kt | 9 +++++++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt index ffd2925c149..d5d4da4c82e 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt @@ -615,7 +615,7 @@ private fun MessageEventBubbleContent( } val timestampPosition = when (event.content) { - is TimelineItemImageContent, + is TimelineItemImageContent -> if (event.content.showCaption) TimestampPosition.Below else TimestampPosition.Overlay is TimelineItemStickerContent, is TimelineItemVideoContent, is TimelineItemLocationContent -> TimestampPosition.Overlay diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemAspectRatioBox.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemAspectRatioBox.kt index bf30669a25f..98257584b54 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemAspectRatioBox.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemAspectRatioBox.kt @@ -25,8 +25,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -private const val MIN_HEIGHT_IN_DP = 100 -private const val MAX_HEIGHT_IN_DP = 360 +const val MIN_HEIGHT_IN_DP = 100 +const val MAX_HEIGHT_IN_DP = 360 private const val DEFAULT_ASPECT_RATIO = 1.33f @Composable diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt index d1062d97e48..c4591cee6a6 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt @@ -18,7 +18,9 @@ package io.element.android.features.messages.impl.timeline.components.event import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.widthIn import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -58,9 +60,12 @@ fun TimelineItemImageView( } if (content.showCaption) { - Box ( modifier = modifier.padding(8.dp)) + Spacer(modifier = Modifier.height(8.dp)) + Box ( ) { EditorStyledText( + modifier = modifier + .widthIn(min = MIN_HEIGHT_IN_DP.dp * content.aspectRatio!!, max = MAX_HEIGHT_IN_DP.dp * content.aspectRatio!!), text = content.caption, style = ElementRichTextEditorStyle.textStyle(), releaseOnDetach = false From 6060703c9ad4a6da99f6d4575957850d7a73091c Mon Sep 17 00:00:00 2001 From: Marco Antonio Alvarez Date: Thu, 14 Mar 2024 19:01:59 +0100 Subject: [PATCH 3/8] empty Signed-off-by: Marco Antonio Alvarez From 7f5c5fcaae6ece5ebe48ff78e14416bc86b01a0d Mon Sep 17 00:00:00 2001 From: Marco Antonio Alvarez Date: Thu, 14 Mar 2024 20:18:39 +0100 Subject: [PATCH 4/8] fixed tests added video captions Signed-off-by: Marco Antonio Alvarez --- .../components/TimelineItemEventRow.kt | 2 +- .../TimelineItemEventRowWithReplyPreview.kt | 2 +- .../components/event/TimelineItemImageView.kt | 27 ++++----- .../components/event/TimelineItemVideoView.kt | 56 +++++++++++++------ .../TimelineItemContentMessageFactory.kt | 2 + .../model/event/TimelineItemVideoContent.kt | 7 +++ .../event/TimelineItemVideoContentProvider.kt | 2 + .../messages/impl/MessagesPresenterTest.kt | 4 ++ .../TimelineItemContentMessageFactoryTest.kt | 24 ++++++-- .../timeline/model/InReplyToMetadataKtTest.kt | 4 ++ .../DefaultRoomLastMessageFormatterTest.kt | 4 +- .../api/timeline/item/event/MessageType.kt | 2 + .../timeline/item/event/EventMessageMapper.kt | 2 +- .../NotifiableEventResolverTest.kt | 4 +- 14 files changed, 98 insertions(+), 44 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt index d5d4da4c82e..89204fbe72c 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt @@ -616,8 +616,8 @@ private fun MessageEventBubbleContent( val timestampPosition = when (event.content) { is TimelineItemImageContent -> if (event.content.showCaption) TimestampPosition.Below else TimestampPosition.Overlay + is TimelineItemVideoContent -> if (event.content.showCaption) TimestampPosition.Below else TimestampPosition.Overlay is TimelineItemStickerContent, - is TimelineItemVideoContent, is TimelineItemLocationContent -> TimestampPosition.Overlay is TimelineItemPollContent -> TimestampPosition.Below else -> TimestampPosition.Default diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt index 0f98c5089f1..20b9a01e3fd 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt @@ -101,7 +101,7 @@ open class InReplyToDetailsProvider : PreviewParameterProvider ), aMessageContent( body = "Video", - type = VideoMessageType("Video", MediaSource("url"), null), + type = VideoMessageType("Video", null, null, MediaSource("url"), null), ), aMessageContent( body = "Audio", diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt index c4591cee6a6..2788fd9f750 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt @@ -22,7 +22,6 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.widthIn import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.contentDescription @@ -45,18 +44,16 @@ fun TimelineItemImageView( modifier: Modifier = Modifier, ) { val description = stringResource(CommonStrings.common_image) - Column ( ) { - Box (contentAlignment = Alignment.Center) - { - TimelineItemAspectRatioBox( - aspectRatio = content.aspectRatio, - modifier = modifier.semantics { contentDescription = description }, - ) { - BlurHashAsyncImage( - model = MediaRequestData(content.preferredMediaSource, MediaRequestData.Kind.File(content.body, content.mimeType)), - blurHash = content.blurhash, - ) - } + Column ( + modifier = modifier.semantics { contentDescription = description }, + ) { + TimelineItemAspectRatioBox( + aspectRatio = content.aspectRatio, + ) { + BlurHashAsyncImage( + model = MediaRequestData(content.preferredMediaSource, MediaRequestData.Kind.File(content.body, content.mimeType)), + blurHash = content.blurhash, + ) } if (content.showCaption) { @@ -64,8 +61,8 @@ fun TimelineItemImageView( Box ( ) { EditorStyledText( - modifier = modifier - .widthIn(min = MIN_HEIGHT_IN_DP.dp * content.aspectRatio!!, max = MAX_HEIGHT_IN_DP.dp * content.aspectRatio!!), + modifier = Modifier + .widthIn(min = MIN_HEIGHT_IN_DP.dp * content.aspectRatio!!, max = MAX_HEIGHT_IN_DP.dp * content.aspectRatio), text = content.caption, style = ElementRichTextEditorStyle.textStyle(), releaseOnDetach = false diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt index d0174465396..fb82ad9d126 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt @@ -18,6 +18,10 @@ package io.element.android.features.messages.impl.timeline.components.event import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.widthIn import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.PlayArrow import androidx.compose.runtime.Composable @@ -30,6 +34,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.unit.dp import io.element.android.features.messages.impl.timeline.model.event.TimelineItemVideoContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemVideoContentProvider import io.element.android.libraries.designsystem.components.BlurHashAsyncImage @@ -37,7 +42,9 @@ import io.element.android.libraries.designsystem.modifiers.roundedBackground import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.matrix.ui.media.MediaRequestData +import io.element.android.libraries.textcomposer.ElementRichTextEditorStyle import io.element.android.libraries.ui.strings.CommonStrings +import io.element.android.wysiwyg.compose.EditorStyledText @Composable fun TimelineItemVideoView( @@ -45,25 +52,42 @@ fun TimelineItemVideoView( modifier: Modifier = Modifier, ) { val description = stringResource(CommonStrings.common_image) - TimelineItemAspectRatioBox( - aspectRatio = content.aspectRatio, - modifier = modifier.semantics { contentDescription = description }, - contentAlignment = Alignment.Center, - ) { - BlurHashAsyncImage( - model = MediaRequestData(content.thumbnailSource, MediaRequestData.Kind.File(content.body, content.mimeType)), - blurHash = content.blurHash, - contentScale = ContentScale.Crop, - ) - Box( - modifier = Modifier.roundedBackground(), + Column() + { + TimelineItemAspectRatioBox( + aspectRatio = content.aspectRatio, + modifier = modifier.semantics { contentDescription = description }, contentAlignment = Alignment.Center, ) { - Image( - Icons.Default.PlayArrow, - contentDescription = stringResource(id = CommonStrings.a11y_play), - colorFilter = ColorFilter.tint(Color.White), + BlurHashAsyncImage( + model = MediaRequestData(content.thumbnailSource, MediaRequestData.Kind.File(content.body, content.mimeType)), + blurHash = content.blurHash, + contentScale = ContentScale.Crop, ) + Box( + modifier = Modifier.roundedBackground(), + contentAlignment = Alignment.Center, + ) { + Image( + Icons.Default.PlayArrow, + contentDescription = stringResource(id = CommonStrings.a11y_play), + colorFilter = ColorFilter.tint(Color.White), + ) + } + } + + if (content.showCaption) { + Spacer(modifier = Modifier.height(8.dp)) + Box ( ) + { + EditorStyledText( + modifier = Modifier + .widthIn(min = MIN_HEIGHT_IN_DP.dp * content.aspectRatio!!, max = MAX_HEIGHT_IN_DP.dp * content.aspectRatio), + text = content.caption, + style = ElementRichTextEditorStyle.textStyle(), + releaseOnDetach = false + ) + } } } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt index 7133d4d0292..f32277f092c 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt @@ -134,6 +134,8 @@ class TimelineItemContentMessageFactory @Inject constructor( val aspectRatio = aspectRatioOf(messageType.info?.width, messageType.info?.height) TimelineItemVideoContent( body = messageType.body.trimEnd(), + formatted = messageType.formatted, + filename = messageType.filename, thumbnailSource = messageType.info?.thumbnailSource, videoSource = messageType.source, mimeType = messageType.info?.mimetype ?: MimeTypes.OctetStream, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContent.kt index 5519fbc7f17..cf720211fa1 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContent.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContent.kt @@ -17,10 +17,13 @@ package io.element.android.features.messages.impl.timeline.model.event import io.element.android.libraries.matrix.api.media.MediaSource +import io.element.android.libraries.matrix.api.timeline.item.event.FormattedBody import kotlin.time.Duration data class TimelineItemVideoContent( val body: String, + val formatted: FormattedBody?, + val filename: String?, val duration: Duration, val videoSource: MediaSource, val thumbnailSource: MediaSource?, @@ -33,4 +36,8 @@ data class TimelineItemVideoContent( val fileExtension: String, ) : TimelineItemEventContent { override val type: String = "TimelineItemImageContent" + + val showCaption = filename != null && filename != body; + val caption = if (showCaption) body else ""; + } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContentProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContentProvider.kt index 939636fadcb..ed4b1a91bdd 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContentProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContentProvider.kt @@ -33,6 +33,8 @@ open class TimelineItemVideoContentProvider : PreviewParameterProvider { - VideoMessageType(type.content.body, type.content.source.map(), type.content.info?.map()) + VideoMessageType(type.content.body, type.content.formatted?.map(), type.content.filename, type.content.source.map(), type.content.info?.map()) } is RustMessageType.Location -> { LocationMessageType(type.content.body, type.content.geoUri, type.content.description) diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotifiableEventResolverTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotifiableEventResolverTest.kt index f37990fd681..4e491a0def0 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotifiableEventResolverTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotifiableEventResolverTest.kt @@ -190,7 +190,7 @@ class NotifiableEventResolverTest { createNotificationData( content = NotificationContent.MessageLike.RoomMessage( senderId = A_USER_ID_2, - messageType = VideoMessageType(body = "Video", MediaSource("url"), null) + messageType = VideoMessageType(body = "Video", null, null, MediaSource("url"), null) ) ) ) @@ -224,7 +224,7 @@ class NotifiableEventResolverTest { createNotificationData( content = NotificationContent.MessageLike.RoomMessage( senderId = A_USER_ID_2, - messageType = ImageMessageType("Image", MediaSource("url"), null), + messageType = ImageMessageType("Image", null, null, MediaSource("url"), null), ) ) ) From 2396829925559ca0369375754e9228370456ac85 Mon Sep 17 00:00:00 2001 From: Marco Antonio Alvarez Date: Thu, 14 Mar 2024 20:23:19 +0100 Subject: [PATCH 5/8] remove redundant semicolons Signed-off-by: Marco Antonio Alvarez --- .../impl/timeline/model/event/TimelineItemVideoContent.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContent.kt index cf720211fa1..4dd9b68e37f 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContent.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContent.kt @@ -37,7 +37,7 @@ data class TimelineItemVideoContent( ) : TimelineItemEventContent { override val type: String = "TimelineItemImageContent" - val showCaption = filename != null && filename != body; - val caption = if (showCaption) body else ""; + val showCaption = filename != null && filename != body + val caption = if (showCaption) body else "" } From 0430c9d0ad327c9f3027425d89ff2df8707d6d79 Mon Sep 17 00:00:00 2001 From: Marco Antonio Alvarez Date: Thu, 14 Mar 2024 20:26:18 +0100 Subject: [PATCH 6/8] fix video composable main modifier warning Signed-off-by: Marco Antonio Alvarez --- .../impl/timeline/components/event/TimelineItemVideoView.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt index fb82ad9d126..bea99ab9553 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt @@ -52,11 +52,11 @@ fun TimelineItemVideoView( modifier: Modifier = Modifier, ) { val description = stringResource(CommonStrings.common_image) - Column() - { + Column( + modifier = modifier.semantics { contentDescription = description } + ) { TimelineItemAspectRatioBox( aspectRatio = content.aspectRatio, - modifier = modifier.semantics { contentDescription = description }, contentAlignment = Alignment.Center, ) { BlurHashAsyncImage( From a54ac5cdb8f88ca466d95e9f6acb11f2d1f67d66 Mon Sep 17 00:00:00 2001 From: Marco Antonio Alvarez Date: Thu, 14 Mar 2024 20:39:08 +0100 Subject: [PATCH 7/8] code quality fixes Signed-off-by: Marco Antonio Alvarez --- .../impl/timeline/components/event/TimelineItemImageView.kt | 5 ++--- .../impl/timeline/components/event/TimelineItemVideoView.kt | 3 +-- .../impl/timeline/model/event/TimelineItemImageContent.kt | 4 ++-- .../impl/timeline/model/event/TimelineItemVideoContent.kt | 1 - 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt index 2788fd9f750..322b2988b04 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt @@ -44,7 +44,7 @@ fun TimelineItemImageView( modifier: Modifier = Modifier, ) { val description = stringResource(CommonStrings.common_image) - Column ( + Column( modifier = modifier.semantics { contentDescription = description }, ) { TimelineItemAspectRatioBox( @@ -58,8 +58,7 @@ fun TimelineItemImageView( if (content.showCaption) { Spacer(modifier = Modifier.height(8.dp)) - Box ( ) - { + Box() { EditorStyledText( modifier = Modifier .widthIn(min = MIN_HEIGHT_IN_DP.dp * content.aspectRatio!!, max = MAX_HEIGHT_IN_DP.dp * content.aspectRatio), diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt index bea99ab9553..ec56b6bfa0c 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt @@ -78,8 +78,7 @@ fun TimelineItemVideoView( if (content.showCaption) { Spacer(modifier = Modifier.height(8.dp)) - Box ( ) - { + Box() { EditorStyledText( modifier = Modifier .widthIn(min = MIN_HEIGHT_IN_DP.dp * content.aspectRatio!!, max = MAX_HEIGHT_IN_DP.dp * content.aspectRatio), diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContent.kt index d7e8abc67a3..b63705b6436 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContent.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContent.kt @@ -36,8 +36,8 @@ data class TimelineItemImageContent( ) : TimelineItemEventContent { override val type: String = "TimelineItemImageContent" - val showCaption = filename != null && filename != body; - val caption = if (showCaption) body else ""; + val showCaption = filename != null && filename != body + val caption = if (showCaption) body else "" val preferredMediaSource = if (mimeType == MimeTypes.Gif) { mediaSource diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContent.kt index 4dd9b68e37f..427ff8c7f6e 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContent.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContent.kt @@ -39,5 +39,4 @@ data class TimelineItemVideoContent( val showCaption = filename != null && filename != body val caption = if (showCaption) body else "" - } From f61e30834140a246d86e22dcb450329c5d84990c Mon Sep 17 00:00:00 2001 From: Marco Antonio Alvarez Date: Thu, 14 Mar 2024 20:51:08 +0100 Subject: [PATCH 8/8] code quality fixes Signed-off-by: Marco Antonio Alvarez --- .../impl/timeline/components/event/TimelineItemImageView.kt | 2 +- .../impl/timeline/components/event/TimelineItemVideoView.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt index 322b2988b04..24f31c95157 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt @@ -58,7 +58,7 @@ fun TimelineItemImageView( if (content.showCaption) { Spacer(modifier = Modifier.height(8.dp)) - Box() { + Box { EditorStyledText( modifier = Modifier .widthIn(min = MIN_HEIGHT_IN_DP.dp * content.aspectRatio!!, max = MAX_HEIGHT_IN_DP.dp * content.aspectRatio), diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt index ec56b6bfa0c..169806826a9 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt @@ -78,7 +78,7 @@ fun TimelineItemVideoView( if (content.showCaption) { Spacer(modifier = Modifier.height(8.dp)) - Box() { + Box { EditorStyledText( modifier = Modifier .widthIn(min = MIN_HEIGHT_IN_DP.dp * content.aspectRatio!!, max = MAX_HEIGHT_IN_DP.dp * content.aspectRatio),