Custom emojis: detect as emoji-only

Change-Id: Ia147a0362eb7d930ad6709bca0f86b51cb62612e
This commit is contained in:
SpiritCroc 2022-05-08 10:31:25 +02:00
parent 04cc69c206
commit 797a8c6c10
2 changed files with 16 additions and 2 deletions

View file

@ -18,6 +18,14 @@ package im.vector.app.core.utils
import com.vanniktech.emoji.EmojiUtils
/**
* Replace custom emojis with some other arbitrary emoji, so we can maintain our logic
* for when to display emoji-only messages larger than others.
*/
fun customToPseudoEmoji(str: String): String {
return str.replace(Regex("""<img\s+([^>]*)data-mx-emoticon([^>]*)>"""), "\uD83D\uDC40")
}
/**
* Test if a string contains emojis.
* It seems that the regex [emoji_regex]+ does not work.

View file

@ -34,6 +34,7 @@ import im.vector.app.core.resources.StringProvider
import im.vector.app.core.time.Clock
import im.vector.app.core.utils.DimensionConverter
import im.vector.app.core.utils.containsOnlyEmojis
import im.vector.app.core.utils.customToPseudoEmoji
import im.vector.app.features.home.room.detail.timeline.TimelineEventController
import im.vector.app.features.home.room.detail.timeline.helper.AudioMessagePlaybackTracker
import im.vector.app.features.home.room.detail.timeline.helper.AvatarSizeProvider
@ -615,7 +616,8 @@ class MessageItemFactory @Inject constructor(
): MessageTextItem? {
val compressed = htmlCompressor.compress(matrixFormattedBody)
val renderedFormattedBody = htmlRenderer.get().render(compressed, pillsPostProcessor) as Spanned
return buildMessageTextItem(renderedFormattedBody, true, informationData, highlight, callback, attributes)
val pseudoEmojiBody = htmlRenderer.get().render(customToPseudoEmoji(compressed), pillsPostProcessor) as Spanned
return buildMessageTextItem(renderedFormattedBody, true, informationData, highlight, callback, attributes, pseudoEmojiBody)
}
private fun buildMessageTextItem(
@ -625,11 +627,15 @@ class MessageItemFactory @Inject constructor(
highlight: Boolean,
callback: TimelineEventController.Callback?,
attributes: AbsMessageItem.Attributes,
emojiCheckCharSequence: CharSequence? = null
): MessageTextItem? {
val renderedBody = textRenderer.render(body)
val bindingOptions = spanUtils.getBindingOptions(renderedBody)
val linkifiedBody = renderedBody.linkify(callback)
// Only for checking if it's a emoji-only message
val pseudoEmojiBody = emojiCheckCharSequence ?: linkifiedBody
return MessageTextItem_()
.message(
if (informationData.hasBeenEdited) {
@ -638,7 +644,7 @@ class MessageItemFactory @Inject constructor(
linkifiedBody
}.toMessageTextEpoxyCharSequence()
)
.useBigFont(linkifiedBody.length <= MAX_NUMBER_OF_EMOJI_FOR_BIG_FONT * 2 && containsOnlyEmojis(linkifiedBody.toString()))
.useBigFont(pseudoEmojiBody.length <= MAX_NUMBER_OF_EMOJI_FOR_BIG_FONT * 2 && containsOnlyEmojis(pseudoEmojiBody.toString()))
.bindingOptions(bindingOptions)
.markwonPlugins(htmlRenderer.get().plugins)
.searchForPills(isFormatted)