11package com.multiplatform.webview.web
22
33import android.content.Context
4+ import android.content.pm.PackageManager
45import android.content.res.Configuration
56import android.graphics.Bitmap
67import android.os.Build
78import android.view.ViewGroup
9+ import android.webkit.PermissionRequest
810import android.webkit.WebChromeClient
911import android.webkit.WebResourceError
1012import android.webkit.WebResourceRequest
@@ -19,6 +21,7 @@ import androidx.compose.runtime.rememberCoroutineScope
1921import androidx.compose.ui.Modifier
2022import androidx.compose.ui.graphics.toArgb
2123import androidx.compose.ui.viewinterop.AndroidView
24+ import androidx.core.content.ContextCompat
2225import androidx.webkit.WebSettingsCompat
2326import androidx.webkit.WebViewFeature
2427import com.multiplatform.webview.jsbridge.WebViewJsBridge
@@ -171,6 +174,7 @@ fun AccompanistWebView(
171174 this .restoreState(it)
172175 }
173176
177+ chromeClient.context = context
174178 webChromeClient = chromeClient
175179 webViewClient = client
176180
@@ -389,6 +393,8 @@ open class AccompanistWebViewClient : WebViewClient() {
389393open class AccompanistWebChromeClient : WebChromeClient () {
390394 open lateinit var state: WebViewState
391395 internal set
396+ lateinit var context: Context
397+ internal set
392398 private var lastLoadedUrl = " "
393399
394400 override fun onReceivedTitle (
@@ -425,4 +431,59 @@ open class AccompanistWebChromeClient : WebChromeClient() {
425431 }
426432 lastLoadedUrl = view.url ? : " "
427433 }
434+
435+ override fun onPermissionRequest (request : PermissionRequest ) {
436+ val grantedPermissions = mutableListOf<String >()
437+ KLogger .d { " onPermissionRequest received request for resources [${request.resources} ]" }
438+
439+ request.resources.forEach { resource ->
440+ var androidPermission: String? = null
441+
442+ when (resource) {
443+ PermissionRequest .RESOURCE_AUDIO_CAPTURE -> {
444+ androidPermission = android.Manifest .permission.RECORD_AUDIO
445+ }
446+
447+ PermissionRequest .RESOURCE_MIDI_SYSEX -> {
448+ // MIDI sysex is only available on Android M and above
449+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ) {
450+ if (state.webSettings.androidWebSettings.allowMidiSysexMessages) {
451+ grantedPermissions.add(PermissionRequest .RESOURCE_MIDI_SYSEX )
452+ }
453+ }
454+ }
455+
456+ PermissionRequest .RESOURCE_PROTECTED_MEDIA_ID -> {
457+ if (state.webSettings.androidWebSettings.allowProtectedMedia) {
458+ grantedPermissions.add(PermissionRequest .RESOURCE_PROTECTED_MEDIA_ID )
459+ }
460+ }
461+
462+ PermissionRequest .RESOURCE_VIDEO_CAPTURE -> {
463+ androidPermission = android.Manifest .permission.CAMERA
464+ }
465+ }
466+
467+ if (androidPermission != null ) {
468+ if (ContextCompat .checkSelfPermission(context, androidPermission) == PackageManager .PERMISSION_GRANTED ) {
469+ grantedPermissions.add(resource)
470+ KLogger .d {
471+ " onPermissionRequest permission [$androidPermission ] was already granted for resource [$resource ]"
472+ }
473+ } else {
474+ KLogger .w {
475+ " onPermissionRequest didn't find already granted permission [$androidPermission ] for resource [$resource ]"
476+ }
477+ }
478+ }
479+ }
480+
481+ if (grantedPermissions.isNotEmpty()) {
482+ request.grant(grantedPermissions.toTypedArray())
483+ KLogger .d { " onPermissionRequest granted permissions: ${grantedPermissions.joinToString()} " }
484+ } else {
485+ request.deny()
486+ KLogger .d { " onPermissionRequest denied permissions: ${request.resources} " }
487+ }
488+ }
428489}
0 commit comments