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