From 86fbed60eb9d23c808d4a065fe0d2ad9b812b024 Mon Sep 17 00:00:00 2001
From: Der_Googler <54764558+DerGoogler@users.noreply.github.com>
Date: Sat, 3 May 2025 21:08:34 +0200
Subject: [PATCH] Add Eruda Support for WebUI X (#354)
* manager: Improvements
- Bump MMRL version
- Improved SwitchItem when it is not enabled
- Added option to enable eruda
* manager: Use custom user agent for WebUI X
---
.../ksunext/ui/component/SettingsItem.kt | 37 +++++++++++++++++--
.../com/rifsxd/ksunext/ui/screen/Settings.kt | 19 ++++++++++
.../rifsxd/ksunext/ui/webui/WebUIActivity.kt | 2 +-
.../rifsxd/ksunext/ui/webui/WebUIXActivity.kt | 26 +++++++++++--
manager/app/src/main/res/values/strings.xml | 2 +
manager/gradle/libs.versions.toml | 2 +-
6 files changed, 79 insertions(+), 9 deletions(-)
diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/SettingsItem.kt b/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/SettingsItem.kt
index 080ee3c9..786cfe3e 100644
--- a/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/SettingsItem.kt
+++ b/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/SettingsItem.kt
@@ -5,14 +5,18 @@ import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.selection.toggleable
import androidx.compose.material3.Icon
import androidx.compose.material3.ListItem
+import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.RadioButton
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.semantics.Role
+import com.dergoogler.mmrl.ui.component.LabelItem
+import com.dergoogler.mmrl.ui.component.text.TextRow
@Composable
fun SwitchItem(
@@ -21,9 +25,11 @@ fun SwitchItem(
summary: String? = null,
checked: Boolean,
enabled: Boolean = true,
- onCheckedChange: (Boolean) -> Unit
+ beta: Boolean = false,
+ onCheckedChange: (Boolean) -> Unit,
) {
val interactionSource = remember { MutableInteractionSource() }
+ val stateAlpha = remember(checked, enabled) { Modifier.alpha(if (enabled) 1f else 0.5f) }
ListItem(
modifier = Modifier
@@ -36,10 +42,30 @@ fun SwitchItem(
onValueChange = onCheckedChange
),
headlineContent = {
- Text(title)
+ TextRow(
+ leadingContent = if (beta) {
+ {
+ LabelItem(
+ modifier = Modifier.then(stateAlpha),
+ text = "Beta"
+ )
+ }
+ } else null
+ ) {
+ Text(
+ modifier = Modifier.then(stateAlpha),
+ text = title,
+ )
+ }
},
leadingContent = icon?.let {
- { Icon(icon, title) }
+ {
+ Icon(
+ modifier = Modifier.then(stateAlpha),
+ imageVector = icon,
+ contentDescription = title
+ )
+ }
},
trailingContent = {
Switch(
@@ -51,7 +77,10 @@ fun SwitchItem(
},
supportingContent = {
if (summary != null) {
- Text(summary)
+ Text(
+ modifier = Modifier.then(stateAlpha),
+ text = summary
+ )
}
}
)
diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Settings.kt b/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Settings.kt
index 5fafcd9c..a188a9ae 100644
--- a/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Settings.kt
+++ b/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Settings.kt
@@ -329,6 +329,7 @@ fun SettingScreen(navigator: DestinationsNavigator) {
}
if (ksuVersion != null) {
SwitchItem(
+ beta = true,
enabled = Platform.isAlive,
icon = Icons.Filled.WebAsset,
title = stringResource(id = R.string.use_webuix),
@@ -339,6 +340,24 @@ fun SettingScreen(navigator: DestinationsNavigator) {
useWebUIX = it
}
}
+ var useWebUIXEruda by rememberSaveable {
+ mutableStateOf(
+ prefs.getBoolean("use_webuix_eruda", false)
+ )
+ }
+ if (ksuVersion != null) {
+ SwitchItem(
+ beta = true,
+ enabled = Platform.isAlive && useWebUIX && enableWebDebugging,
+ icon = Icons.Filled.FormatListNumbered,
+ title = stringResource(id = R.string.use_webuix_eruda),
+ summary = stringResource(id = R.string.use_webuix_eruda_summary),
+ checked = useWebUIXEruda
+ ) {
+ prefs.edit().putBoolean("use_webuix_eruda", it).apply()
+ useWebUIXEruda = it
+ }
+ }
if (isOverlayAvailable && useOverlayFs) {
val shrink = stringResource(id = R.string.shrink_sparse_image)
diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/WebUIActivity.kt b/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/WebUIActivity.kt
index f582c2c5..8e755f33 100644
--- a/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/WebUIActivity.kt
+++ b/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/WebUIActivity.kt
@@ -15,8 +15,8 @@ import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updateLayoutParams
import androidx.webkit.WebViewAssetLoader
+import com.dergoogler.mmrl.platform.model.ModId
import com.dergoogler.mmrl.webui.interfaces.WXOptions
-import com.dergoogler.mmrl.webui.model.ModId
import com.topjohnwu.superuser.Shell
import com.rifsxd.ksunext.ui.util.createRootShell
import java.io.File
diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/WebUIXActivity.kt b/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/WebUIXActivity.kt
index 1fba0365..e2b4b78b 100644
--- a/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/WebUIXActivity.kt
+++ b/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/WebUIXActivity.kt
@@ -15,9 +15,8 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.lifecycle.lifecycleScope
import com.dergoogler.mmrl.platform.Platform
+import com.dergoogler.mmrl.platform.model.ModId
import com.dergoogler.mmrl.ui.component.Loading
-import com.dergoogler.mmrl.webui.interfaces.WXOptions
-import com.dergoogler.mmrl.webui.model.ModId
import com.dergoogler.mmrl.webui.screen.WebUIScreen
import com.dergoogler.mmrl.webui.util.rememberWebUIOptions
import com.rifsxd.ksunext.BuildConfig
@@ -28,6 +27,24 @@ import kotlinx.coroutines.launch
class WebUIXActivity : ComponentActivity() {
private lateinit var webView: WebView
+ private val userAgent
+ get(): String {
+ val ksuVersion = BuildConfig.VERSION_CODE
+
+ val platform = Platform.get("Unknown") {
+ platform.name
+ }
+
+ val platformVersion = Platform.get(-1) {
+ moduleManager.versionCode
+ }
+
+ val osVersion = Build.VERSION.RELEASE
+ val deviceModel = Build.MODEL
+
+ return "KernelSU Next/$ksuVersion (Linux; Android $osVersion; $deviceModel; $platform/$platformVersion)"
+ }
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
@@ -70,6 +87,7 @@ class WebUIXActivity : ComponentActivity() {
}
val webDebugging = prefs.getBoolean("enable_web_debugging", false)
+ val erudaInject = prefs.getBoolean("use_webuix_eruda", false)
val dark = isSystemInDarkTheme()
val options = rememberWebUIOptions(
@@ -77,7 +95,9 @@ class WebUIXActivity : ComponentActivity() {
debug = webDebugging,
appVersionCode = BuildConfig.VERSION_CODE,
isDarkMode = dark,
- cls = WebUIXActivity::class.java
+ enableEruda = erudaInject,
+ cls = WebUIXActivity::class.java,
+ userAgentString = userAgent
)
WebUIScreen(
diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml
index 824b0287..b851b9b9 100644
--- a/manager/app/src/main/res/values/strings.xml
+++ b/manager/app/src/main/res/values/strings.xml
@@ -196,4 +196,6 @@
Language
Use WebUI X
Use WebUI X instead of WebUI, which supports more APIs.
+ Inject Eruda into WebUI X
+ Inject a debug console into WebUI X to make debugging easier. Requires web debugging to be on.
diff --git a/manager/gradle/libs.versions.toml b/manager/gradle/libs.versions.toml
index f7fdbe4e..8e6c0d1b 100644
--- a/manager/gradle/libs.versions.toml
+++ b/manager/gradle/libs.versions.toml
@@ -17,7 +17,7 @@ parcelablelist = "2.0.1"
libsu = "6.0.0"
apksign = "1.4"
cmaker = "1.2"
-mmrl = "b3c7ca55e0"
+mmrl = "v33560"
[plugins]
agp-app = { id = "com.android.application", version.ref = "agp" }