Skip to content

Commit

Permalink
Added custom emote display functionality in messages.
Browse files Browse the repository at this point in the history
  • Loading branch information
nmscode committed Aug 15, 2022
1 parent 62f7b40 commit 3112501
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 3 deletions.
6 changes: 5 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ allprojects {
groups.jitpack.regex.each { includeGroupByRegex it }
groups.jitpack.group.each { includeGroup it }
}

}
// Jitsi repo
maven {
Expand Down Expand Up @@ -104,12 +105,15 @@ allprojects {
groups.jcenter.group.each { includeGroup it }
}
}
maven {
url 'https://repo1.maven.org/maven2'
}
}

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

// Fix "Java heap space" issue
Expand Down
3 changes: 2 additions & 1 deletion dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,8 @@ ext.libs = [
'core' : "io.noties.markwon:core:$markwon",
'extLatex' : "io.noties.markwon:ext-latex:$markwon",
'inlineParser' : "io.noties.markwon:inline-parser:$markwon",
'html' : "io.noties.markwon:html:$markwon"
'html' : "io.noties.markwon:html:$markwon",
'image' : "io.noties.markwon:image:$markwon"
],
airbnb : [
'epoxy' : "com.airbnb.android:epoxy:$epoxy",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ object EventType {
const val STATE_ROOM_NAME = "m.room.name"
const val STATE_ROOM_TOPIC = "m.room.topic"
const val STATE_ROOM_AVATAR = "m.room.avatar"
const val STATE_ROOM_EMOTES = "m.room.emotes"
const val STATE_ROOM_MEMBER = "m.room.member"
const val STATE_ROOM_THIRD_PARTY_INVITE = "m.room.third_party_invite"
const val STATE_ROOM_CREATE = "m.room.create"
Expand Down
2 changes: 2 additions & 0 deletions vector/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -454,12 +454,14 @@ dependencies {
implementation libs.markwon.extLatex
implementation libs.markwon.inlineParser
implementation libs.markwon.html
implementation libs.markwon.image
implementation 'com.googlecode.htmlcompressor:htmlcompressor:1.5.2'
implementation 'me.saket:better-link-movement-method:2.2.0'
implementation 'com.google.android.flexbox:flexbox:3.0.0'
implementation libs.androidx.autoFill
implementation 'jp.wasabeef:glide-transformations:4.3.0'
implementation 'com.github.hyuwah:DraggableView:1.0.0'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.24'

// Custom Tab
implementation 'androidx.browser:browser:1.4.0'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,12 +80,17 @@ import im.vector.app.features.voice.AudioWaveformView
import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence
import me.gujun.android.span.span
import org.matrix.android.sdk.api.MatrixUrls.isMxcUrl
import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.content.ContentUrlResolver
import org.matrix.android.sdk.api.session.crypto.attachments.toElementToDecrypt
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.RelationType
import org.matrix.android.sdk.api.session.events.model.content.EncryptedEventContent
import org.matrix.android.sdk.api.session.events.model.isThread
import org.matrix.android.sdk.api.session.events.model.toModel
import org.matrix.android.sdk.api.session.getRoom
import org.matrix.android.sdk.api.session.room.getStateEvent
import org.matrix.android.sdk.api.session.room.model.message.MessageAudioContent
import org.matrix.android.sdk.api.session.room.model.message.MessageBeaconInfoContent
import org.matrix.android.sdk.api.session.room.model.message.MessageContent
Expand All @@ -105,6 +110,7 @@ import org.matrix.android.sdk.api.session.room.model.message.getThumbnailUrl
import org.matrix.android.sdk.api.session.room.timeline.getLastMessageContent
import org.matrix.android.sdk.api.settings.LightweightSettingsStorage
import org.matrix.android.sdk.api.util.MimeTypes
import timber.log.Timber
import javax.inject.Inject

class MessageItemFactory @Inject constructor(
Expand Down Expand Up @@ -185,9 +191,23 @@ class MessageItemFactory @Inject constructor(

// val all = event.root.toContent()
// val ev = all.toModel<Event>()

val room=session.getRoom(roomId)
val rawEmotes=room?.getStateEvent(EventType.STATE_ROOM_EMOTES,QueryStringValue.IsEmpty)
?.content
?.toMap()
//val rawEmotes= mutableMapOf<String,String>()
val contentResolver=session.contentUrlResolver()
val finalEmotes= mutableMapOf<String,String>()
if (rawEmotes != null) {
for((key,value) in rawEmotes){
finalEmotes[":"+key+":"]="<img style='height:80px;' src='" +contentResolver.resolveFullSize(value.toString()) + "'/>"

}
}
val messageItem = when (messageContent) {
is MessageEmoteContent -> buildEmoteMessageItem(messageContent, informationData, highlight, callback, attributes)
is MessageTextContent -> buildItemForTextContent(messageContent, informationData, highlight, callback, attributes)
is MessageTextContent -> buildItemForTextContent(messageContent, informationData, highlight, callback, attributes,finalEmotes)
is MessageImageInfoContent -> buildImageMessageItem(messageContent, informationData, highlight, callback, attributes)
is MessageNoticeContent -> buildNoticeMessageItem(messageContent, informationData, highlight, callback, attributes)
is MessageVideoContent -> buildVideoMessageItem(messageContent, informationData, highlight, callback, attributes)
Expand Down Expand Up @@ -522,10 +542,15 @@ class MessageItemFactory @Inject constructor(
highlight: Boolean,
callback: TimelineEventController.Callback?,
attributes: AbsMessageItem.Attributes,
emotes:Map<String,String>,
): VectorEpoxyModel<*>? {
val matrixFormattedBody = messageContent.matrixFormattedBody
val emotesBody: String
emotesBody = messageContent.body.replace(Regex(":[^:]+:")) { emotes[it.value] ?: it.value }
return if (matrixFormattedBody != null) {
buildFormattedTextItem(matrixFormattedBody, informationData, highlight, callback, attributes)
} else if (emotesBody!=messageContent.body){
buildFormattedTextItem(emotesBody, informationData, highlight, callback, attributes)
} else {
buildMessageTextItem(messageContent.body, false, informationData, highlight, callback, attributes)
}
Expand Down Expand Up @@ -574,6 +599,8 @@ class MessageItemFactory @Inject constructor(
.attributes(attributes)
.highlighted(highlight)
.movementMethod(createLinkMovementMethod(callback))


}

private fun annotateWithEdited(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import im.vector.app.features.media.ImageContentRenderer
import im.vector.lib.core.utils.epoxy.charsequence.EpoxyCharSequence
import io.noties.markwon.MarkwonPlugin
import org.matrix.android.sdk.api.extensions.orFalse
import timber.log.Timber

@EpoxyModelClass
abstract class MessageTextItem : AbsMessageItem<MessageTextItem.Holder>() {
Expand Down Expand Up @@ -106,10 +107,12 @@ abstract class MessageTextItem : AbsMessageItem<MessageTextItem.Holder>() {
}

private fun AppCompatTextView.setTextWithEmojiSupport(message: CharSequence?, bindingOptions: BindingOptions?) {

if (bindingOptions?.canUseTextFuture.orFalse() && message != null) {
val textFuture = PrecomputedTextCompat.getTextFuture(message, TextViewCompat.getTextMetricsParams(this), null)
setTextFuture(textFuture)
} else {

setTextFuture(null)
text = message
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ import io.noties.markwon.PrecomputedFutureTextSetterCompat
import io.noties.markwon.ext.latex.JLatexMathPlugin
import io.noties.markwon.ext.latex.JLatexMathTheme
import io.noties.markwon.html.HtmlPlugin
import io.noties.markwon.image.ImagesPlugin
import io.noties.markwon.image.gif.GifMediaDecoder
import io.noties.markwon.inlineparser.EntityInlineProcessor
import io.noties.markwon.inlineparser.HtmlInlineProcessor
import io.noties.markwon.inlineparser.MarkwonInlineParser
Expand All @@ -61,6 +63,9 @@ class EventHtmlRenderer @Inject constructor(
}

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

private val markwon = if (vectorPreferences.latexMathsIsEnabled()) {
Expand Down

0 comments on commit 3112501

Please sign in to comment.