Skip to content

Commit 64565fd

Browse files
committed
Route popup window navigation to main WebView internally
1 parent d67d65b commit 64565fd

4 files changed

Lines changed: 58 additions & 7 deletions

File tree

app/src/main/java/com/example/deeplviewer/activity/MainActivity.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import com.example.deeplviewer.R
1616
import com.example.deeplviewer.config.WebViewConfig
1717
import com.example.deeplviewer.helper.CookieManagerHelper
1818
import com.example.deeplviewer.helper.UrlHelper
19+
import com.example.deeplviewer.webview.MyWebChromeClient
20+
import com.example.deeplviewer.webview.MyWebChromeClient.Companion.DEEPL_INTERNAL_REGEX
1921
import com.example.deeplviewer.webview.MyWebViewClient
2022
import com.example.deeplviewer.webview.WebAppInterface
2123

@@ -118,6 +120,7 @@ class MainActivity : AppCompatActivity() {
118120
private fun setupWebViewClient() {
119121
webViewClient = MyWebViewClient(this)
120122
webView.webViewClient = webViewClient
123+
webView.webChromeClient = MyWebChromeClient(webView)
121124
}
122125

123126
/**
@@ -173,9 +176,7 @@ class MainActivity : AppCompatActivity() {
173176
val webView: WebView = findViewById(R.id.webview)
174177
val url = webView.url ?: ""
175178

176-
// Extract the page type 'translator' or 'write' from the URL
177-
val pageTypeRegex = Regex("^https://www\\.deepl\\.com/.*/(translator|write).*$")
178-
val pageTypeMatch = pageTypeRegex.find(url)
179+
val pageTypeMatch = DEEPL_INTERNAL_REGEX.find(url)
179180
val pageType = pageTypeMatch?.groupValues?.get(1)
180181

181182
pageType?.let {

app/src/main/java/com/example/deeplviewer/config/WebViewConfig.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ object WebViewConfig {
1010
webView.settings.apply {
1111
javaScriptEnabled = true
1212
domStorageEnabled = true
13+
setSupportMultipleWindows(true)
1314

1415
// cache settings
1516
cacheMode = WebSettings.LOAD_DEFAULT
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.example.deeplviewer.webview
2+
3+
import android.graphics.Bitmap
4+
import android.os.Message
5+
import android.webkit.WebChromeClient
6+
import android.webkit.WebResourceRequest
7+
import android.webkit.WebView
8+
import android.webkit.WebViewClient
9+
10+
class MyWebChromeClient(
11+
private val mainWebView: WebView,
12+
) : WebChromeClient() {
13+
override fun onCreateWindow(
14+
view: WebView,
15+
isDialog: Boolean,
16+
isUserGesture: Boolean,
17+
resultMsg: Message
18+
): Boolean {
19+
val tempWebView = WebView(view.context)
20+
tempWebView.webViewClient = object : WebViewClient() {
21+
private var handled = false
22+
23+
private fun handleUrl(url: String) {
24+
if (handled || url.isEmpty() || url == "about:blank") return
25+
handled = true
26+
mainWebView.loadUrl(url)
27+
mainWebView.post { tempWebView.destroy() }
28+
}
29+
30+
override fun shouldOverrideUrlLoading(
31+
view: WebView,
32+
request: WebResourceRequest
33+
): Boolean {
34+
handleUrl(request.url.toString())
35+
return true
36+
}
37+
38+
override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) {
39+
handleUrl(url)
40+
}
41+
}
42+
val transport = resultMsg.obj as WebView.WebViewTransport
43+
transport.webView = tempWebView
44+
resultMsg.sendToTarget()
45+
return true
46+
}
47+
48+
companion object {
49+
val DEEPL_INTERNAL_REGEX = Regex("^https://www\\.deepl\\.com/.*/(translator|write).*$")
50+
}
51+
}

app/src/main/java/com/example/deeplviewer/webview/MyWebViewClient.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import androidx.webkit.WebViewFeature
2020
import com.example.deeplviewer.R
2121
import com.example.deeplviewer.activity.MainActivity
2222
import androidx.core.content.edit
23+
import com.example.deeplviewer.webview.MyWebChromeClient.Companion.DEEPL_INTERNAL_REGEX
2324

2425
class MyWebViewClient(
2526
private val activity: Activity,
@@ -31,10 +32,7 @@ class MyWebViewClient(
3132

3233
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
3334
val url = request?.url.toString()
34-
val regex = Regex("^https://www\\.deepl\\.com/.*/(translator|write).*$")
35-
val isDeepLTranslatorUrl = regex.matches(url)
36-
37-
return !isDeepLTranslatorUrl
35+
return !DEEPL_INTERNAL_REGEX.matches(url)
3836
}
3937

4038
override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) {

0 commit comments

Comments
 (0)