manager: Usse WebViewAssetLoader instead of file uri. refer: https://developer.android.com/reference/androidx/webkit/WebViewAssetLoader
androidCompileSdkVersion changed to meet webview library requirements
This commit is contained in:
@@ -114,4 +114,5 @@ dependencies {
|
|||||||
implementation(libs.sheet.compose.dialogs.input)
|
implementation(libs.sheet.compose.dialogs.input)
|
||||||
|
|
||||||
implementation(libs.markdown)
|
implementation(libs.markdown)
|
||||||
|
implementation(libs.androidx.webkit)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ import android.os.Looper
|
|||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
import android.view.Window
|
import android.view.Window
|
||||||
import android.webkit.JavascriptInterface
|
import android.webkit.JavascriptInterface
|
||||||
|
import android.webkit.WebResourceRequest
|
||||||
|
import android.webkit.WebResourceResponse
|
||||||
import android.webkit.WebView
|
import android.webkit.WebView
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
@@ -21,6 +23,8 @@ import androidx.compose.ui.platform.LocalContext
|
|||||||
import androidx.core.view.WindowCompat
|
import androidx.core.view.WindowCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
import androidx.core.view.WindowInsetsControllerCompat
|
import androidx.core.view.WindowInsetsControllerCompat
|
||||||
|
import androidx.webkit.WebViewAssetLoader
|
||||||
|
import com.google.accompanist.web.AccompanistWebViewClient
|
||||||
import com.google.accompanist.web.WebView
|
import com.google.accompanist.web.WebView
|
||||||
import com.google.accompanist.web.rememberWebViewState
|
import com.google.accompanist.web.rememberWebViewState
|
||||||
import com.ramcosta.composedestinations.annotation.Destination
|
import com.ramcosta.composedestinations.annotation.Destination
|
||||||
@@ -31,6 +35,7 @@ import me.weishu.kernelsu.ui.util.createRootShell
|
|||||||
import me.weishu.kernelsu.ui.util.serveModule
|
import me.weishu.kernelsu.ui.util.serveModule
|
||||||
import org.json.JSONArray
|
import org.json.JSONArray
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
|
import java.io.File
|
||||||
import java.util.concurrent.CompletableFuture
|
import java.util.concurrent.CompletableFuture
|
||||||
|
|
||||||
@SuppressLint("SetJavaScriptEnabled")
|
@SuppressLint("SetJavaScriptEnabled")
|
||||||
@@ -53,23 +58,37 @@ fun WebScreen(navigator: DestinationsNavigator, moduleId: String, moduleName: St
|
|||||||
}
|
}
|
||||||
|
|
||||||
Scaffold { innerPadding ->
|
Scaffold { innerPadding ->
|
||||||
|
val webRoot = File(context.dataDir, "webroot")
|
||||||
|
val webViewAssetLoader = WebViewAssetLoader.Builder()
|
||||||
|
.addPathHandler("/", WebViewAssetLoader.InternalStoragePathHandler(context, webRoot))
|
||||||
|
.build()
|
||||||
|
|
||||||
|
val webViewClient = object : AccompanistWebViewClient() {
|
||||||
|
override fun shouldInterceptRequest(
|
||||||
|
view: WebView,
|
||||||
|
request: WebResourceRequest
|
||||||
|
): WebResourceResponse? {
|
||||||
|
return webViewAssetLoader.shouldInterceptRequest(request.url)
|
||||||
|
}
|
||||||
|
}
|
||||||
WebView(
|
WebView(
|
||||||
state = rememberWebViewState(url = "file:///data/data/me.weishu.kernelsu/webroot/index.html"),
|
state = rememberWebViewState(url = "https://appassets.androidplatform.net/index.html"),
|
||||||
Modifier
|
Modifier
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
.padding(innerPadding),
|
.padding(innerPadding),
|
||||||
|
client = webViewClient,
|
||||||
factory = { context ->
|
factory = { context ->
|
||||||
WebView(context).apply {
|
WebView(context).apply {
|
||||||
settings.javaScriptEnabled = true
|
settings.javaScriptEnabled = true
|
||||||
settings.domStorageEnabled = true
|
settings.domStorageEnabled = true
|
||||||
settings.allowFileAccess = true
|
settings.allowFileAccess = false
|
||||||
addJavascriptInterface(WebViewInterface(context, this), "ksu")
|
addJavascriptInterface(WebViewInterface(context, this), "ksu")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class WebViewInterface(val context: Context, val webView: WebView) {
|
class WebViewInterface(val context: Context, private val webView: WebView) {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
var isHideSystemUI: Boolean = false
|
var isHideSystemUI: Boolean = false
|
||||||
@@ -109,10 +128,6 @@ class WebViewInterface(val context: Context, val webView: WebView) {
|
|||||||
options: String?,
|
options: String?,
|
||||||
callbackFunc: String
|
callbackFunc: String
|
||||||
) {
|
) {
|
||||||
val opts = if (options == null) JSONObject() else {
|
|
||||||
JSONObject(options)
|
|
||||||
}
|
|
||||||
|
|
||||||
val finalCommand = StringBuilder()
|
val finalCommand = StringBuilder()
|
||||||
processOptions(finalCommand, options)
|
processOptions(finalCommand, options)
|
||||||
finalCommand.append(cmd)
|
finalCommand.append(cmd)
|
||||||
|
|||||||
@@ -34,8 +34,8 @@ cmaker {
|
|||||||
|
|
||||||
val androidMinSdkVersion = 26
|
val androidMinSdkVersion = 26
|
||||||
val androidTargetSdkVersion = 33
|
val androidTargetSdkVersion = 33
|
||||||
val androidCompileSdkVersion = 33
|
val androidCompileSdkVersion = 34
|
||||||
val androidBuildToolsVersion = "33.0.2"
|
val androidBuildToolsVersion = "34.0.0"
|
||||||
val androidCompileNdkVersion = "25.2.9519653"
|
val androidCompileNdkVersion = "25.2.9519653"
|
||||||
val androidSourceCompatibility = JavaVersion.VERSION_17
|
val androidSourceCompatibility = JavaVersion.VERSION_17
|
||||||
val androidTargetCompatibility = JavaVersion.VERSION_17
|
val androidTargetCompatibility = JavaVersion.VERSION_17
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ compose-destination = "1.9.42-beta"
|
|||||||
libsu = "5.2.1"
|
libsu = "5.2.1"
|
||||||
sheets-compose-dialogs = "1.2.0"
|
sheets-compose-dialogs = "1.2.0"
|
||||||
markdown = "4.6.2"
|
markdown = "4.6.2"
|
||||||
|
webkit = "1.10.0"
|
||||||
|
|
||||||
[plugins]
|
[plugins]
|
||||||
agp-app = { id = "com.android.application", version.ref = "agp" }
|
agp-app = { id = "com.android.application", version.ref = "agp" }
|
||||||
@@ -36,6 +37,7 @@ androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecyc
|
|||||||
androidx-lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycle" }
|
androidx-lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycle" }
|
||||||
androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycle" }
|
androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycle" }
|
||||||
|
|
||||||
|
androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" }
|
||||||
com-google-accompanist-drawablepainter = { group = "com.google.accompanist", name = "accompanist-drawablepainter", version.ref = "accompanist" }
|
com-google-accompanist-drawablepainter = { group = "com.google.accompanist", name = "accompanist-drawablepainter", version.ref = "accompanist" }
|
||||||
com-google-accompanist-navigation-animation = { group = "com.google.accompanist", name = "accompanist-navigation-animation", version.ref = "accompanist" }
|
com-google-accompanist-navigation-animation = { group = "com.google.accompanist", name = "accompanist-navigation-animation", version.ref = "accompanist" }
|
||||||
com-google-accompanist-systemuicontroller = { group = "com.google.accompanist", name = "accompanist-systemuicontroller", version.ref = "accompanist" }
|
com-google-accompanist-systemuicontroller = { group = "com.google.accompanist", name = "accompanist-systemuicontroller", version.ref = "accompanist" }
|
||||||
|
|||||||
Reference in New Issue
Block a user