11package org.maplibre.reactnative.components.camera
22
3+ import android.Manifest
34import android.content.Context
45import android.location.Location
56import android.util.AttributeSet
7+ import androidx.annotation.RequiresPermission
68import com.facebook.react.bridge.Arguments
79import com.facebook.react.bridge.ReactContext
810import com.facebook.react.bridge.ReadableMap
911import com.facebook.react.bridge.WritableMap
10- import com.facebook.react.bridge.WritableNativeMap
1112import com.facebook.react.uimanager.UIManagerHelper
13+ import com.facebook.react.uimanager.events.Event
1214import com.facebook.react.uimanager.events.EventDispatcher
1315import org.maplibre.android.camera.CameraPosition
1416import org.maplibre.android.camera.CameraUpdateFactory.newCameraPosition
@@ -22,8 +24,6 @@ import org.maplibre.reactnative.components.AbstractMapFeature
2224import org.maplibre.reactnative.components.camera.constants.CameraEasing
2325import org.maplibre.reactnative.components.location.LocationComponentManager
2426import org.maplibre.reactnative.components.mapview.MLRNMapView
25- import org.maplibre.reactnative.events.MapChangeEvent
26- import org.maplibre.reactnative.events.TrackUserLocationChangeEvent
2727import org.maplibre.reactnative.location.LocationManager
2828import org.maplibre.reactnative.location.LocationManager.OnUserLocationChange
2929import org.maplibre.reactnative.location.TrackUserLocationMode
@@ -63,13 +63,12 @@ class MLRNCamera(context: Context) : AbstractMapFeature(
6363
6464
6565 private val locationChangeListener: OnUserLocationChange = object : OnUserLocationChange {
66- override fun onLocationChange (nextLocation : Location ) {
66+ override fun onLocationChange (location : Location ) {
6767 if (mapView!! .mapLibreMap == null || locationComponentManager == null || ! locationComponentManager!! .hasLocationComponent() || trackUserLocation == TrackUserLocationMode .NONE ) {
6868 return
6969 }
7070
71- userLocation.currentLocation = nextLocation
72- sendUserLocationUpdateEvent(nextLocation)
71+ userLocation.setCurrentLocation(location);
7372 }
7473 }
7574
@@ -103,6 +102,7 @@ class MLRNCamera(context: Context) : AbstractMapFeature(
103102 }
104103 }
105104
105+ @RequiresPermission(allOf = [Manifest .permission.ACCESS_FINE_LOCATION , Manifest .permission.ACCESS_COARSE_LOCATION ])
106106 override fun addToMap (mapView : MLRNMapView ) {
107107 this @MLRNCamera.mapView = mapView
108108
@@ -192,7 +192,7 @@ class MLRNCamera(context: Context) : AbstractMapFeature(
192192 private fun updateUserTrackingMode (trackUserLocationMode : Int ) {
193193 userLocation.trackingMode = trackUserLocationMode
194194
195- val event = TrackUserLocationChangeEvent (surfaceId, id, trackUserLocationMode)
195+ val event = OnTrackUserLocationChangeEvent (surfaceId, id, trackUserLocationMode)
196196 eventDispatcher?.dispatchEvent(event)
197197 }
198198
@@ -232,17 +232,6 @@ class MLRNCamera(context: Context) : AbstractMapFeature(
232232 return direction
233233 }
234234
235- private fun sendUserLocationUpdateEvent (location : Location ? ) {
236- if (location == null ) {
237- return
238- }
239- // TODO: This has to be emitted from the proper Component
240- val event = MapChangeEvent (
241- surfaceId, id, " onUpdate" , makeLocationChangePayload(location)
242- )
243- eventDispatcher?.dispatchEvent(event)
244- }
245-
246235 private fun updateUserLocationSignificantly () {
247236 userTrackingState = TrackUserLocationState .BEGAN
248237
@@ -282,12 +271,13 @@ class MLRNCamera(context: Context) : AbstractMapFeature(
282271 mapView!! .moveCamera(cameraUpdate, callback)
283272 }
284273
274+ @RequiresPermission(allOf = [Manifest .permission.ACCESS_FINE_LOCATION , Manifest .permission.ACCESS_COARSE_LOCATION ])
285275 private fun enableLocation () {
286276 if (! PermissionsManager .areLocationPermissionsGranted(context)) {
287277 return
288278 }
289279
290- if (! locationManager.isActive) {
280+ if (! locationManager.isActive() ) {
291281 locationManager.enable()
292282 }
293283
@@ -385,25 +375,23 @@ class MLRNCamera(context: Context) : AbstractMapFeature(
385375 return mapView!! .mapLibreMap
386376 }
387377
388- // TODO: Update structure
389- private fun makeLocationChangePayload (location : Location ): WritableMap {
390- val positionProperties: WritableMap = WritableNativeMap ()
391- val coordinates: WritableMap = WritableNativeMap ()
392-
393- coordinates.putDouble(" longitude" , location.longitude)
394- coordinates.putDouble(" latitude" , location.latitude)
395- coordinates.putDouble(" altitude" , location.altitude)
396- coordinates.putDouble(" accuracy" , location.accuracy.toDouble())
397- // TODO
398- // A better solution will be to pull the heading from the compass engine,
399- // unfortunately the api is not public
400- coordinates.putDouble(" heading" , location.bearing.toDouble())
401- coordinates.putDouble(" course" , location.bearing.toDouble())
402- coordinates.putDouble(" speed" , location.speed.toDouble())
403-
404- positionProperties.putMap(" coords" , coordinates)
405- positionProperties.putDouble(" timestamp" , location.time.toDouble())
406-
407- return positionProperties
378+
379+ inner class OnTrackUserLocationChangeEvent (
380+ surfaceId : Int ,
381+ viewId : Int ,
382+ private val trackUserLocationMode : Int
383+ ) :
384+ Event <OnTrackUserLocationChangeEvent >(surfaceId, viewId) {
385+ override fun getEventName () = " onTrackUserLocationChange"
386+
387+ override fun getEventData (): WritableMap {
388+ return Arguments .createMap().apply {
389+ putString(
390+ " trackUserLocation" ,
391+ TrackUserLocationMode .toString(trackUserLocationMode)
392+ )
393+ }
394+ }
408395 }
396+
409397}
0 commit comments