js: add moduleInfo method (#2057)

Add a `ksu.moduleInfo()` in JS.
resolves https://github.com/tiann/KernelSU/issues/1571

test module's index.html

![image](https://github.com/user-attachments/assets/39920606-452c-4b19-abca-967c25146d6a)

The test module:

[moduleInfo_test.zip](https://github.com/user-attachments/files/17001977/moduleInfo_test.zip)

test module's result:

![image](https://github.com/user-attachments/assets/9dbbd2e8-f7ea-418f-b545-66d33ce1b3ae)
This commit is contained in:
sus
2024-09-14 21:52:11 +08:00
committed by GitHub
parent 50f48a33f1
commit ac20b76eaf
6 changed files with 45 additions and 5 deletions

View File

@@ -109,3 +109,12 @@ Show a toast message.
import { toast } from 'kernelsu'; import { toast } from 'kernelsu';
toast('Hello, world!'); toast('Hello, world!');
``` ```
### moduleInfo
Get Module info.
```javascript
import { moduleInfo } from 'kernelsu';
// print moduleId in console
console.log(moduleInfo());
```

5
js/index.d.ts vendored
View File

@@ -37,9 +37,12 @@ declare function fullScreen(isFullScreen: boolean);
declare function toast(message: string); declare function toast(message: string);
declare function moduleInfo(): string;
export { export {
exec, exec,
spawn, spawn,
fullScreen, fullScreen,
toast toast,
moduleInfo
} }

View File

@@ -113,3 +113,7 @@ export function fullScreen(isFullScreen) {
export function toast(message) { export function toast(message) {
ksu.toast(message); ksu.toast(message);
} }
export function moduleInfo() {
return ksu.moduleInfo();
}

View File

@@ -1,6 +1,6 @@
{ {
"name": "kernelsu", "name": "kernelsu",
"version": "1.0.6", "version": "1.0.7",
"description": "Library for KernelSU's module WebUI", "description": "Library for KernelSU's module WebUI",
"main": "index.js", "main": "index.js",
"types": "index.d.ts", "types": "index.d.ts",

View File

@@ -29,7 +29,8 @@ class WebUIActivity : ComponentActivity() {
val prefs = getSharedPreferences("settings", Context.MODE_PRIVATE) val prefs = getSharedPreferences("settings", Context.MODE_PRIVATE)
WebView.setWebContentsDebuggingEnabled(prefs.getBoolean("enable_web_debugging", false)) WebView.setWebContentsDebuggingEnabled(prefs.getBoolean("enable_web_debugging", false))
val webRoot = File("/data/adb/modules/${moduleId}/webroot") val moduleDir = "/data/adb/modules/${moduleId}"
val webRoot = File("${moduleDir}/webroot")
val rootShell = createRootShell(true).also { this.rootShell = it } val rootShell = createRootShell(true).also { this.rootShell = it }
val webViewAssetLoader = WebViewAssetLoader.Builder() val webViewAssetLoader = WebViewAssetLoader.Builder()
.setDomain("mui.kernelsu.org") .setDomain("mui.kernelsu.org")
@@ -52,7 +53,7 @@ class WebUIActivity : ComponentActivity() {
settings.javaScriptEnabled = true settings.javaScriptEnabled = true
settings.domStorageEnabled = true settings.domStorageEnabled = true
settings.allowFileAccess = false settings.allowFileAccess = false
webviewInterface = WebViewInterface(this@WebUIActivity, this) webviewInterface = WebViewInterface(this@WebUIActivity, this, moduleDir)
addJavascriptInterface(webviewInterface, "ksu") addJavascriptInterface(webviewInterface, "ksu")
setWebViewClient(webViewClient) setWebViewClient(webViewClient)
loadUrl("https://mui.kernelsu.org/index.html") loadUrl("https://mui.kernelsu.org/index.html")

View File

@@ -14,13 +14,15 @@ import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat import androidx.core.view.WindowInsetsControllerCompat
import com.topjohnwu.superuser.CallbackList import com.topjohnwu.superuser.CallbackList
import com.topjohnwu.superuser.ShellUtils import com.topjohnwu.superuser.ShellUtils
import me.weishu.kernelsu.ui.util.listModules
import me.weishu.kernelsu.ui.util.createRootShell import me.weishu.kernelsu.ui.util.createRootShell
import me.weishu.kernelsu.ui.util.withNewRootShell import me.weishu.kernelsu.ui.util.withNewRootShell
import org.json.JSONArray import org.json.JSONArray
import org.json.JSONObject import org.json.JSONObject
import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletableFuture
import java.io.File
class WebViewInterface(val context: Context, private val webView: WebView) { class WebViewInterface(val context: Context, private val webView: WebView, private val modDir: String) {
@JavascriptInterface @JavascriptInterface
fun exec(cmd: String): String { fun exec(cmd: String): String {
@@ -170,6 +172,27 @@ class WebViewInterface(val context: Context, private val webView: WebView) {
} }
} }
@JavascriptInterface
fun moduleInfo(): String {
val moduleInfos = JSONArray(listModules())
var currentModuleInfo = JSONObject()
currentModuleInfo.put("moduleDir", modDir)
val moduleId = File(modDir).getName()
for (i in 0 until moduleInfos.length()) {
val currentInfo = moduleInfos.getJSONObject(i)
if (currentInfo.getString("id") != moduleId) {
continue
}
var keys = currentInfo.keys()
for(key in keys) {
currentModuleInfo.put(key, currentInfo.get(key));
}
break;
}
return currentModuleInfo.toString();
}
} }
fun hideSystemUI(window: Window) { fun hideSystemUI(window: Window) {