diff --git a/changelog.d/3477.feature b/changelog.d/3477.feature new file mode 100644 index 00000000000..c6f8820b4cc --- /dev/null +++ b/changelog.d/3477.feature @@ -0,0 +1 @@ +Make notification text spoiler aware \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt index 4a6462477dc..9b3d2aa3297 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt @@ -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 /** @@ -138,7 +140,9 @@ fun TimelineEvent.getLastMessageBody(): String? { val lastMessageContent = getLastMessageContent() if (lastMessageContent != null) { - return lastMessageContent.newContent?.toModel()?.body + return lastMessageContent.newContent?.toModel()?.formattedBody?.let { ContentUtils.formatSpoilerTextFromHtml(it) } + ?: lastMessageContent.newContent?.toModel()?.body + ?: (lastMessageContent as MessageTextContent).formattedBody?.let { ContentUtils.formatSpoilerTextFromHtml(it) } ?: lastMessageContent.body } @@ -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 } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/ContentUtils.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/ContentUtils.kt index 1a00b85ff4e..fb85d42c66f 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/ContentUtils.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/ContentUtils.kt @@ -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() @@ -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("(?<=".toRegex(), ">") + .replace("(?<=).+?(?=)".toRegex(), { "█".repeat(it.value.length); }) + .unescapeHtml() + } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/format/DisplayableEventFormatter.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/format/DisplayableEventFormatter.kt index f68d2753400..6852bb465cf 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/format/DisplayableEventFormatter.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/format/DisplayableEventFormatter.kt @@ -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 @@ -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?