commit d40c52ddb501ab05fdb3ff724f2adc4c367edf97 parent 21395b43da75a86ae88af063622b5fb7e53e47c9 Author: rhunk <101876869+rhunk@users.noreply.github.com> Date: Mon, 12 Aug 2024 20:21:03 +0200 perf(core): bind chat message event optimization Diffstat:
4 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/event/events/impl/BindViewEvent.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/event/events/impl/BindViewEvent.kt @@ -1,6 +1,7 @@ package me.rhunk.snapenhance.core.event.events.impl import android.view.View +import me.rhunk.snapenhance.common.database.impl.ConversationMessage import me.rhunk.snapenhance.core.event.Event import me.rhunk.snapenhance.core.util.ktx.getId @@ -13,6 +14,14 @@ class BindViewEvent( view.resources.getId("chat_message_content_container") } + val databaseMessage by lazy { + var message: ConversationMessage? = null + chatMessage { _, messageId -> + message = context.database.getConversationMessageFromId(messageId.toLong()) + } + message + } + inline fun chatMessage(block: (conversationId: String, messageId: String) -> Unit) { val modelToString = prevModel.toString() if (!modelToString.startsWith("ChatViewModel")) return diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/tweaks/VoiceNoteAutoPlay.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/tweaks/VoiceNoteAutoPlay.kt @@ -118,7 +118,7 @@ class VoiceNoteAutoPlay: Feature("Voice Note Auto Play") { onNextActivityCreate { context.event.subscribe(BindViewEvent::class) { event -> if (!event.prevModel.toString().contains("audio_note")) return@subscribe - event.chatMessage { _, messageId -> + event.chatMessage { _, _ -> // find view model of the audio note val viewModelField = event.prevModel.javaClass.fields.firstOrNull { field -> field.type.constructors.firstOrNull()?.parameterTypes?.takeIf { it.size == 3 }?.let { args -> @@ -143,7 +143,7 @@ class VoiceNoteAutoPlay: Feature("Voice Note Auto Play") { } context.coroutineScope.launch { - val serverMessageId = context.database.getConversationMessageFromId(messageId.toLong())?.serverMessageId?.toLong() ?: return@launch + val serverMessageId = event.databaseMessage?.serverMessageId?.toLong() ?: return@launch withContext(Dispatchers.Main) { playbackMap.computeIfAbsent(serverMessageId) { mutableListOf() }.add(playbackViewComponentContext) diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/ui/MessageIndicators.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/ui/MessageIndicators.kt @@ -40,13 +40,13 @@ class MessageIndicators : Feature("Message Indicators") { val appleLogo = AppleLogo context.event.subscribe(BindViewEvent::class) { event -> - event.chatMessage { _, messageId -> + event.chatMessage { _, _ -> val parentLinearLayout = event.view.parent as? ViewGroup ?: return@subscribe parentLinearLayout.findViewWithTag<View>(messageInfoTag)?.let { parentLinearLayout.removeView(it) } event.view.removeForegroundDrawable("messageIndicators") - val message = context.database.getConversationMessageFromId(messageId.toLong()) ?: return@chatMessage + val message = event.databaseMessage ?: return@chatMessage if (message.contentType != ContentType.SNAP.id && message.contentType != ContentType.EXTERNAL_MEDIA.id) return@chatMessage val reader = ProtoReader(message.messageContent ?: return@chatMessage) diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/ui/SnapPreview.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/ui/SnapPreview.kt @@ -60,10 +60,10 @@ class SnapPreview : Feature("SnapPreview") { }.getOrNull() context.event.subscribe(BindViewEvent::class) { event -> - event.chatMessage { _, messageId -> + event.chatMessage { _, _ -> event.view.removeForegroundDrawable("snapPreview") - val message = context.database.getConversationMessageFromId(messageId.toLong()) ?: return@chatMessage + val message = event.databaseMessage ?: return@chatMessage val messageReader = ProtoReader(message.messageContent ?: return@chatMessage) val contentType = ContentType.fromMessageContainer(messageReader.followPath(4, 4))