Render emote in the timeline: prefix with sender display name

This commit is contained in:
Benoit Marty
2023-10-05 11:39:05 +02:00
parent d323554b2d
commit 6c22ee3cec
3 changed files with 14 additions and 6 deletions

View File

@@ -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)

View File

@@ -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 -> {

View File

@@ -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)
}
}
}