@@ -27,8 +27,11 @@ import com.google.android.gms.maps.model.Polyline
2727import com.google.android.gms.maps.model.PolylineOptions
2828import com.google.android.gms.maps.model.TileOverlay
2929import com.google.android.gms.maps.model.TileOverlayOptions
30+ import com.google.maps.android.data.kml.KmlLayer
3031import com.rngooglemapsplus.extensions.toGooglePriority
3132import com.rngooglemapsplus.extensions.toLocationErrorCode
33+ import java.io.ByteArrayInputStream
34+ import java.nio.charset.StandardCharsets
3235
3336class GoogleMapsViewImpl (
3437 val reactContext : ThemedReactContext ,
@@ -55,12 +58,14 @@ class GoogleMapsViewImpl(
5558 private val pendingPolygons = mutableListOf<Pair <String , PolygonOptions >>()
5659 private val pendingCircles = mutableListOf<Pair <String , CircleOptions >>()
5760 private val pendingHeatmaps = mutableListOf<Pair <String , TileOverlayOptions >>()
61+ private val pendingKmlLayers = mutableListOf<Pair <String , String >>()
5862
5963 private val markersById = mutableMapOf<String , Marker >()
6064 private val polylinesById = mutableMapOf<String , Polyline >()
6165 private val polygonsById = mutableMapOf<String , Polygon >()
6266 private val circlesById = mutableMapOf<String , Circle >()
6367 private val heatmapsById = mutableMapOf<String , TileOverlay >()
68+ private val kmlLayersById = mutableMapOf<String , KmlLayer >()
6469
6570 private var cameraMoveReason = - 1
6671 private var lastSubmittedLocation: Location ? = null
@@ -343,6 +348,13 @@ class GoogleMapsViewImpl(
343348 }
344349 pendingHeatmaps.clear()
345350 }
351+
352+ if (pendingKmlLayers.isNotEmpty()) {
353+ pendingKmlLayers.forEach { (id, string) ->
354+ internalAddKmlLayer(id, string)
355+ }
356+ pendingKmlLayers.clear()
357+ }
346358 }
347359
348360 var uiSettings: RNMapUiSettings ? = null
@@ -825,6 +837,50 @@ class GoogleMapsViewImpl(
825837 pendingHeatmaps.clear()
826838 }
827839
840+ fun addKmlLayer (
841+ id : String ,
842+ kmlString : String ,
843+ ) {
844+ if (googleMap == null ) {
845+ pendingKmlLayers.add(id to kmlString)
846+ return
847+ }
848+ onUi {
849+ kmlLayersById.remove(id)?.removeLayerFromMap()
850+ }
851+ internalAddKmlLayer(id, kmlString)
852+ }
853+
854+ private fun internalAddKmlLayer (
855+ id : String ,
856+ kmlString : String ,
857+ ) {
858+ onUi {
859+ try {
860+ val inputStream = ByteArrayInputStream (kmlString.toByteArray(StandardCharsets .UTF_8 ))
861+ val layer = KmlLayer (googleMap, inputStream, context)
862+ kmlLayersById[id] = layer
863+ layer.addLayerToMap()
864+ } catch (e: Exception ) {
865+ // / ignore
866+ }
867+ }
868+ }
869+
870+ fun removeKmlLayer (id : String ) {
871+ onUi {
872+ kmlLayersById.remove(id)?.removeLayerFromMap()
873+ }
874+ }
875+
876+ fun clearKmlLayer () {
877+ onUi {
878+ kmlLayersById.values.forEach { it.removeLayerFromMap() }
879+ }
880+ kmlLayersById.clear()
881+ pendingKmlLayers.clear()
882+ }
883+
828884 fun destroyInternal () {
829885 onUi {
830886 markerBuilder.cancelAllJobs()
@@ -833,6 +889,7 @@ class GoogleMapsViewImpl(
833889 clearPolygons()
834890 clearCircles()
835891 clearHeatmaps()
892+ clearKmlLayer()
836893 locationHandler.stop()
837894 googleMap?.apply {
838895 setOnCameraMoveStartedListener(null )
0 commit comments