Skip to content

Commit d3f81b6

Browse files
committed
Add permission and console message handling to WXChromeClient
Introduces handling for onPermissionRequest and onConsoleMessage in WXChromeClient, allowing permission requests to be confirmed via dialog and console messages to be logged with appropriate log levels. Refactors the options invocation pattern for dialog handling and removes unused contract-related code.
1 parent d855349 commit d3f81b6

File tree

2 files changed

+55
-20
lines changed

2 files changed

+55
-20
lines changed
Lines changed: 53 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.dergoogler.mmrl.webui.client
22

3+
import android.util.Log
4+
import android.webkit.ConsoleMessage
35
import android.webkit.JsPromptResult
46
import android.webkit.JsResult
7+
import android.webkit.PermissionRequest
58
import android.webkit.WebChromeClient
69
import android.webkit.WebView
710
import com.dergoogler.mmrl.ui.component.dialog.ConfirmData
@@ -10,9 +13,6 @@ import com.dergoogler.mmrl.ui.component.dialog.confirm
1013
import com.dergoogler.mmrl.ui.component.dialog.prompt
1114
import com.dergoogler.mmrl.webui.R
1215
import com.dergoogler.mmrl.webui.util.WebUIOptions
13-
import kotlin.contracts.ExperimentalContracts
14-
import kotlin.contracts.InvocationKind
15-
import kotlin.contracts.contract
1616

1717
open class WXChromeClient(
1818
private val options: WebUIOptions,
@@ -21,26 +21,12 @@ open class WXChromeClient(
2121
const val TAG = "WXChromeClient"
2222
}
2323

24-
@OptIn(ExperimentalContracts::class)
25-
private inline fun options(
26-
result: JsResult,
27-
options: WebUIOptions,
28-
block: WebUIOptions.() -> Unit,
29-
): Boolean {
30-
contract {
31-
callsInPlace(block, InvocationKind.AT_MOST_ONCE)
32-
}
33-
34-
block(options)
35-
return true
36-
}
37-
3824
override fun onJsAlert(
3925
view: WebView?,
4026
url: String,
4127
message: String,
4228
result: JsResult,
43-
): Boolean = options(result, options) {
29+
): Boolean = options {
4430
context.confirm(
4531
confirmData = ConfirmData(
4632
title = context.getString(R.string.says, modId.id),
@@ -50,14 +36,16 @@ open class WXChromeClient(
5036
),
5137
colorScheme = colorScheme
5238
)
39+
40+
true
5341
}
5442

5543
override fun onJsConfirm(
5644
view: WebView,
5745
url: String,
5846
message: String,
5947
result: JsResult,
60-
): Boolean = options(result, options) {
48+
): Boolean = options {
6149
context.confirm(
6250
confirmData = ConfirmData(
6351
title = context.getString(R.string.says, modId.id),
@@ -67,6 +55,8 @@ open class WXChromeClient(
6755
),
6856
colorScheme = colorScheme
6957
)
58+
59+
true
7060
}
7161

7262
override fun onJsPrompt(
@@ -75,7 +65,7 @@ open class WXChromeClient(
7565
message: String?,
7666
defaultValue: String?,
7767
result: JsPromptResult,
78-
): Boolean = options(result, options) {
68+
): Boolean = options {
7969
context.prompt(
8070
promptData = PromptData(
8171
title = message ?: context.getString(R.string.says, modId.id),
@@ -85,6 +75,49 @@ open class WXChromeClient(
8575
),
8676
colorScheme = colorScheme
8777
)
78+
79+
true
80+
}
81+
82+
override fun onPermissionRequest(request: PermissionRequest) = options {
83+
val perms = config.permissions
84+
val filteredPermissions = perms.mapNotNull {
85+
if (Regex("^android\\.webkit\\.resource\\.([A-Z_]+)$").matches(it)) {
86+
return@mapNotNull it
87+
} else null
88+
}.toTypedArray()
89+
90+
if (filteredPermissions.isEmpty()) return@options
91+
92+
val p = filteredPermissions.joinToString("") { "\n- $it" }
93+
94+
context.confirm(
95+
confirmData = ConfirmData(
96+
title = context.getString(R.string.says, modId.id),
97+
description = "Requesting permissions: $p",
98+
onConfirm = { request.grant(filteredPermissions) },
99+
onClose = { request.deny() }
100+
),
101+
colorScheme = colorScheme
102+
)
103+
}
104+
105+
override fun onConsoleMessage(consoleMessage: ConsoleMessage): Boolean {
106+
val message = """
107+
${consoleMessage.message()}
108+
Source: ${consoleMessage.sourceId()}
109+
Line: ${consoleMessage.lineNumber()}
110+
Level: ${consoleMessage.messageLevel()}
111+
""".trimIndent()
112+
113+
when (consoleMessage.messageLevel()) {
114+
ConsoleMessage.MessageLevel.TIP -> Log.i(TAG, message)
115+
ConsoleMessage.MessageLevel.LOG -> Log.d(TAG, message)
116+
ConsoleMessage.MessageLevel.WARNING -> Log.w(TAG, message)
117+
ConsoleMessage.MessageLevel.ERROR -> Log.e(TAG, message)
118+
else -> Log.v(TAG, message)
119+
}
120+
return true
88121
}
89122
}
90123

webui/src/main/kotlin/com/dergoogler/mmrl/webui/util/rememberWebUIOptions.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,8 @@ data class WebUIOptions(
306306
result = 31 * result + colorScheme.hashCode()
307307
return result
308308
}
309+
310+
operator fun <R> invoke(block: WebUIOptions.() -> R): R = block()
309311
}
310312

311313
fun WebUIOptions.drawCompose(

0 commit comments

Comments
 (0)