From 2de7a5aa112a0b1ac7516e017f8a7186b6bb7d5b Mon Sep 17 00:00:00 2001 From: Infi Date: Tue, 14 Mar 2023 00:56:48 +0100 Subject: [PATCH] fix: a bunch of crashes --- .../chat/revolt/components/chat/Message.kt | 2 +- .../revolt/components/generic/Markdown.kt | 2 +- .../screens/chat/views/ChannelScreen.kt | 20 ++++++++++++++++--- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/chat/revolt/components/chat/Message.kt b/app/src/main/java/chat/revolt/components/chat/Message.kt index ece442a6..dea244e2 100644 --- a/app/src/main/java/chat/revolt/components/chat/Message.kt +++ b/app/src/main/java/chat/revolt/components/chat/Message.kt @@ -142,7 +142,7 @@ fun Message( if (message.content.isBlank()) return@let // if only an attachment is sent AndroidView(factory = { ctx -> - androidx.appcompat.widget.AppCompatTextView(ctx).apply { + android.widget.TextView(ctx).apply { text = parse(message) maxLines = if (truncate) 1 else Int.MAX_VALUE ellipsize = TextUtils.TruncateAt.END diff --git a/app/src/main/java/chat/revolt/components/generic/Markdown.kt b/app/src/main/java/chat/revolt/components/generic/Markdown.kt index b348c236..8d2936a9 100644 --- a/app/src/main/java/chat/revolt/components/generic/Markdown.kt +++ b/app/src/main/java/chat/revolt/components/generic/Markdown.kt @@ -89,7 +89,7 @@ fun UIMarkdown( AndroidView( factory = { - androidx.appcompat.widget.AppCompatTextView(it).apply { + android.widget.TextView(it).apply { ellipsize = TextUtils.TruncateAt.END typeface = ResourcesCompat.getFont(it, R.font.inter) diff --git a/app/src/main/java/chat/revolt/screens/chat/views/ChannelScreen.kt b/app/src/main/java/chat/revolt/screens/chat/views/ChannelScreen.kt index a266b3ac..82f9109d 100644 --- a/app/src/main/java/chat/revolt/screens/chat/views/ChannelScreen.kt +++ b/app/src/main/java/chat/revolt/screens/chat/views/ChannelScreen.kt @@ -67,6 +67,7 @@ import chat.revolt.internals.markdown.createInlineCodeRule import com.discord.simpleast.core.simple.SimpleMarkdownRules import com.discord.simpleast.core.simple.SimpleRenderer import io.ktor.http.* +import io.sentry.Sentry import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.flow.distinctUntilChanged @@ -213,6 +214,11 @@ class ChannelScreenViewModel : ViewModel() { } private fun registerCallbacks() { + if (channel?.id == null) { + Sentry.captureException(IllegalStateException("Channel ID is null while trying to register callbacks")) + return + } + _channelCallback.value = ChannelScreenCallback() RealtimeSocket.registerChannelCallback(channel!!.id!!, channelCallback!!) @@ -344,7 +350,7 @@ class ChannelScreenViewModel : ViewModel() { } private fun regroupMessages(newMessages: List = renderableMessages) { - val groupedMessages = arrayListOf() + val groupedMessages = mutableMapOf() // Verbatim implementation of https://wiki.rvlt.gg/index.php/Text_Channel_(UI)#Message_Grouping_Algorithm // The exception is the date variable being pushed into cache, we don't need that here. @@ -372,10 +378,12 @@ class ChannelScreenViewModel : ViewModel() { tail = false } - groupedMessages.add(message.copy(tail = tail)) + if (groupedMessages.containsKey(message.id!!)) return@forEach + + groupedMessages[message.id] = message.copy(tail = tail) } - setRenderableMessages(groupedMessages) + setRenderableMessages(groupedMessages.values.toList()) } private var debouncedChannelAck: Job? = null @@ -448,6 +456,12 @@ fun ChannelScreen( viewModel.fetchChannel(channelId) } + LaunchedEffect(viewModel.channel) { + if (viewModel.channel?.id != channelId) { + viewModel.fetchChannel(channelId) + } + } + DisposableEffect(channelId) { onDispose { RealtimeSocket.unregisterChannelCallback(channelId)