package com.rtnmapsgl.interop import android.util.Log import android.content.Context import android.webkit.WebView import com.facebook.react.bridge.ReadableArray import org.json.JSONObject import org.json.JSONArray import com.rtnmapsgl.R import com.facebook.react.bridge.ReadableMap import com.facebook.react.bridge.ReadableType import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch /* * Description: supported javascript functions to call * Kotlin -> Javascript interOp * * NOTE: See index.html for javascript functions */ class JSBuilder( private val context: Context, private val webView: WebView? ) { fun echo() = requestJS("echo('abc')") /* * React Native Props */ fun setAerisId(aerisId: String) { requestJS("setAerisId(\"$aerisId\")") } fun setAerisSecret(aerisSecret: String) { requestJS("setAerisSecret(\"$aerisSecret\")") } fun setMapboxAccessToken(mapboxAccessToken: String) { requestJS("setMapboxAccessToken(\"$mapboxAccessToken\")") } fun setStyleUrl(styleUrl: String) { requestJS("setStyleUrl(\"$styleUrl\")") } fun setMapLayerState(mapLayerState: ReadableMap) { val jsonString = convertReadableMapToJson(mapLayerState).toString() requestJS("setMapLayerState(${JSONObject.quote(jsonString)})") } fun setSelectedPin(selectedPin: ReadableMap) { val jsonString = convertReadableMapToJson(selectedPin).toString() requestJS("setSelectedPin(${JSONObject.quote(jsonString)})") } fun updatePins(pins: ReadableArray) { val jsonString = convertReadableArrayToJson(pins).toString() requestJS("updatePins(${JSONObject.quote(jsonString)})") } private fun convertReadableMapToJson(readableMap: ReadableMap): JSONObject { val jsonObject = JSONObject() val iterator = readableMap.keySetIterator() while (iterator.hasNextKey()) { val key = iterator.nextKey() when { readableMap.isNull(key) -> jsonObject.put(key, JSONObject.NULL) readableMap.getType(key) == ReadableType.Boolean -> jsonObject.put(key, readableMap.getBoolean(key)) readableMap.getType(key) == ReadableType.Number -> jsonObject.put(key, readableMap.getDouble(key)) readableMap.getType(key) == ReadableType.String -> jsonObject.put(key, readableMap.getString(key)) readableMap.getType(key) == ReadableType.Map -> jsonObject.put(key, readableMap.getMap(key)?.let { convertReadableMapToJson(it) }) readableMap.getType(key) == ReadableType.Array -> jsonObject.put(key, readableMap.getArray(key)?.let { convertReadableArrayToJson(it) }) } } return jsonObject } private fun convertReadableArrayToJson(readableArray: ReadableArray): JSONArray { val jsonArray = JSONArray() for (i in 0 until readableArray.size()) { when { readableArray.isNull(i) -> jsonArray.put(JSONObject.NULL) readableArray.getType(i) == ReadableType.Boolean -> jsonArray.put(readableArray.getBoolean(i)) readableArray.getType(i) == ReadableType.Number -> jsonArray.put(readableArray.getDouble(i)) readableArray.getType(i) == ReadableType.String -> jsonArray.put(readableArray.getString(i)) readableArray.getType(i) == ReadableType.Map -> jsonArray.put(convertReadableMapToJson(readableArray.getMap(i))) readableArray.getType(i) == ReadableType.Array -> jsonArray.put(convertReadableArrayToJson(readableArray.getArray(i))) } } return jsonArray } /* * Core */ fun getCenter() = requestJS("getCenter()") fun setCenter(lat: Double, lon: Double) = requestJS("setCenter(\"$lat\", \"$lon\")") fun getZoom() = requestJS("getZoom()") fun setZoom(zoom: Int) = requestJS("setZoom(\"$zoom\")") fun getBounds() = requestJS("getBounds()") fun getBearing() = requestJS("getBearing()") fun getPitch() = requestJS("getPitch()") fun getFov() = requestJS("getFov()") /* * Layers */ val addWeatherLayer: (name: String, options: String) -> Unit = { n, o -> requestJS("addWeatherLayer(\"$n\", \"$o\")") } val removeWeatherLayer: (name: String) -> Unit = { n -> requestJS("removeWeatherLayer(\"$n\")") } val hasWeatherLayer: (name: String) -> Unit = { n -> requestJS("hasWeatherLayer(\"$n\")") } fun query(lat: Double, lon: Double) { requestJS("query(\"$lat\", \"$lon\")") } /* * Timeline */ fun getStartDate() = requestJS("getStartDate()") fun getEndDate() = requestJS("getEndDate()") fun getCurrentDate() = requestJS("getCurrentDate()") /* * Animation */ fun play() = requestJS("play()") fun stop() = requestJS("stop()") fun restart() = requestJS("restart()") fun resume() = requestJS("resume()") private fun requestJS(str: String) { webView?.evaluateJavascript("javascript:$str;", null) } }