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 userId = eventReplied.root.senderId ?: return null
val userLink = permalinkFactory.createPermalink(userId, false) ?: 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. // 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() 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. * 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 * 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 -> { MessageType.MSGTYPE_POLL_START -> {
return TextContent((content as? MessagePollContent)?.getBestPollCreationInfo()?.question?.getBestQuestion() ?: "") return TextContent((content as? MessagePollContent)?.getBestPollCreationInfo()?.question?.getBestQuestion() ?: "")
} }
MessageType.MSGTYPE_POLL_END -> return TextContent("Ended poll")
else -> { else -> {
return if (isRedactedEvent) { return if (isRedactedEvent) {
TextContent("message removed.") 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.model.message.MessageType
import org.matrix.android.sdk.api.session.room.send.SendState 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.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.RealmSessionProvider
import org.matrix.android.sdk.internal.database.asyncTransaction import org.matrix.android.sdk.internal.database.asyncTransaction
import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper 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 EventEntity.where(realm, eventId = rootThreadEventId).findFirst()?.threadSummaryLatestMessage?.eventId
} ?: rootThreadEventId } ?: 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.di.ActiveSessionHolder
import im.vector.app.core.resources.StringProvider 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.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.isAudioMessage
import org.matrix.android.sdk.api.session.events.model.isFileMessage import org.matrix.android.sdk.api.session.events.model.isFileMessage
import org.matrix.android.sdk.api.session.events.model.isImageMessage 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.events.model.isVoiceMessage
import org.matrix.android.sdk.api.session.getRoom 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.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.model.relation.ReplyToContent
import org.matrix.android.sdk.api.session.room.timeline.getLastMessageContent
import javax.inject.Inject import javax.inject.Inject
private const val IN_REPLY_TO = "In reply to" 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) repliedToEvent.isPollEnd() -> stringProvider.getString(R.string.message_reply_to_sender_ended_poll)
else -> "" 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( matrixFormattedBody.replaceRange(
afterBreakingLineIndex, afterBreakingLineIndex,
endOfBlockQuoteIndex, endOfBlockQuoteIndex,
repliedToEvent.getPollQuestion() ?: fallbackText repliedText ?: fallbackText
) )
} }
repliedToEvent.isLiveLocation() -> { repliedToEvent.isLiveLocation() -> {