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:
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(