perf(core): bind chat message event optimization
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user