From b6aa4857d2849774da05b3f90b057f27d35f6fea Mon Sep 17 00:00:00 2001 From: rhunk <101876869+rhunk@users.noreply.github.com> Date: Sun, 16 Mar 2025 22:40:53 +0100 Subject: [PATCH] fix(core): snap score changes Signed-off-by: rhunk <101876869+rhunk@users.noreply.github.com> --- .../impl/experiments/SnapScoreChanges.kt | 29 ++++++++++--------- .../wrapper/impl/composer/ComposerContext.kt | 13 +++++++++ 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/experiments/SnapScoreChanges.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/experiments/SnapScoreChanges.kt index 1af35cbb..abe4a94e 100644 --- a/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/experiments/SnapScoreChanges.kt +++ b/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/experiments/SnapScoreChanges.kt @@ -42,25 +42,28 @@ class SnapScoreChanges: Feature("Snap Score Changes") { if (event.viewClassName.endsWith("ProfileFlatlandFriendSnapScoreIdentityPillDialogView")) { event.view.post { - val composerViewNode = event.view.getComposerViewNode() ?: return@post - val surface = composerViewNode.getChildren().getOrNull(1) ?: return@post + event.view.getComposerContext()!!.enqueueNextRenderCallback { + val composerViewNode = event.view.getComposerViewNode() ?: return@enqueueNextRenderCallback + val surface = composerViewNode.getChildren().getOrNull(1) ?: return@enqueueNextRenderCallback - val snapTextView = surface.getChildren().lastOrNull { - it.getClassName() == "com.snap.composer.views.ComposerSnapTextView" - } ?: return@post + val snapTextView = surface.getChildren().lastOrNull { + it.getClassName() == "com.snap.composer.views.ComposerSnapTextView" + } ?: return@enqueueNextRenderCallback - val currentFriendScore = scores[lastViewedUserId] ?: (event.view.getComposerContext()?.viewModel?.getObjectField("_friendSnapScore") as? Double)?.toLong() ?: return@post + val currentFriendScore = scores[lastViewedUserId] ?: (event.view.getComposerContext()?.viewModel?.getObjectField("_friendSnapScore") as? Double)?.toLong() ?: return@enqueueNextRenderCallback - val oldSnapScore = context.bridgeClient.getTracker().updateFriendScore( - lastViewedUserId ?: return@post, - currentFriendScore - ) + val oldSnapScore = context.bridgeClient.getTracker().updateFriendScore( + lastViewedUserId ?: return@enqueueNextRenderCallback, + currentFriendScore + ) - val diff = currentFriendScore - oldSnapScore + val diff = currentFriendScore - oldSnapScore - snapTextView.setAttribute("value", "${if (oldSnapScore != -1L && diff > 0) "\uD83D\uDCC8 +$diff !\n\n" else ""}Last Checked Score: ${oldSnapScore.takeIf { it != -1L } ?: "N/A"}") - event.view.invalidate() + snapTextView.setAttribute("value", "${if (oldSnapScore != -1L && diff > 0) "\uD83D\uDCC8 +$diff !\n\n" else ""}Last Checked Score: ${oldSnapScore.takeIf { it != -1L } ?: "N/A"}") + event.view.postInvalidate() + } + event.view.postInvalidate() } } } diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/wrapper/impl/composer/ComposerContext.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/wrapper/impl/composer/ComposerContext.kt index 1b5c1a90..0396e8ed 100644 --- a/core/src/main/kotlin/me/rhunk/snapenhance/core/wrapper/impl/composer/ComposerContext.kt +++ b/core/src/main/kotlin/me/rhunk/snapenhance/core/wrapper/impl/composer/ComposerContext.kt @@ -2,10 +2,23 @@ package me.rhunk.snapenhance.core.wrapper.impl.composer import me.rhunk.snapenhance.core.wrapper.AbstractWrapper import java.lang.ref.WeakReference +import java.lang.reflect.Proxy class ComposerContext(obj: Any): AbstractWrapper(obj) { val componentPath by field("componentPath") val viewModel by field("innerViewModel") val moduleName by field("moduleName") val componentContext by field>("componentContext") + + fun enqueueNextRenderCallback(callback: () -> Unit) { + val method = instanceNonNull()::class.java.methods.firstOrNull { + it.name == "onNextLayout" + } + method?.invoke(instanceNonNull(), Proxy.newProxyInstance( + instanceNonNull()::class.java.classLoader, + arrayOf(method.parameterTypes[0]) + ) { _, _, _ -> + callback() + }) + } } \ No newline at end of file