mirror of
https://github.com/SchildiChat/SchildiChat-android.git
synced 2025-03-18 20:29:10 +03:00
Render poll question when rendering reply to a poll end event.
This commit is contained in:
parent
1787031cc6
commit
fe4e0eb0d9
3 changed files with 43 additions and 2 deletions
|
@ -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.")
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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() -> {
|
||||
|
|
Loading…
Add table
Reference in a new issue