Skip to content

Commit f4e29c5

Browse files
committed
Refactor WebMessage listener setup for FS streams
Replaced direct usage of WebViewCompat.addWebMessageListener with a new createWebMessageListener extension for cleaner and more reusable listener setup in FsStreams. Introduced WebMessageListenerScope data class to encapsulate listener parameters and improve code readability.
1 parent 375bceb commit f4e29c5

File tree

2 files changed

+46
-19
lines changed

2 files changed

+46
-19
lines changed

plugin/src/main/kotlin/dev/mmrl/internal/FsStreams.kt

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package dev.mmrl.internal
22

3+
import android.R.id.message
34
import androidx.webkit.WebMessageCompat
45
import androidx.webkit.WebViewCompat
56
import androidx.webkit.WebViewFeature
67
import com.dergoogler.mmrl.platform.file.SuFile
78
import com.dergoogler.mmrl.webui.interfaces.WXInterface
9+
import dev.mmrl.util.createWebMessageListener
810

911

1012
private val WXInterface.isFsInputStreamAllowed: Boolean get() = "wxu.permission.FS_INPUT_STREAM" in config.permissions
@@ -15,23 +17,19 @@ fun WXInterface.initFsInputStream() {
1517
return
1618
}
1719

18-
WebViewCompat.addWebMessageListener(
19-
webView,
20-
"FsInputStream",
21-
setOf("*")
22-
) { view, message, sourceOrigin, isMainFrame, reply ->
20+
createWebMessageListener("FsInputStream") fis@{
2321
val data: String? = message.data
2422

2523
if (data == null) {
2624
reply.postMessage("Failed! Data was null.")
27-
return@addWebMessageListener
25+
return@fis
2826
}
2927

3028
val file = SuFile(message.data)
3129

3230
if (!file.exists()) {
3331
reply.postMessage("Failed! File does not exist.")
34-
return@addWebMessageListener
32+
return@fis
3533
}
3634

3735
when (message.type) {
@@ -60,19 +58,14 @@ fun WXInterface.initFsOutputStream() {
6058

6159
var currentPath: String? = null
6260

63-
WebViewCompat.addWebMessageListener(
64-
webView,
65-
"FsOutputStream",
66-
setOf("*")
67-
) { view, message, sourceOrigin, isMainFrame, reply ->
68-
61+
createWebMessageListener("FsOutputStream") ops@{
6962
when (message.type) {
7063
WebMessageCompat.TYPE_STRING -> {
7164
// Initialize the file path
7265
currentPath = message.data
7366
if (currentPath == null) {
7467
reply.postMessage("Failed! Path was null.")
75-
return@addWebMessageListener
68+
return@ops
7669
}
7770

7871
val file = SuFile(currentPath)
@@ -81,7 +74,7 @@ fun WXInterface.initFsOutputStream() {
8174
file.createNewFile()
8275
} catch (e: Exception) {
8376
reply.postMessage("Failed to create file: ${e.message}")
84-
return@addWebMessageListener
77+
return@ops
8578
}
8679
}
8780

@@ -91,7 +84,7 @@ fun WXInterface.initFsOutputStream() {
9184
WebMessageCompat.TYPE_ARRAY_BUFFER -> {
9285
if (currentPath == null) {
9386
reply.postMessage("Failed! Path not set before sending chunk.")
94-
return@addWebMessageListener
87+
return@ops
9588
}
9689

9790
try {

plugin/src/main/kotlin/dev/mmrl/util/Extensions.kt

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
package dev.mmrl.util
22

3-
import android.R.id.input
3+
import android.R.attr.data
4+
import android.annotation.SuppressLint
45
import android.graphics.Bitmap
56
import android.graphics.Canvas
67
import android.graphics.drawable.BitmapDrawable
78
import android.graphics.drawable.Drawable
9+
import android.net.Uri
810
import android.util.Base64
11+
import android.webkit.WebMessage
12+
import androidx.annotation.RequiresFeature
13+
import androidx.annotation.UiThread
914
import androidx.core.graphics.createBitmap
15+
import androidx.webkit.JavaScriptReplyProxy
16+
import androidx.webkit.WebMessageCompat
17+
import androidx.webkit.WebViewCompat
18+
import androidx.webkit.WebViewFeature
19+
import com.dergoogler.mmrl.webui.interfaces.WXInterface
1020
import com.dergoogler.mmrl.webui.moshi
1121
import java.io.ByteArrayOutputStream
12-
import java.io.IOException
13-
import java.io.InputStream
1422

1523

1624
fun <T> List<T>?.toJsonString(): String {
@@ -51,4 +59,30 @@ inline fun <reified T> Map<String, Any?>?.getProp(key: String, def: T): T {
5159
} else {
5260
def
5361
}
62+
}
63+
64+
data class WebMessageListenerScope(
65+
private val wx: WXInterface,
66+
val message: WebMessageCompat,
67+
val reply: JavaScriptReplyProxy,
68+
val sourceOrigin: Uri,
69+
val isMainFrame: Boolean,
70+
)
71+
72+
@UiThread
73+
@SuppressLint("RequiresFeature")
74+
@RequiresFeature(
75+
name = WebViewFeature.WEB_MESSAGE_LISTENER,
76+
enforcement = "androidx.webkit.WebViewFeature#isFeatureSupported"
77+
)
78+
fun WXInterface.createWebMessageListener(
79+
jsObjectName: String,
80+
allowedOriginRules: Set<String> = setOf(options.domain.toString()),
81+
block: WebMessageListenerScope.() -> Unit,
82+
) = WebViewCompat.addWebMessageListener(
83+
webView,
84+
jsObjectName,
85+
allowedOriginRules
86+
) { _, message, uri, isMainFrame, reply ->
87+
block(WebMessageListenerScope(this, message, reply, uri, isMainFrame))
5488
}

0 commit comments

Comments
 (0)