commit 5d2277db7c9d070ce47fa470231f84c41dcd41aa
parent 029850abcc07f6b646f08358bc910b84712ef1e0
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Fri, 21 Jun 2024 20:58:48 +0200

fix(core): inapp overlay

Signed-off-by: rhunk <101876869+rhunk@users.noreply.github.com>

Diffstat:
Mcore/src/main/kotlin/me/rhunk/snapenhance/core/ModContext.kt | 2+-
Mcore/src/main/kotlin/me/rhunk/snapenhance/core/ui/InAppOverlay.kt | 21+++++++++++++++++----
2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/ModContext.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/ModContext.kt @@ -68,7 +68,7 @@ class ModContext( val native = NativeLib() val scriptRuntime by lazy { CoreScriptRuntime(this, log) } val messagingBridge = CoreMessagingBridge(this) - val inAppOverlay = InAppOverlay() + val inAppOverlay = InAppOverlay(this) val isDeveloper by lazy { config.scripting.developerMode.get() } diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/ui/InAppOverlay.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/ui/InAppOverlay.kt @@ -33,12 +33,16 @@ import kotlinx.coroutines.delay import me.rhunk.snapenhance.common.ui.AppMaterialTheme import me.rhunk.snapenhance.common.ui.createComposeView import me.rhunk.snapenhance.common.util.ktx.copyToClipboard +import me.rhunk.snapenhance.core.ModContext import me.rhunk.snapenhance.core.util.hook.HookStage import me.rhunk.snapenhance.core.util.hook.Hooker import me.rhunk.snapenhance.core.util.ktx.isDarkTheme import kotlin.math.roundToInt +import kotlin.random.Random -class InAppOverlay { +class InAppOverlay( + private val context: ModContext +) { companion object { fun showCrashOverlay(content: String, throwable: Throwable? = null) { Hooker.ephemeralHook(Activity::class.java, "onPostCreate", HookStage.AFTER) { param -> @@ -179,19 +183,27 @@ class InAppOverlay { } } - fun onActivityCreate(activity: Activity) { + private val overlayTag = Random.nextLong() + + private fun injectOverlay(activity: Activity) { val root = activity.findViewById<FrameLayout>(android.R.id.content) - root.post { + activity.runOnUiThread { + if (root.findViewWithTag<View>(overlayTag) != null) return@runOnUiThread root.addView(createComposeView(activity) { AppMaterialTheme(isDarkTheme = remember { activity.isDarkTheme() }) { OverlayContent() } }.apply { + tag = overlayTag layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT) }) } } + fun onActivityCreate(activity: Activity) { + injectOverlay(activity) + } + @Composable private fun DurationProgress( duration: Int, @@ -228,7 +240,7 @@ class InAppOverlay { ) } - fun showToast( + private fun showToast( icon: @Composable () -> Unit = { Icon(Icons.Outlined.Warning, contentDescription = "icon", modifier = Modifier.size(32.dp)) }, @@ -236,6 +248,7 @@ class InAppOverlay { durationMs: Int = 3000, showDuration: Boolean = true, ) { + injectOverlay(context.mainActivity!!) toasts.add(Toast( composable = { ElevatedCard(