fix: emoji should animate in more cases

Signed-off-by: Infi <infi@infi.sh>
This commit is contained in:
Infi 2023-10-01 00:37:24 +02:00
parent 54413154a6
commit 5a6a25c113
2 changed files with 46 additions and 23 deletions

View File

@ -31,6 +31,7 @@ import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.key
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Brush
@ -283,6 +284,7 @@ fun Message(
} }
} }
key(message.content) {
message.content?.let { message.content?.let {
if (message.content.isBlank()) return@let // if only an attachment is sent if (message.content.isBlank()) return@let // if only an attachment is sent
@ -304,6 +306,7 @@ fun Message(
} }
) )
} }
}
message.attachments?.let { message.attachments?.let {
message.attachments.forEach { attachment -> message.attachments.forEach { attachment ->

View File

@ -5,6 +5,7 @@ import android.text.SpannableStringBuilder
import android.text.Spanned import android.text.Spanned
import chat.revolt.api.REVOLT_FILES import chat.revolt.api.REVOLT_FILES
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.gif.GifDrawable
import com.discord.simpleast.core.node.Node import com.discord.simpleast.core.node.Node
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
@ -56,19 +57,38 @@ class CustomEmoteNode(private val emoteId: String, private val context: Context)
override fun render(builder: SpannableStringBuilder, renderContext: MarkdownContext) { override fun render(builder: SpannableStringBuilder, renderContext: MarkdownContext) {
val content = renderContext.emojiMap[emoteId]?.let { ":${it.name}:" } val content = renderContext.emojiMap[emoteId]?.let { ":${it.name}:" }
?: ":${emoteId}:" ?: ":${emoteId}:"
val emoteUrl = "$REVOLT_FILES/emojis/$emoteId" val isGif = renderContext.emojiMap[emoteId]?.animated ?: false
val emoteUrl = "$REVOLT_FILES/emojis/$emoteId/emote${if (isGif) ".gif" else ".png"}"
val density = context.resources.displayMetrics.density.toInt() val density = context.resources.displayMetrics.density.toInt()
builder.append(content) builder.append(content)
runBlocking(Dispatchers.IO) { runBlocking(Dispatchers.IO) {
val drawable = Glide.with(context) val drawable = try {
Glide.with(context)
.asDrawable() .asDrawable()
.load(emoteUrl) .load(emoteUrl)
.submit() .submit()
.get() .get()
} catch (e: Exception) {
null
}.also {
if (it == null) {
builder.replace(
builder.length - content.length,
builder.length,
content
)
}
} ?: return@runBlocking
val targetSize = if (renderContext.useLargeEmojis) 48 else 28 if (drawable is GifDrawable) {
drawable.apply {
start()
}
}
val targetSize = if (renderContext.useLargeEmojis) 48 else 22
val maxWidth = if (renderContext.useLargeEmojis) 58 else 38 val maxWidth = if (renderContext.useLargeEmojis) 58 else 38
val wantWidth = min( val wantWidth = min(