Render poll question when rendering reply to a poll end event.

This commit is contained in:
Onuray Sahin 2023-01-18 17:38:56 +03:00
parent 1787031cc6
commit fe4e0eb0d9
3 changed files with 43 additions and 2 deletions

View File

@ -612,7 +612,7 @@ internal class LocalEchoEventFactory @Inject constructor(
val userId = eventReplied.root.senderId ?: return null
val userLink = permalinkFactory.createPermalink(userId, false) ?: return null
val body = bodyForReply(eventReplied.getLastMessageContent(), eventReplied.isReply(), isRedactedEvent)
val body = bodyForReply(eventReplied, isRedactedEvent)
// As we always supply formatted body for replies we should force the MarkdownParser to produce html.
val finalReplyTextFormatted = replyTextFormatted?.toString() ?: markdownParser.parse(replyText, force = true, advanced = autoMarkdown).takeFormatted()
@ -724,6 +724,18 @@ internal class LocalEchoEventFactory @Inject constructor(
}
}
private fun bodyForReply(timelineEvent: TimelineEvent, isRedactedEvent: Boolean = false): TextContent {
val content = when (timelineEvent.root.getClearType()) {
in EventType.POLL_END.values -> {
localEchoRepository
.getRelatedPollEvent(timelineEvent)
?.getLastMessageContent()
}
else -> timelineEvent.getLastMessageContent()
}
return bodyForReply(content, timelineEvent.isReply(), isRedactedEvent)
}
/**
* Returns a TextContent used for the fallback event representation in a reply message.
* In case of an edit of a reply the last content is not
@ -754,6 +766,7 @@ internal class LocalEchoEventFactory @Inject constructor(
MessageType.MSGTYPE_POLL_START -> {
return TextContent((content as? MessagePollContent)?.getBestPollCreationInfo()?.question?.getBestQuestion() ?: "")
}
MessageType.MSGTYPE_POLL_END -> return TextContent("Ended poll")
else -> {
return if (isRedactedEvent) {
TextContent("message removed.")

View File

@ -25,6 +25,7 @@ import org.matrix.android.sdk.api.session.room.model.message.MessageContent
import org.matrix.android.sdk.api.session.room.model.message.MessageType
import org.matrix.android.sdk.api.session.room.send.SendState
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
import org.matrix.android.sdk.api.session.room.timeline.getRelationContent
import org.matrix.android.sdk.internal.database.RealmSessionProvider
import org.matrix.android.sdk.internal.database.asyncTransaction
import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper
@ -228,4 +229,15 @@ internal class LocalEchoRepository @Inject constructor(
EventEntity.where(realm, eventId = rootThreadEventId).findFirst()?.threadSummaryLatestMessage?.eventId
} ?: rootThreadEventId
}
fun getRelatedPollEvent(timelineEvent: TimelineEvent): TimelineEvent? {
val roomId = timelineEvent.roomId
val pollEventId = timelineEvent.getRelationContent()?.eventId ?: return null
return realmSessionProvider.withRealm { realm ->
TimelineEventEntity.where(realm, roomId = roomId, eventId = pollEventId).findFirst()?.let {
timelineEventMapper.map(it)
}
}
}
}

View File

@ -20,6 +20,7 @@ import im.vector.app.R
import im.vector.app.core.di.ActiveSessionHolder
import im.vector.app.core.resources.StringProvider
import org.matrix.android.sdk.api.session.events.model.getPollQuestion
import org.matrix.android.sdk.api.session.events.model.getRelationContent
import org.matrix.android.sdk.api.session.events.model.isAudioMessage
import org.matrix.android.sdk.api.session.events.model.isFileMessage
import org.matrix.android.sdk.api.session.events.model.isImageMessage
@ -32,7 +33,9 @@ import org.matrix.android.sdk.api.session.events.model.isVideoMessage
import org.matrix.android.sdk.api.session.events.model.isVoiceMessage
import org.matrix.android.sdk.api.session.getRoom
import org.matrix.android.sdk.api.session.room.getTimelineEvent
import org.matrix.android.sdk.api.session.room.model.message.MessagePollContent
import org.matrix.android.sdk.api.session.room.model.relation.ReplyToContent
import org.matrix.android.sdk.api.session.room.timeline.getLastMessageContent
import javax.inject.Inject
private const val IN_REPLY_TO = "In reply to"
@ -100,10 +103,23 @@ class ProcessBodyOfReplyToEventUseCase @Inject constructor(
repliedToEvent.isPollEnd() -> stringProvider.getString(R.string.message_reply_to_sender_ended_poll)
else -> ""
}
val repliedText = when {
repliedToEvent.isPollEnd() -> {
val eventId = repliedToEvent.getRelationContent()?.eventId
val relatedPollContent = activeSessionHolder
.getSafeActiveSession()
?.getRoom(repliedToEvent.roomId.orEmpty())
?.getTimelineEvent(eventId.orEmpty())
?.getLastMessageContent() as? MessagePollContent
relatedPollContent?.getBestPollCreationInfo()?.question?.getBestQuestion()
}
else -> repliedToEvent.getPollQuestion()
}
matrixFormattedBody.replaceRange(
afterBreakingLineIndex,
endOfBlockQuoteIndex,
repliedToEvent.getPollQuestion() ?: fallbackText
repliedText ?: fallbackText
)
}
repliedToEvent.isLiveLocation() -> {