perf(core): bind chat message event optimization

This commit is contained in:
rhunk
2024-08-12 20:21:03 +02:00
parent 21395b43da
commit d40c52ddb5
4 changed files with 15 additions and 6 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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))