diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2513dba..5c6e47a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -43,6 +43,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/credman/cmwallet/createcred/CreateCredentialActivity.kt b/app/src/main/java/com/credman/cmwallet/createcred/CreateCredentialActivity.kt index eb29fdc..6176463 100644 --- a/app/src/main/java/com/credman/cmwallet/createcred/CreateCredentialActivity.kt +++ b/app/src/main/java/com/credman/cmwallet/createcred/CreateCredentialActivity.kt @@ -1,16 +1,21 @@ package com.credman.cmwallet.createcred +import android.Manifest import android.content.Intent +import android.content.pm.PackageManager import android.os.Build import android.os.Bundle import android.service.credentials.CredentialProviderService import android.util.Log import android.view.ViewGroup +import android.webkit.PermissionRequest +import android.webkit.WebChromeClient import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -62,6 +67,21 @@ import com.credman.cmwallet.ui.theme.CMWalletTheme class CreateCredentialActivity : ComponentActivity() { private val viewModel: CreateCredentialViewModel by viewModels() + private val pendingWebPermissionRequests = mutableListOf() + + private val cameraPermissionLauncher = registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { granted -> + pendingWebPermissionRequests.forEach { request -> + if (granted) { + request.grant(arrayOf(PermissionRequest.RESOURCE_VIDEO_CAPTURE)) + } else { + request.deny() + } + } + pendingWebPermissionRequests.clear() + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState == null) { @@ -301,6 +321,35 @@ class CreateCredentialActivity : ComponentActivity() { ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT ) + this.webChromeClient = object : WebChromeClient() { + override fun onPermissionRequest(request: PermissionRequest) { + val pageWantsCamera = + PermissionRequest.RESOURCE_VIDEO_CAPTURE in request.resources + val appHoldsCameraPermission = checkSelfPermission( + Manifest.permission.CAMERA + ) == PackageManager.PERMISSION_GRANTED + val permissionDialogAlreadyShowing = + pendingWebPermissionRequests.isNotEmpty() + + when { + !pageWantsCamera -> { + Log.d(TAG, "[AuthWebView] Denying ${request.resources.joinToString()} for ${request.origin}") + request.deny() + } + appHoldsCameraPermission -> { + Log.d(TAG, "[AuthWebView] Granting camera to ${request.origin}") + request.grant(arrayOf(PermissionRequest.RESOURCE_VIDEO_CAPTURE)) + } + else -> { + Log.d(TAG, "[AuthWebView] Asking for camera permission on behalf of ${request.origin}") + pendingWebPermissionRequests += request + if (!permissionDialogAlreadyShowing) { + cameraPermissionLauncher.launch(Manifest.permission.CAMERA) + } + } + } + } + } this.webViewClient = object : WebViewClient() { override fun shouldOverrideUrlLoading( view: WebView?,