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 package me.rhunk.snapenhance.core.event.events.impl
import android.view.View import android.view.View
import me.rhunk.snapenhance.common.database.impl.ConversationMessage
import me.rhunk.snapenhance.core.event.Event import me.rhunk.snapenhance.core.event.Event
import me.rhunk.snapenhance.core.util.ktx.getId import me.rhunk.snapenhance.core.util.ktx.getId
@@ -13,6 +14,14 @@ class BindViewEvent(
view.resources.getId("chat_message_content_container") 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) { inline fun chatMessage(block: (conversationId: String, messageId: String) -> Unit) {
val modelToString = prevModel.toString() val modelToString = prevModel.toString()
if (!modelToString.startsWith("ChatViewModel")) return if (!modelToString.startsWith("ChatViewModel")) return

View File

@@ -118,7 +118,7 @@ class VoiceNoteAutoPlay: Feature("Voice Note Auto Play") {
onNextActivityCreate { onNextActivityCreate {
context.event.subscribe(BindViewEvent::class) { event -> context.event.subscribe(BindViewEvent::class) { event ->
if (!event.prevModel.toString().contains("audio_note")) return@subscribe if (!event.prevModel.toString().contains("audio_note")) return@subscribe
event.chatMessage { _, messageId -> event.chatMessage { _, _ ->
// find view model of the audio note // find view model of the audio note
val viewModelField = event.prevModel.javaClass.fields.firstOrNull { field -> val viewModelField = event.prevModel.javaClass.fields.firstOrNull { field ->
field.type.constructors.firstOrNull()?.parameterTypes?.takeIf { it.size == 3 }?.let { args -> 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 { 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) { withContext(Dispatchers.Main) {
playbackMap.computeIfAbsent(serverMessageId) { mutableListOf() }.add(playbackViewComponentContext) playbackMap.computeIfAbsent(serverMessageId) { mutableListOf() }.add(playbackViewComponentContext)

View File

@@ -40,13 +40,13 @@ class MessageIndicators : Feature("Message Indicators") {
val appleLogo = AppleLogo val appleLogo = AppleLogo
context.event.subscribe(BindViewEvent::class) { event -> context.event.subscribe(BindViewEvent::class) { event ->
event.chatMessage { _, messageId -> event.chatMessage { _, _ ->
val parentLinearLayout = event.view.parent as? ViewGroup ?: return@subscribe val parentLinearLayout = event.view.parent as? ViewGroup ?: return@subscribe
parentLinearLayout.findViewWithTag<View>(messageInfoTag)?.let { parentLinearLayout.removeView(it) } parentLinearLayout.findViewWithTag<View>(messageInfoTag)?.let { parentLinearLayout.removeView(it) }
event.view.removeForegroundDrawable("messageIndicators") 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 if (message.contentType != ContentType.SNAP.id && message.contentType != ContentType.EXTERNAL_MEDIA.id) return@chatMessage
val reader = ProtoReader(message.messageContent ?: return@chatMessage) val reader = ProtoReader(message.messageContent ?: return@chatMessage)

View File

@@ -60,10 +60,10 @@ class SnapPreview : Feature("SnapPreview") {
}.getOrNull() }.getOrNull()
context.event.subscribe(BindViewEvent::class) { event -> context.event.subscribe(BindViewEvent::class) { event ->
event.chatMessage { _, messageId -> event.chatMessage { _, _ ->
event.view.removeForegroundDrawable("snapPreview") 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 messageReader = ProtoReader(message.messageContent ?: return@chatMessage)
val contentType = ContentType.fromMessageContainer(messageReader.followPath(4, 4)) val contentType = ContentType.fromMessageContainer(messageReader.followPath(4, 4))