Support external URLs

(cherry picked from commit 4484dde9c6)
This commit is contained in:
Niels van Velzen
2026-09-13 16:36:54 +02:00
parent 3c379c95e7
commit 024c03502e
2 changed files with 35 additions and 0 deletions
@@ -72,6 +72,7 @@ private fun WebView.getDefaultUserAgentString(): String {
fun WebSettings.applyDefault() {
javaScriptEnabled = true
domStorageEnabled = true
setSupportMultipleWindows(true)
}
/**
@@ -1,12 +1,17 @@
package org.jellyfin.mobile.webapp
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Message
import android.util.Log
import android.webkit.ConsoleMessage
import android.webkit.ValueCallback
import android.webkit.WebChromeClient
import android.webkit.WebResourceRequest
import android.webkit.WebView
import androidx.core.net.toUri
import androidx.webkit.WebViewClientCompat
import timber.log.Timber
class JellyfinWebChromeClient(
@@ -32,6 +37,35 @@ class JellyfinWebChromeClient(
return true
}
override fun onCreateWindow(view: WebView, isDialog: Boolean, isUserGesture: Boolean, resultMsg: Message): Boolean {
val transport = resultMsg.obj as? WebView.WebViewTransport ?: return false
val windowWebView = WebView(view.context)
windowWebView.webViewClient = object : WebViewClientCompat() {
override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
return openExternalUrl(view.context, request.url.toString())
}
@Deprecated("Deprecated in Android")
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
return openExternalUrl(view.context, url)
}
}
transport.webView = windowWebView
resultMsg.sendToTarget()
return true
}
private fun openExternalUrl(context: Context, url: String): Boolean {
// Some web views can try to open empty popups, we cannot infer an URL from those easily so ignore them
if (url == "about:blank") return false
val intent = Intent(Intent.ACTION_VIEW, url.toUri())
context.startActivity(intent)
return true
}
override fun onShowFileChooser(
webView: WebView,
filePathCallback: ValueCallback<Array<Uri>>,