Skip to content

Instantly share code, notes, and snippets.

@CyrilNb
Last active September 16, 2021 19:06
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CyrilNb/cb33953d7b0147562886a92e83e383ce to your computer and use it in GitHub Desktop.
Save CyrilNb/cb33953d7b0147562886a92e83e383ce to your computer and use it in GitHub Desktop.
[Android] webview permission camera + file picker
class MoonPayPaymentWebView : AppCompatActivity() {
companion object {
const val PERMISSION_REQUEST_CODE = 1000
const val REQUEST_SELECT_FILE = 1001
private const val FILECHOOSER_RESULTCODE = 1002
private var mUploadMessage: ValueCallback<Uri?>? = null
var uploadMessage: ValueCallback<Array<Uri>>? = null
}
private fun displayWebView(payload: String) {
webView.settings.apply {
loadWithOverviewMode = true
useWideViewPort = true
javaScriptEnabled = true
allowFileAccess = true
allowFileAccessFromFileURLs = true
allowUniversalAccessFromFileURLs = true
allowContentAccess = true
javaScriptCanOpenWindowsAutomatically = true
mediaPlaybackRequiresUserGesture = false
domStorageEnabled = true // Set because [WEBSITE] team say to use it.
}
// webView.webChromeClient = webViewManager.getWebChromeClient()
webView.webChromeClient = object : WebChromeClient() {
override fun onConsoleMessage(consoleMessage: ConsoleMessage?): Boolean {
Log.d("---", "consoleMessage ${consoleMessage?.message()}")
return super.onConsoleMessage(consoleMessage)
}
override fun onPermissionRequestCanceled(request: PermissionRequest?) {
Log.d("---", "onPermissionRequestCanceled")
super.onPermissionRequestCanceled(request)
}
override fun onShowFileChooser(
webView: WebView?,
filePathCallback: ValueCallback<Array<Uri>>?,
fileChooserParams: FileChooserParams?
): Boolean {
Log.d("---", "onshowfilechooser")
if (uploadMessage != null) {
Log.d("---", "uploadMsg null")
uploadMessage!!.onReceiveValue(null)
uploadMessage = null
}
try {
uploadMessage = filePathCallback
val intent = fileChooserParams?.createIntent()
intent?.type = "image/*"
try {
startActivityForResult(intent, REQUEST_SELECT_FILE)
} catch (e: ActivityNotFoundException) {
Log.d("---", "exception startactivitynotfound")
uploadMessage = null
this@CustomWebView.showLongToast("Cannot Open File Chooser")
return false
}
} catch (e: ActivityNotFoundException) {
Log.d("---", "activitynotfound exception")
uploadMessage = null
this@CustomWebView.showLongToast("Cannot Open File Chooser")
return false
}
return true
}
// Grant permissions for cam
@TargetApi(Build.VERSION_CODES.M)
override fun onPermissionRequest(request: PermissionRequest) {
Log.d("---", "onpermission request")
onUi {
if ("android.webkit.resource.VIDEO_CAPTURE" == request.resources[0]) {
if (ContextCompat.checkSelfPermission(
applicationContext,
android.Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED
) {
Log.d("---", String.format("PERMISSION REQUEST %s GRANTED", request.origin.toString()))
request.grant(request.resources)
} else {
Log.d("---", "ELSE")
ActivityCompat.requestPermissions(
this@MoonPayPaymentWebView,
arrayOf(
android.Manifest.permission.CAMERA,
android.Manifest.permission.READ_EXTERNAL_STORAGE
),
REQUEST_CODE
)
}
} else {
Log.d("---", "${request.resources}")
}
}
}
}
webView.webViewClient = object : WebViewClient() {
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
checkAndHandleIfUrlIsRedirect(url)
}
override fun onPageFinished(view: WebView?, url: String?) {
onPageLoaded()
}
override fun onReceivedError(view: WebView?,errorCode: Int,description: String?,failingUrl: String?) {
Log.d("---", "$errorCode $description $failingUrl")
}
}
webView.loadUrl("$Url?$payload")
}
private fun checkAndHandleIfUrlIsRedirect(url: String?) {
// We check with `startWitch` because [WEBSITE] appended Query parameter to the url.
if (url?.startsWith(WebViewManager.BUY_WEB_VIEW_REDIRECTION) == true) {
// launch final activity
}
}
public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
Log.d("---", "onActivity result $requestCode $resultCode $data")
// if (requestCode == REQUEST_SELECT_FILE) {
// Log.d("---", "uploadMessage = $uploadMessage")
// uploadMessage?.let {
// it.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent))
// uploadMessage = null
// webViewManager.onActivityResult(requestCode, resultCode, data)
// } ?: return
// }
//
// if (requestCode == FILECHOOSER_RESULTCODE) {
//
// mUploadMessage?.let {
// val result =
// if (intent == null || resultCode != Activity.RESULT_OK) {
// null
// } else intent.data
//
// it.onReceiveValue(result)
// mUploadMessage = null
// } ?: return
// }
if (requestCode == REQUEST_SELECT_FILE) {
if (null == uploadMessage) {
return
}
uploadMessage?.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data))
uploadMessage = null
}
if (requestCode == SuccessActivity.REQUEST_CODE) {
ReferralEmptyStateActivity.startActivity(this)
setResult(Activity.RESULT_OK)
finish()
}
return super.onActivityResult(requestCode, resultCode, data)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment