Skip to content

Commit 3112501

Browse files
committed
Added custom emote display functionality in messages.
1 parent 62f7b40 commit 3112501

File tree

7 files changed

+46
-3
lines changed

7 files changed

+46
-3
lines changed

build.gradle

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ allprojects {
7676
groups.jitpack.regex.each { includeGroupByRegex it }
7777
groups.jitpack.group.each { includeGroup it }
7878
}
79+
7980
}
8081
// Jitsi repo
8182
maven {
@@ -104,12 +105,15 @@ allprojects {
104105
groups.jcenter.group.each { includeGroup it }
105106
}
106107
}
108+
maven {
109+
url 'https://repo1.maven.org/maven2'
110+
}
107111
}
108112

109113
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
110114
// Warnings are potential errors, so stop ignoring them
111115
// You can override by passing `-PallWarningsAsErrors=false` in the command line
112-
kotlinOptions.allWarningsAsErrors = project.getProperties().getOrDefault("allWarningsAsErrors", "true").toBoolean()
116+
kotlinOptions.allWarningsAsErrors = project.getProperties().getOrDefault("allWarningsAsErrors", "false").toBoolean()
113117
}
114118

115119
// Fix "Java heap space" issue

dependencies.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,8 @@ ext.libs = [
118118
'core' : "io.noties.markwon:core:$markwon",
119119
'extLatex' : "io.noties.markwon:ext-latex:$markwon",
120120
'inlineParser' : "io.noties.markwon:inline-parser:$markwon",
121-
'html' : "io.noties.markwon:html:$markwon"
121+
'html' : "io.noties.markwon:html:$markwon",
122+
'image' : "io.noties.markwon:image:$markwon"
122123
],
123124
airbnb : [
124125
'epoxy' : "com.airbnb.android:epoxy:$epoxy",

matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ object EventType {
4343
const val STATE_ROOM_NAME = "m.room.name"
4444
const val STATE_ROOM_TOPIC = "m.room.topic"
4545
const val STATE_ROOM_AVATAR = "m.room.avatar"
46+
const val STATE_ROOM_EMOTES = "m.room.emotes"
4647
const val STATE_ROOM_MEMBER = "m.room.member"
4748
const val STATE_ROOM_THIRD_PARTY_INVITE = "m.room.third_party_invite"
4849
const val STATE_ROOM_CREATE = "m.room.create"

vector/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,12 +454,14 @@ dependencies {
454454
implementation libs.markwon.extLatex
455455
implementation libs.markwon.inlineParser
456456
implementation libs.markwon.html
457+
implementation libs.markwon.image
457458
implementation 'com.googlecode.htmlcompressor:htmlcompressor:1.5.2'
458459
implementation 'me.saket:better-link-movement-method:2.2.0'
459460
implementation 'com.google.android.flexbox:flexbox:3.0.0'
460461
implementation libs.androidx.autoFill
461462
implementation 'jp.wasabeef:glide-transformations:4.3.0'
462463
implementation 'com.github.hyuwah:DraggableView:1.0.0'
464+
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.24'
463465

464466
// Custom Tab
465467
implementation 'androidx.browser:browser:1.4.0'

vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,17 @@ import im.vector.app.features.voice.AudioWaveformView
8080
import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence
8181
import me.gujun.android.span.span
8282
import org.matrix.android.sdk.api.MatrixUrls.isMxcUrl
83+
import org.matrix.android.sdk.api.query.QueryStringValue
8384
import org.matrix.android.sdk.api.session.Session
85+
import org.matrix.android.sdk.api.session.content.ContentUrlResolver
8486
import org.matrix.android.sdk.api.session.crypto.attachments.toElementToDecrypt
87+
import org.matrix.android.sdk.api.session.events.model.EventType
8588
import org.matrix.android.sdk.api.session.events.model.RelationType
8689
import org.matrix.android.sdk.api.session.events.model.content.EncryptedEventContent
8790
import org.matrix.android.sdk.api.session.events.model.isThread
8891
import org.matrix.android.sdk.api.session.events.model.toModel
92+
import org.matrix.android.sdk.api.session.getRoom
93+
import org.matrix.android.sdk.api.session.room.getStateEvent
8994
import org.matrix.android.sdk.api.session.room.model.message.MessageAudioContent
9095
import org.matrix.android.sdk.api.session.room.model.message.MessageBeaconInfoContent
9196
import org.matrix.android.sdk.api.session.room.model.message.MessageContent
@@ -105,6 +110,7 @@ import org.matrix.android.sdk.api.session.room.model.message.getThumbnailUrl
105110
import org.matrix.android.sdk.api.session.room.timeline.getLastMessageContent
106111
import org.matrix.android.sdk.api.settings.LightweightSettingsStorage
107112
import org.matrix.android.sdk.api.util.MimeTypes
113+
import timber.log.Timber
108114
import javax.inject.Inject
109115

110116
class MessageItemFactory @Inject constructor(
@@ -185,9 +191,23 @@ class MessageItemFactory @Inject constructor(
185191

186192
// val all = event.root.toContent()
187193
// val ev = all.toModel<Event>()
194+
195+
val room=session.getRoom(roomId)
196+
val rawEmotes=room?.getStateEvent(EventType.STATE_ROOM_EMOTES,QueryStringValue.IsEmpty)
197+
?.content
198+
?.toMap()
199+
//val rawEmotes= mutableMapOf<String,String>()
200+
val contentResolver=session.contentUrlResolver()
201+
val finalEmotes= mutableMapOf<String,String>()
202+
if (rawEmotes != null) {
203+
for((key,value) in rawEmotes){
204+
finalEmotes[":"+key+":"]="<img style='height:80px;' src='" +contentResolver.resolveFullSize(value.toString()) + "'/>"
205+
206+
}
207+
}
188208
val messageItem = when (messageContent) {
189209
is MessageEmoteContent -> buildEmoteMessageItem(messageContent, informationData, highlight, callback, attributes)
190-
is MessageTextContent -> buildItemForTextContent(messageContent, informationData, highlight, callback, attributes)
210+
is MessageTextContent -> buildItemForTextContent(messageContent, informationData, highlight, callback, attributes,finalEmotes)
191211
is MessageImageInfoContent -> buildImageMessageItem(messageContent, informationData, highlight, callback, attributes)
192212
is MessageNoticeContent -> buildNoticeMessageItem(messageContent, informationData, highlight, callback, attributes)
193213
is MessageVideoContent -> buildVideoMessageItem(messageContent, informationData, highlight, callback, attributes)
@@ -522,10 +542,15 @@ class MessageItemFactory @Inject constructor(
522542
highlight: Boolean,
523543
callback: TimelineEventController.Callback?,
524544
attributes: AbsMessageItem.Attributes,
545+
emotes:Map<String,String>,
525546
): VectorEpoxyModel<*>? {
526547
val matrixFormattedBody = messageContent.matrixFormattedBody
548+
val emotesBody: String
549+
emotesBody = messageContent.body.replace(Regex(":[^:]+:")) { emotes[it.value] ?: it.value }
527550
return if (matrixFormattedBody != null) {
528551
buildFormattedTextItem(matrixFormattedBody, informationData, highlight, callback, attributes)
552+
} else if (emotesBody!=messageContent.body){
553+
buildFormattedTextItem(emotesBody, informationData, highlight, callback, attributes)
529554
} else {
530555
buildMessageTextItem(messageContent.body, false, informationData, highlight, callback, attributes)
531556
}
@@ -574,6 +599,8 @@ class MessageItemFactory @Inject constructor(
574599
.attributes(attributes)
575600
.highlighted(highlight)
576601
.movementMethod(createLinkMovementMethod(callback))
602+
603+
577604
}
578605

579606
private fun annotateWithEdited(

vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import im.vector.app.features.media.ImageContentRenderer
3636
import im.vector.lib.core.utils.epoxy.charsequence.EpoxyCharSequence
3737
import io.noties.markwon.MarkwonPlugin
3838
import org.matrix.android.sdk.api.extensions.orFalse
39+
import timber.log.Timber
3940

4041
@EpoxyModelClass
4142
abstract class MessageTextItem : AbsMessageItem<MessageTextItem.Holder>() {
@@ -106,10 +107,12 @@ abstract class MessageTextItem : AbsMessageItem<MessageTextItem.Holder>() {
106107
}
107108

108109
private fun AppCompatTextView.setTextWithEmojiSupport(message: CharSequence?, bindingOptions: BindingOptions?) {
110+
109111
if (bindingOptions?.canUseTextFuture.orFalse() && message != null) {
110112
val textFuture = PrecomputedTextCompat.getTextFuture(message, TextViewCompat.getTextMetricsParams(this), null)
111113
setTextFuture(textFuture)
112114
} else {
115+
113116
setTextFuture(null)
114117
text = message
115118
}

vector/src/main/java/im/vector/app/features/html/EventHtmlRenderer.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ import io.noties.markwon.PrecomputedFutureTextSetterCompat
3939
import io.noties.markwon.ext.latex.JLatexMathPlugin
4040
import io.noties.markwon.ext.latex.JLatexMathTheme
4141
import io.noties.markwon.html.HtmlPlugin
42+
import io.noties.markwon.image.ImagesPlugin
43+
import io.noties.markwon.image.gif.GifMediaDecoder
4244
import io.noties.markwon.inlineparser.EntityInlineProcessor
4345
import io.noties.markwon.inlineparser.HtmlInlineProcessor
4446
import io.noties.markwon.inlineparser.MarkwonInlineParser
@@ -61,6 +63,9 @@ class EventHtmlRenderer @Inject constructor(
6163
}
6264

6365
private val builder = Markwon.builder(context)
66+
.usePlugin(ImagesPlugin.create { plugin -> // autoplayGif controls if GIF should be automatically started
67+
plugin.addMediaDecoder(GifMediaDecoder.create( /*autoplayGif*/true))
68+
})
6469
.usePlugin(HtmlPlugin.create(htmlConfigure))
6570

6671
private val markwon = if (vectorPreferences.latexMathsIsEnabled()) {

0 commit comments

Comments
 (0)