From 6c22ee3cecadfb67cf299bf58a70f5000fcd19f9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 5 Oct 2023 11:39:05 +0200 Subject: [PATCH] Render emote in the timeline: prefix with sender display name --- .../factories/event/TimelineItemContentFactory.kt | 6 +++++- .../factories/event/TimelineItemContentMessageFactory.kt | 6 +++--- .../messages/impl/timeline/util/toHtmlDocument.kt | 8 ++++++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt index 6a74fd11a5..55e889f496 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt @@ -24,6 +24,7 @@ import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParse import io.element.android.libraries.matrix.api.timeline.item.event.MessageContent import io.element.android.libraries.matrix.api.timeline.item.event.PollContent import io.element.android.libraries.matrix.api.timeline.item.event.ProfileChangeContent +import io.element.android.libraries.matrix.api.timeline.item.event.ProfileTimelineDetails import io.element.android.libraries.matrix.api.timeline.item.event.RedactedContent import io.element.android.libraries.matrix.api.timeline.item.event.RoomMembershipContent import io.element.android.libraries.matrix.api.timeline.item.event.StateContent @@ -49,7 +50,10 @@ class TimelineItemContentFactory @Inject constructor( return when (val itemContent = eventTimelineItem.content) { is FailedToParseMessageLikeContent -> failedToParseMessageFactory.create(itemContent) is FailedToParseStateContent -> failedToParseStateFactory.create(itemContent) - is MessageContent -> messageFactory.create(itemContent) + is MessageContent -> { + val senderDisplayName = (eventTimelineItem.senderProfile as? ProfileTimelineDetails.Ready)?.displayName ?: eventTimelineItem.sender.value + messageFactory.create(itemContent, senderDisplayName) + } is ProfileChangeContent -> profileChangeFactory.create(eventTimelineItem) is RedactedContent -> redactedMessageFactory.create(itemContent) is RoomMembershipContent -> roomMembershipFactory.create(eventTimelineItem) 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 7c60ba29c4..98853f01cd 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 @@ -48,11 +48,11 @@ class TimelineItemContentMessageFactory @Inject constructor( private val fileExtensionExtractor: FileExtensionExtractor, ) { - fun create(content: MessageContent): TimelineItemEventContent { + fun create(content: MessageContent, senderDisplayName: String): TimelineItemEventContent { return when (val messageType = content.type ?: UnknownMessageType) { is EmoteMessageType -> TimelineItemEmoteContent( - body = messageType.body, - htmlDocument = messageType.formatted?.toHtmlDocument(), + body = "* $senderDisplayName ${messageType.body}", + htmlDocument = messageType.formatted?.toHtmlDocument(senderDisplayName), isEdited = content.isEdited, ) is ImageMessageType -> { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/util/toHtmlDocument.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/util/toHtmlDocument.kt index 8031e77a4d..02a7af4a5a 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/util/toHtmlDocument.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/util/toHtmlDocument.kt @@ -21,8 +21,12 @@ import io.element.android.libraries.matrix.api.timeline.item.event.MessageFormat import org.jsoup.Jsoup import org.jsoup.nodes.Document -fun FormattedBody.toHtmlDocument(): Document? { +fun FormattedBody.toHtmlDocument(senderDisplayNamePrefix: String? = null): Document? { return takeIf { it.format == MessageFormat.HTML }?.body?.let { formattedBody -> - Jsoup.parse(formattedBody) + if (senderDisplayNamePrefix != null) { + Jsoup.parse("* $senderDisplayNamePrefix $formattedBody") + } else { + Jsoup.parse(formattedBody) + } } }