package com.rtnmapsgl import android.Manifest import android.app.Activity import android.content.Context import android.content.pm.PackageManager import android.view.ViewGroup import android.webkit.GeolocationPermissions import android.webkit.WebChromeClient import android.webkit.WebView import android.webkit.WebViewClient import androidx.appcompat.app.AlertDialog import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import com.facebook.react.bridge.ReactApplicationContext import com.rtnmapsgl.interop.JSBuilder import com.rtnmapsgl.interop.WebAppInterface class MapsGLWebview( context: Context, getJSBuilder: (builder: JSBuilder) -> Unit, viewModel: MainViewModel, reactContext: ReactApplicationContext, reactNativeViewId: Int ) : WebView(context) { companion object { val mUrl = "file:///android_asset/mapview_android.html" } private val jsBuilder: JSBuilder = JSBuilder(context, this) init { getJSBuilder(jsBuilder) layoutParams = ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) webViewClient = WebViewClient() settings.javaScriptEnabled = true webChromeClient = object: WebChromeClient() { override fun onGeolocationPermissionsShowPrompt( origin: String, callback: GeolocationPermissions.Callback ) { android.util.Log.d("MapsGLWebview", "CONNOR - onGeolocationPermissionsShowPrompt called") if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale((context as Activity), Manifest.permission.ACCESS_FINE_LOCATION)) { AlertDialog.Builder(context) .setTitle("Location Permission Needed") .setMessage("This app needs the Location permission. Please accept to use location functionality.") .setPositiveButton("OK") { _, _ -> ActivityCompat.requestPermissions((context as Activity), arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 123) } .create() .show() } else { ActivityCompat.requestPermissions((context as Activity), arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 123) } } else { callback.invoke(origin, true, false) } } } settings.setGeolocationEnabled(true) setWebContentsDebuggingEnabled(true) // debugging addJavascriptInterface( WebAppInterface(viewModel, jsBuilder, reactContext, reactNativeViewId), "Android" ) load() } fun load() { loadUrl(mUrl) } }