11package com.rngooglemapsplus
22
3+ import android.annotation.SuppressLint
34import android.location.Location
45import android.widget.FrameLayout
56import com.facebook.react.bridge.LifecycleEventListener
@@ -24,12 +25,14 @@ import com.google.android.gms.maps.model.Polygon
2425import com.google.android.gms.maps.model.PolygonOptions
2526import com.google.android.gms.maps.model.Polyline
2627import com.google.android.gms.maps.model.PolylineOptions
28+ import com.rngooglemapsplus.extensions.toGooglePriority
29+ import com.rngooglemapsplus.extensions.toLocationErrorCode
2730
2831class GoogleMapsViewImpl (
2932 val reactContext : ThemedReactContext ,
3033 val locationHandler : LocationHandler ,
3134 val playServiceHandler : PlayServicesHandler ,
32- val markerOptions : com.rngooglemapsplus. MarkerOptions ,
35+ val markerBuilder : MarkerBuilder ,
3336) : FrameLayout(reactContext),
3437 GoogleMap .OnCameraMoveStartedListener ,
3538 GoogleMap .OnCameraMoveListener ,
@@ -252,12 +255,37 @@ class GoogleMapsViewImpl(
252255 it.bottom.dpToPx().toInt(),
253256 )
254257 }
258+
259+ uiSettings?.let { v ->
260+ googleMap?.uiSettings?.apply {
261+ v.allGesturesEnabled?.let { setAllGesturesEnabled(it) }
262+ v.compassEnabled?.let { isCompassEnabled = it }
263+ v.indoorLevelPickerEnabled?.let { isIndoorLevelPickerEnabled = it }
264+ v.mapToolbarEnabled?.let { isMapToolbarEnabled = it }
265+ v.myLocationButtonEnabled?.let {
266+ googleMap?.setLocationSource(locationHandler)
267+ isMyLocationButtonEnabled = it
268+ }
269+ v.rotateEnabled?.let { isRotateGesturesEnabled = it }
270+ v.scrollEnabled?.let { isScrollGesturesEnabled = it }
271+ v.scrollDuringRotateOrZoomEnabled?.let {
272+ isScrollGesturesEnabledDuringRotateOrZoom = it
273+ }
274+ v.tiltEnabled?.let { isTiltGesturesEnabled = it }
275+ v.zoomControlsEnabled?.let { isZoomControlsEnabled = it }
276+ v.zoomGesturesEnabled?.let { isZoomGesturesEnabled = it }
277+ }
278+ }
279+
255280 buildingEnabled?.let {
256281 googleMap?.isBuildingsEnabled = it
257282 }
258283 trafficEnabled?.let {
259284 googleMap?.isTrafficEnabled = it
260285 }
286+ indoorEnabled?.let {
287+ googleMap?.isIndoorEnabled = it
288+ }
261289 googleMap?.setMapStyle(customMapStyle)
262290 mapType?.let {
263291 googleMap?.mapType = it
@@ -273,6 +301,12 @@ class GoogleMapsViewImpl(
273301 }
274302 }
275303
304+ locationConfig?.let {
305+ locationHandler.priority = it.android?.priority?.toGooglePriority()
306+ locationHandler.interval = it.android?.interval?.toLong()
307+ locationHandler.minUpdateInterval = it.android?.minUpdateInterval?.toLong()
308+ }
309+
276310 if (pendingMarkers.isNotEmpty()) {
277311 pendingMarkers.forEach { (id, opts) ->
278312 internalAddMarker(id, opts)
@@ -302,6 +336,69 @@ class GoogleMapsViewImpl(
302336 }
303337 }
304338
339+ var uiSettings: RNMapUiSettings ? = null
340+ set(value) {
341+ field = value
342+ onUi {
343+ value?.let { v ->
344+ googleMap?.uiSettings?.apply {
345+ v.allGesturesEnabled?.let { setAllGesturesEnabled(it) }
346+ v.compassEnabled?.let { isCompassEnabled = it }
347+ v.indoorLevelPickerEnabled?.let { isIndoorLevelPickerEnabled = it }
348+ v.mapToolbarEnabled?.let { isMapToolbarEnabled = it }
349+ v.myLocationButtonEnabled?.let {
350+ googleMap?.setLocationSource(locationHandler)
351+ isMyLocationButtonEnabled = it
352+ }
353+ v.rotateEnabled?.let { isRotateGesturesEnabled = it }
354+ v.scrollEnabled?.let { isScrollGesturesEnabled = it }
355+ v.scrollDuringRotateOrZoomEnabled?.let {
356+ isScrollGesturesEnabledDuringRotateOrZoom = it
357+ }
358+ v.tiltEnabled?.let { isTiltGesturesEnabled = it }
359+ v.zoomControlsEnabled?.let { isZoomControlsEnabled = it }
360+ v.zoomGesturesEnabled?.let { isZoomGesturesEnabled = it }
361+ }
362+ }
363+ ? : run {
364+ googleMap?.uiSettings?.apply {
365+ setAllGesturesEnabled(true )
366+ isCompassEnabled = false
367+ isIndoorLevelPickerEnabled = false
368+ isMapToolbarEnabled = false
369+ isMyLocationButtonEnabled = false
370+ googleMap?.setLocationSource(null )
371+ isRotateGesturesEnabled = true
372+ isScrollGesturesEnabled = true
373+ isScrollGesturesEnabledDuringRotateOrZoom = true
374+ isTiltGesturesEnabled = true
375+ isZoomControlsEnabled = false
376+ isZoomGesturesEnabled = false
377+ }
378+ }
379+ }
380+ }
381+
382+ @SuppressLint(" MissingPermission" )
383+ var myLocationEnabled: Boolean? = null
384+ set(value) {
385+ onUi {
386+ try {
387+ value?.let {
388+ googleMap?.isMyLocationEnabled = it
389+ }
390+ ? : run {
391+ googleMap?.isMyLocationEnabled = false
392+ }
393+ } catch (se: SecurityException ) {
394+ onLocationError?.invoke(RNLocationErrorCode .PERMISSION_DENIED )
395+ } catch (ex: Exception ) {
396+ val error = ex.toLocationErrorCode(context)
397+ onLocationError?.invoke(error)
398+ }
399+ }
400+ }
401+
305402 var buildingEnabled: Boolean? = null
306403 set(value) {
307404 field = value
@@ -327,6 +424,19 @@ class GoogleMapsViewImpl(
327424 }
328425 }
329426
427+ var indoorEnabled: Boolean? = null
428+ set(value) {
429+ field = value
430+ onUi {
431+ value?.let {
432+ googleMap?.isIndoorEnabled = it
433+ }
434+ ? : run {
435+ googleMap?.isIndoorEnabled = false
436+ }
437+ }
438+ }
439+
330440 var customMapStyle: MapStyleOptions ? = null
331441 set(value) {
332442 field = value
@@ -400,6 +510,14 @@ class GoogleMapsViewImpl(
400510 }
401511 }
402512
513+ var locationConfig: RNLocationConfig ? = null
514+ set(value) {
515+ field = value
516+ locationHandler.priority = value?.android?.priority?.toGooglePriority()
517+ locationHandler.interval = value?.android?.interval?.toLong()
518+ locationHandler.minUpdateInterval = value?.android?.minUpdateInterval?.toLong()
519+ }
520+
403521 var onMapError: ((RNMapErrorCode ) -> Unit )? = null
404522 var onMapReady: ((Boolean ) -> Unit )? = null
405523 var onLocationUpdate: ((RNLocation ) -> Unit )? = null
@@ -414,7 +532,7 @@ class GoogleMapsViewImpl(
414532 var onCameraChangeComplete: ((RNRegion , RNCamera , Boolean ) -> Unit )? = null
415533
416534 fun setCamera (
417- camera : RNCamera ,
535+ cameraPosition : CameraPosition ,
418536 animated : Boolean ,
419537 durationMS : Int ,
420538 ) {
@@ -423,33 +541,8 @@ class GoogleMapsViewImpl(
423541 if (current == null ) {
424542 return @onUi
425543 }
426- val camPosBuilder =
427- CameraPosition .Builder (
428- current,
429- )
430-
431- camera.center?.let {
432- camPosBuilder.target(
433- LatLng (
434- it.latitude,
435- it.longitude,
436- ),
437- )
438- }
439-
440- camera.zoom?.let {
441- camPosBuilder.zoom(it.toFloat())
442- }
443- camera.bearing?.let {
444- camPosBuilder.bearing(it.toFloat())
445- }
446- camera.tilt?.let {
447- camPosBuilder.tilt(it.toFloat())
448- }
449-
450- val camPos = camPosBuilder.build()
451544
452- val update = CameraUpdateFactory .newCameraPosition(camPos )
545+ val update = CameraUpdateFactory .newCameraPosition(cameraPosition )
453546
454547 if (animated) {
455548 googleMap?.animateCamera(update, durationMS, null )
@@ -746,7 +839,7 @@ class GoogleMapsViewImpl(
746839
747840 fun destroyInternal () {
748841 onUi {
749- markerOptions .cancelAllJobs()
842+ markerBuilder .cancelAllJobs()
750843 clearMarkers()
751844 clearPolylines()
752845 clearPolygons()
0 commit comments