Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/3477.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Make notification text spoiler aware
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,10 @@ import org.matrix.android.sdk.api.session.room.model.EventAnnotationsSummary
import org.matrix.android.sdk.api.session.room.model.ReadReceipt
import org.matrix.android.sdk.api.session.room.model.message.MessageContent
import org.matrix.android.sdk.api.session.room.model.message.MessageStickerContent
import org.matrix.android.sdk.api.session.room.model.message.MessageTextContent
import org.matrix.android.sdk.api.session.room.model.relation.RelationDefaultContent
import org.matrix.android.sdk.api.session.room.sender.SenderInfo
import org.matrix.android.sdk.api.util.ContentUtils
import org.matrix.android.sdk.api.util.ContentUtils.extractUsefulTextFromReply

/**
Expand Down Expand Up @@ -138,7 +140,9 @@ fun TimelineEvent.getLastMessageBody(): String? {
val lastMessageContent = getLastMessageContent()

if (lastMessageContent != null) {
return lastMessageContent.newContent?.toModel<MessageContent>()?.body
return lastMessageContent.newContent?.toModel<MessageTextContent>()?.formattedBody?.let { ContentUtils.formatSpoilerTextFromHtml(it) }
?: lastMessageContent.newContent?.toModel<MessageContent>()?.body
?: (lastMessageContent as MessageTextContent).formattedBody?.let { ContentUtils.formatSpoilerTextFromHtml(it) }
?: lastMessageContent.body
}

Expand All @@ -157,10 +161,10 @@ fun TimelineEvent.isEdition(): Boolean {
}

fun TimelineEvent.getTextEditableContent(): String? {
val lastContent = getLastMessageContent()
val lastBody = getLastMessageBody()
return if (isReply()) {
return extractUsefulTextFromReply(lastContent?.body ?: "")
return extractUsefulTextFromReply(lastBody ?: "")
} else {
lastContent?.body ?: ""
lastBody
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
*/
package org.matrix.android.sdk.api.util

import org.matrix.android.sdk.internal.util.unescapeHtml

object ContentUtils {
fun extractUsefulTextFromReply(repliedBody: String): String {
val lines = repliedBody.lines()
Expand Down Expand Up @@ -44,4 +46,13 @@ object ContentUtils {
}
return repliedBody
}

@Suppress("RegExpRedundantEscape")
fun formatSpoilerTextFromHtml(formattedBody: String): String {
// var reason = "",
// can capture the spoiler reason for better formatting? ex. { reason = it.value; ">"}
return formattedBody.replace("(?<=<span data-mx-spoiler)=\\\".+?\\\">".toRegex(), ">")
.replace("(?<=<span data-mx-spoiler>).+?(?=</span>)".toRegex(), { "█".repeat(it.value.length); })
.unescapeHtml()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import org.matrix.android.sdk.api.session.room.model.message.MessageType
import org.matrix.android.sdk.api.session.room.model.message.OPTION_TYPE_BUTTONS
import org.matrix.android.sdk.api.session.room.model.relation.ReactionContent
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
import org.matrix.android.sdk.api.session.room.timeline.getLastMessageBody
import org.matrix.android.sdk.api.session.room.timeline.getLastMessageContent
import org.matrix.android.sdk.api.session.room.timeline.getTextEditableContent
import org.matrix.android.sdk.api.session.room.timeline.isReply
Expand Down Expand Up @@ -93,7 +94,19 @@ class DisplayableEventFormatter @Inject constructor(
simpleFormat(senderName, stringProvider.getString(R.string.sent_a_video), appendAuthor)
}
MessageType.MSGTYPE_FILE -> {
simpleFormat(senderName, stringProvider.getString(R.string.sent_a_file), appendAuthor)
return simpleFormat(senderName, stringProvider.getString(R.string.sent_a_file), appendAuthor)
}
MessageType.MSGTYPE_TEXT -> {
todo fix merge issue
return if (timelineEvent.isReply()) {
// Skip reply prefix, and show important
// TODO add a reply image span ?
simpleFormat(senderName, timelineEvent.getTextEditableContent()
?: messageContent.body, appendAuthor)
} else {
simpleFormat(senderName, timelineEvent.getLastMessageBody()
?: messageContent.body, appendAuthor)
}
}
MessageType.MSGTYPE_RESPONSE -> {
// do not show that?
Expand Down