commit 454a441fda070dc16ce105d6fc55d2b3bb6c98e8
parent 2651651be3df31985683e7240b8fdcfa59e60751
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Tue,  9 Apr 2024 19:08:18 +0200

fix(core/ui): messaging focus

Diffstat:
Mcore/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/messaging/Messaging.kt | 37++++++++++++++-----------------------
Mcore/src/main/kotlin/me/rhunk/snapenhance/core/ui/menu/MenuViewInjector.kt | 8+-------
Mcore/src/main/kotlin/me/rhunk/snapenhance/core/ui/menu/impl/FriendFeedInfoMenu.kt | 32+++++++-------------------------
3 files changed, 22 insertions(+), 55 deletions(-)

diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/messaging/Messaging.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/messaging/Messaging.kt @@ -8,7 +8,6 @@ import me.rhunk.snapenhance.core.features.FeatureLoadParams import me.rhunk.snapenhance.core.features.impl.spying.StealthMode import me.rhunk.snapenhance.core.util.EvictingMap import me.rhunk.snapenhance.core.util.hook.HookStage -import me.rhunk.snapenhance.core.util.hook.Hooker import me.rhunk.snapenhance.core.util.hook.hook import me.rhunk.snapenhance.core.util.hook.hookConstructor import me.rhunk.snapenhance.core.util.ktx.getObjectField @@ -31,16 +30,20 @@ class Messaging : Feature("Messaging", loadParams = FeatureLoadParams.ACTIVITY_C var openedConversationUUID: SnapUUID? = null private set - var lastFetchConversationUserUUID: SnapUUID? = null + var lastFocusedConversationId: String? = null private set - var lastFetchConversationUUID: SnapUUID? = null + var lastFocusedConversationType: Int = -1 private set - var lastFetchGroupConversationUUID: SnapUUID? = null var lastFocusedMessageId: Long = -1 private set private val feedCachedSnapMessages = EvictingMap<String, List<Long>>(100) + fun resetLastFocusedConversation() { + lastFocusedConversationId = null + lastFocusedConversationType = -1 + } + override fun init() { context.classCache.conversationManager.hookConstructor(HookStage.BEFORE) { param -> conversationManager = ConversationManager(context, param.thisObject()) @@ -115,9 +118,8 @@ class Messaging : Feature("Messaging", loadParams = FeatureLoadParams.ACTIVITY_C val conversationId = viewItem.substringAfter("conversationId: ").substring(0, 36).also { if (it.startsWith("null")) return@hook } - context.database.getConversationType(conversationId)?.takeIf { it == 1 }?.run { - lastFetchGroupConversationUUID = SnapUUID(conversationId) - } + lastFocusedConversationId = conversationId + lastFocusedConversationType = context.database.getConversationType(conversationId) ?: 0 } } @@ -133,19 +135,6 @@ class Messaging : Feature("Messaging", loadParams = FeatureLoadParams.ACTIVITY_C }.sortedBy { it.orderKey }.mapNotNull { it.messageDescriptor?.messageId } } - context.mappings.useMapper(CallbackMapper::class) { - callbacks.getClass("GetOneOnOneConversationIdsCallback")?.hook("onSuccess", HookStage.BEFORE) { param -> - val userIdToConversation = (param.arg<ArrayList<*>>(0)) - .takeIf { it.isNotEmpty() } - ?.get(0) ?: return@hook - - lastFetchConversationUUID = - SnapUUID(userIdToConversation.getObjectField("mConversationId")) - lastFetchConversationUserUUID = - SnapUUID(userIdToConversation.getObjectField("mUserId")) - } - } - context.classCache.conversationManager.apply { hook("enterConversation", HookStage.BEFORE) { param -> openedConversationUUID = SnapUUID(param.arg(0)) @@ -166,7 +155,7 @@ class Messaging : Feature("Messaging", loadParams = FeatureLoadParams.ACTIVITY_C val stealthMode = context.feature(StealthMode::class) arrayOf("activate", "deactivate", "processTypingActivity").forEach { hook -> - Hooker.hook(context.classCache.presenceSession, hook, HookStage.BEFORE, { + context.classCache.presenceSession.hook(hook, HookStage.BEFORE, { context.config.messaging.hideBitmojiPresence.get() || stealthMode.canUseRule(openedConversationUUID.toString()) }) { it.setResult(null) @@ -184,8 +173,10 @@ class Messaging : Feature("Messaging", loadParams = FeatureLoadParams.ACTIVITY_C } context.classCache.conversationManager.hook("fetchMessage", HookStage.BEFORE) { param -> - lastFetchConversationUserUUID = SnapUUID((param.arg(0) as Any)) - lastFocusedMessageId = param.arg(1) + val conversationId = SnapUUID(param.arg(0)).toString() + if (openedConversationUUID?.toString() == conversationId) { + lastFocusedMessageId = param.arg(1) + } } context.classCache.conversationManager.hook("sendTypingNotification", HookStage.BEFORE, { diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/ui/menu/MenuViewInjector.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/ui/menu/MenuViewInjector.kt @@ -110,18 +110,12 @@ class MenuViewInjector : Feature("MenuViewInjector", loadParams = FeatureLoadPar return@subscribe } - if (viewGroup !is LinearLayout && childView.id == actionMenu && messaging.lastFetchGroupConversationUUID != null) { + if (viewGroup !is LinearLayout && childView.id == actionMenu && messaging.lastFocusedConversationType == 1) { val injectedLayout = LinearLayout(childView.context).apply { orientation = LinearLayout.VERTICAL gravity = Gravity.BOTTOM layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) addView(childView) - addOnAttachStateChangeListener(object: View.OnAttachStateChangeListener { - override fun onViewAttachedToWindow(v: View) {} - override fun onViewDetachedFromWindow(v: View) { - messaging.lastFetchGroupConversationUUID = null - } - }) } event.parent.post { diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/ui/menu/impl/FriendFeedInfoMenu.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/ui/menu/impl/FriendFeedInfoMenu.kt @@ -259,30 +259,6 @@ class FriendFeedInfoMenu : AbstractMenu() { builder.show() } - private fun getCurrentConversationInfo(): Pair<String, String?> { - val messaging = context.feature(Messaging::class) - val focusedConversationTargetUser: String? = messaging.lastFetchConversationUserUUID?.toString() - - //mapped conversation fetch (may not work with legacy sc versions) - messaging.lastFetchGroupConversationUUID?.let { - context.database.getFeedEntryByConversationId(it.toString())?.let { friendFeedInfo -> - val participantSize = friendFeedInfo.participantsSize - return it.toString() to if (participantSize == 1) focusedConversationTargetUser else null - } - throw IllegalStateException("No conversation found") - } - - //old conversation fetch - val conversationId = if (messaging.lastFetchConversationUUID == null && focusedConversationTargetUser != null) { - val conversation: UserConversationLink = context.database.getConversationLinkFromUserId(focusedConversationTargetUser) ?: throw IllegalStateException("No conversation found") - conversation.clientConversationId!!.trim().lowercase() - } else { - messaging.lastFetchConversationUUID.toString() - } - - return conversationId to focusedConversationTargetUser - } - private fun createToggleFeature(viewConsumer: ((View) -> Unit), value: String, checked: () -> Boolean, toggle: (Boolean) -> Unit) { viewConsumer(Switch(context.androidContext).apply { text = this@FriendFeedInfoMenu.context.translation[value] @@ -301,7 +277,13 @@ class FriendFeedInfoMenu : AbstractMenu() { val friendFeedMenuOptions by context.config.userInterface.friendFeedMenuButtons if (friendFeedMenuOptions.isEmpty()) return - val (conversationId, targetUser) = getCurrentConversationInfo() + val messaging = context.feature(Messaging::class) + val conversationId = messaging.lastFocusedConversationId ?: run { + context.shortToast("No conversation focused!") + return + } + val targetUser = context.database.getDMOtherParticipant(conversationId) + messaging.resetLastFocusedConversation() val translation = context.translation.getCategory("friend_menu_option") if (friendFeedMenuOptions.contains("conversation_info")) {