@rnmapbox/maps 10.0.0-beta.69 → 10.0.0-beta.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/android/rctmgl/src/main/java-v10/com/mapbox/rctmgl/components/annotation/RCTMGLMarkerView.kt +0 -1
  2. package/android/rctmgl/src/main/java-v10/com/mapbox/rctmgl/components/camera/RCTMGLCamera.kt +10 -24
  3. package/android/rctmgl/src/main/java-v10/com/mapbox/rctmgl/components/location/LocationComponentManager.kt +125 -83
  4. package/android/rctmgl/src/main/java-v10/com/mapbox/rctmgl/components/location/RCTMGLNativeUserLocation.kt +33 -7
  5. package/android/rctmgl/src/main/java-v10/com/mapbox/rctmgl/components/location/RCTMGLNativeUserLocationManager.kt +32 -0
  6. package/android/rctmgl/src/main/java-v10/com/mapbox/rctmgl/components/mapview/RCTMGLMapView.kt +70 -30
  7. package/android/rctmgl/src/main/java-v10/com/mapbox/rctmgl/location/LocationManager.kt +64 -25
  8. package/ios/RCTMGL-v10/MGLModule.swift +1 -0
  9. package/ios/RCTMGL-v10/RCTMGLAtmosphere.swift +1 -0
  10. package/ios/RCTMGL-v10/RCTMGLBackgroundLayer.swift +1 -0
  11. package/ios/RCTMGL-v10/RCTMGLCircleLayer.swift +1 -0
  12. package/ios/RCTMGL-v10/RCTMGLEvent.swift +1 -0
  13. package/ios/RCTMGL-v10/RCTMGLFillExtrustionLayer.swift +1 -0
  14. package/ios/RCTMGL-v10/RCTMGLFillLayer.swift +1 -0
  15. package/ios/RCTMGL-v10/RCTMGLHeatmapLayer.swift +1 -0
  16. package/ios/RCTMGL-v10/RCTMGLLayer.swift +4 -0
  17. package/ios/RCTMGL-v10/RCTMGLLight.swift +5 -3
  18. package/ios/RCTMGL-v10/RCTMGLLineLayer.swift +1 -0
  19. package/ios/RCTMGL-v10/RCTMGLLocationModule.m +4 -0
  20. package/ios/RCTMGL-v10/RCTMGLLocationModule.swift +101 -5
  21. package/ios/RCTMGL-v10/RCTMGLMapView.swift +15 -2
  22. package/ios/RCTMGL-v10/RCTMGLRasterLayer.swift +1 -0
  23. package/ios/RCTMGL-v10/RCTMGLSingletonLayer.swift +4 -0
  24. package/ios/RCTMGL-v10/RCTMGLSkyLayer.swift +1 -0
  25. package/ios/RCTMGL-v10/RCTMGLStyle.swift +58 -123
  26. package/ios/RCTMGL-v10/RCTMGLStyleValue.swift +51 -5
  27. package/ios/RCTMGL-v10/RCTMGLSymbolLayer.swift +1 -0
  28. package/ios/RCTMGL-v10/RCTMGLTerrain.swift +1 -0
  29. package/javascript/components/MapView.js +22 -2
  30. package/javascript/modules/location/locationManager.js +18 -0
  31. package/lib/commonjs/classes/AnimatedCoordinatesArray.js.map +1 -1
  32. package/lib/commonjs/classes/AnimatedExtractCoordinateFromArray.js.map +1 -1
  33. package/lib/commonjs/classes/AnimatedPoint.js.map +1 -1
  34. package/lib/commonjs/classes/AnimatedRouteCoordinatesArray.js.map +1 -1
  35. package/lib/commonjs/classes/AnimatedShape.js.map +1 -1
  36. package/lib/commonjs/classes/index.d.js.map +1 -1
  37. package/lib/commonjs/classes/index.js.map +1 -1
  38. package/lib/commonjs/components/AbstractLayer.js.map +1 -1
  39. package/lib/commonjs/components/AbstractSource.js.map +1 -1
  40. package/lib/commonjs/components/Atmosphere.js.map +1 -1
  41. package/lib/commonjs/components/BackgroundLayer.js.map +1 -1
  42. package/lib/commonjs/components/Callout.js.map +1 -1
  43. package/lib/commonjs/components/Camera.js.map +1 -1
  44. package/lib/commonjs/components/CircleLayer.js.map +1 -1
  45. package/lib/commonjs/components/FillExtrusionLayer.js.map +1 -1
  46. package/lib/commonjs/components/FillLayer.js.map +1 -1
  47. package/lib/commonjs/components/HeadingIndicator.js.map +1 -1
  48. package/lib/commonjs/components/HeatmapLayer.js.map +1 -1
  49. package/lib/commonjs/components/ImageSource.js.map +1 -1
  50. package/lib/commonjs/components/Images.js.map +1 -1
  51. package/lib/commonjs/components/Light.js.map +1 -1
  52. package/lib/commonjs/components/LineLayer.js.map +1 -1
  53. package/lib/commonjs/components/MapView.js +19 -2
  54. package/lib/commonjs/components/MapView.js.map +1 -1
  55. package/lib/commonjs/components/MarkerView.js.map +1 -1
  56. package/lib/commonjs/components/NativeBridgeComponent.js.map +1 -1
  57. package/lib/commonjs/components/NativeUserLocation.js.map +1 -1
  58. package/lib/commonjs/components/PointAnnotation.js.map +1 -1
  59. package/lib/commonjs/components/RasterDemSource.js.map +1 -1
  60. package/lib/commonjs/components/RasterLayer.js.map +1 -1
  61. package/lib/commonjs/components/RasterSource.js.map +1 -1
  62. package/lib/commonjs/components/ShapeSource.js.map +1 -1
  63. package/lib/commonjs/components/SkyLayer.js.map +1 -1
  64. package/lib/commonjs/components/Style.js.map +1 -1
  65. package/lib/commonjs/components/SymbolLayer.js.map +1 -1
  66. package/lib/commonjs/components/Terrain.js.map +1 -1
  67. package/lib/commonjs/components/UserLocation.js +2 -4
  68. package/lib/commonjs/components/UserLocation.js.map +1 -1
  69. package/lib/commonjs/components/VectorSource.js.map +1 -1
  70. package/lib/commonjs/components/annotations/Annotation.js.map +1 -1
  71. package/lib/commonjs/index.js.map +1 -1
  72. package/lib/commonjs/index.web.js.map +1 -1
  73. package/lib/commonjs/modules/location/locationManager.js +17 -0
  74. package/lib/commonjs/modules/location/locationManager.js.map +1 -1
  75. package/lib/commonjs/modules/offline/OfflineCreatePackOptions.js.map +1 -1
  76. package/lib/commonjs/modules/offline/OfflinePack.js.map +1 -1
  77. package/lib/commonjs/modules/offline/offlineManager.js.map +1 -1
  78. package/lib/commonjs/modules/snapshot/SnapshotOptions.js.map +1 -1
  79. package/lib/commonjs/modules/snapshot/snapshotManager.js.map +1 -1
  80. package/lib/commonjs/requestAndroidLocationPermissions.js.map +1 -1
  81. package/lib/commonjs/utils/BridgeValue.js.map +1 -1
  82. package/lib/commonjs/utils/Logger.js.map +1 -1
  83. package/lib/commonjs/utils/StyleValue.js.map +1 -1
  84. package/lib/commonjs/utils/animated/Animated.js.map +1 -1
  85. package/lib/commonjs/utils/deprecation.js.map +1 -1
  86. package/lib/commonjs/utils/filterUtils.js.map +1 -1
  87. package/lib/commonjs/utils/geoUtils.js.map +1 -1
  88. package/lib/commonjs/utils/getAnnotationsLayerID.js.map +1 -1
  89. package/lib/commonjs/utils/index.js.map +1 -1
  90. package/lib/commonjs/utils/styleMap.js.map +1 -1
  91. package/lib/commonjs/web/MapContext.js.map +1 -1
  92. package/lib/commonjs/web/MapboxModule.js.map +1 -1
  93. package/lib/commonjs/web/UnimplementedComponent.js.map +1 -1
  94. package/lib/commonjs/web/components/Camera.js.map +1 -1
  95. package/lib/commonjs/web/components/MapView.js.map +1 -1
  96. package/lib/commonjs/web/index.js.map +1 -1
  97. package/lib/commonjs/web/utils/Logger.js.map +1 -1
  98. package/lib/module/classes/AnimatedCoordinatesArray.js.map +1 -1
  99. package/lib/module/classes/AnimatedExtractCoordinateFromArray.js.map +1 -1
  100. package/lib/module/classes/AnimatedPoint.js.map +1 -1
  101. package/lib/module/classes/AnimatedRouteCoordinatesArray.js.map +1 -1
  102. package/lib/module/classes/AnimatedShape.js.map +1 -1
  103. package/lib/module/components/AbstractLayer.js.map +1 -1
  104. package/lib/module/components/AbstractSource.js.map +1 -1
  105. package/lib/module/components/Atmosphere.js.map +1 -1
  106. package/lib/module/components/BackgroundLayer.js.map +1 -1
  107. package/lib/module/components/Callout.js.map +1 -1
  108. package/lib/module/components/Camera.js.map +1 -1
  109. package/lib/module/components/CircleLayer.js.map +1 -1
  110. package/lib/module/components/FillExtrusionLayer.js.map +1 -1
  111. package/lib/module/components/FillLayer.js.map +1 -1
  112. package/lib/module/components/HeadingIndicator.js.map +1 -1
  113. package/lib/module/components/HeatmapLayer.js.map +1 -1
  114. package/lib/module/components/ImageSource.js.map +1 -1
  115. package/lib/module/components/Images.js.map +1 -1
  116. package/lib/module/components/Light.js.map +1 -1
  117. package/lib/module/components/LineLayer.js.map +1 -1
  118. package/lib/module/components/MapView.js +19 -2
  119. package/lib/module/components/MapView.js.map +1 -1
  120. package/lib/module/components/MarkerView.js.map +1 -1
  121. package/lib/module/components/NativeBridgeComponent.js.map +1 -1
  122. package/lib/module/components/NativeUserLocation.js.map +1 -1
  123. package/lib/module/components/PointAnnotation.js.map +1 -1
  124. package/lib/module/components/RasterDemSource.js.map +1 -1
  125. package/lib/module/components/RasterLayer.js.map +1 -1
  126. package/lib/module/components/RasterSource.js.map +1 -1
  127. package/lib/module/components/ShapeSource.js.map +1 -1
  128. package/lib/module/components/SkyLayer.js.map +1 -1
  129. package/lib/module/components/Style.js.map +1 -1
  130. package/lib/module/components/SymbolLayer.js.map +1 -1
  131. package/lib/module/components/Terrain.js.map +1 -1
  132. package/lib/module/components/UserLocation.js +2 -4
  133. package/lib/module/components/UserLocation.js.map +1 -1
  134. package/lib/module/components/VectorSource.js.map +1 -1
  135. package/lib/module/components/annotations/Annotation.js.map +1 -1
  136. package/lib/module/modules/location/locationManager.js +17 -0
  137. package/lib/module/modules/location/locationManager.js.map +1 -1
  138. package/lib/module/modules/offline/OfflineCreatePackOptions.js.map +1 -1
  139. package/lib/module/modules/offline/OfflinePack.js.map +1 -1
  140. package/lib/module/modules/offline/offlineManager.js.map +1 -1
  141. package/lib/module/modules/snapshot/SnapshotOptions.js.map +1 -1
  142. package/lib/module/modules/snapshot/snapshotManager.js.map +1 -1
  143. package/lib/module/requestAndroidLocationPermissions.js.map +1 -1
  144. package/lib/module/utils/BridgeValue.js.map +1 -1
  145. package/lib/module/utils/Logger.js.map +1 -1
  146. package/lib/module/utils/StyleValue.js.map +1 -1
  147. package/lib/module/utils/deprecation.js.map +1 -1
  148. package/lib/module/utils/filterUtils.js.map +1 -1
  149. package/lib/module/utils/geoUtils.js.map +1 -1
  150. package/lib/module/utils/index.js.map +1 -1
  151. package/lib/module/utils/styleMap.js.map +1 -1
  152. package/lib/module/web/UnimplementedComponent.js.map +1 -1
  153. package/lib/module/web/components/Camera.js.map +1 -1
  154. package/lib/module/web/components/MapView.js.map +1 -1
  155. package/lib/module/web/utils/Logger.js.map +1 -1
  156. package/package.json +1 -1
  157. package/android/rctmgl/src/main/java-v10/com/mapbox/rctmgl/components/location/RCTMGLNativeUserLocationManager.java +0 -34
  158. package/android/rctmgl/src/main/java-v10/com/mapbox/rctmgl/components/location/RenderMode.kt +0 -21
@@ -13,7 +13,6 @@ import com.mapbox.maps.ViewAnnotationOptions
13
13
  import com.mapbox.maps.viewannotation.viewAnnotationOptions
14
14
  import com.mapbox.rctmgl.components.AbstractMapFeature
15
15
  import com.mapbox.rctmgl.components.mapview.RCTMGLMapView
16
- import com.mapbox.rctmgl.modules.RCTMGLLogging
17
16
  import com.mapbox.rctmgl.utils.Logger
18
17
  import java.util.Vector
19
18
 
@@ -3,34 +3,17 @@ package com.mapbox.rctmgl.components.camera
3
3
  import android.animation.Animator
4
4
  import android.content.Context
5
5
  import android.location.Location
6
- import com.mapbox.rctmgl.utils.GeoJSONUtils.toPoint
7
6
  import com.mapbox.maps.plugin.gestures.gestures
8
7
  import com.mapbox.rctmgl.location.LocationManager.Companion.getInstance
9
- import com.mapbox.maps.plugin.animation.camera
10
- import com.mapbox.rctmgl.utils.GeoJSONUtils.toLocation
11
- import com.mapbox.maps.plugin.animation.MapAnimationOptions.Builder
12
8
  import com.mapbox.maps.plugin.animation.flyTo
13
- import com.mapbox.rctmgl.components.camera.RCTMGLCameraManager
14
9
  import com.mapbox.rctmgl.components.AbstractMapFeature
15
10
  import com.mapbox.rctmgl.components.mapview.RCTMGLMapView
16
- import com.mapbox.rctmgl.components.camera.CameraStop
17
- import com.mapbox.rctmgl.components.camera.CameraUpdateQueue
18
11
  import com.mapbox.rctmgl.components.location.LocationComponentManager
19
12
  import com.mapbox.rctmgl.utils.LatLngBounds
20
- import com.mapbox.rctmgl.location.LocationManager.OnUserLocationChange
21
- import com.mapbox.rctmgl.utils.GeoJSONUtils
22
13
  import com.mapbox.maps.plugin.locationcomponent.OnIndicatorBearingChangedListener
23
14
  import com.mapbox.maps.plugin.locationcomponent.OnIndicatorPositionChangedListener
24
- import com.mapbox.rctmgl.components.camera.CameraUpdateItem
25
- import com.mapbox.rctmgl.events.IEvent
26
- import com.mapbox.rctmgl.events.MapChangeEvent
27
- import com.mapbox.rctmgl.events.constants.EventTypes
28
- import com.mapbox.rctmgl.components.camera.RCTMGLCamera
29
- import com.mapbox.android.core.permissions.PermissionsManager
30
- import com.mapbox.maps.plugin.animation.CameraAnimationsPlugin
31
15
  import com.facebook.react.bridge.WritableMap
32
16
  import com.facebook.react.bridge.WritableNativeMap
33
- import com.mapbox.geojson.Point
34
17
  import com.mapbox.maps.*
35
18
  import com.mapbox.maps.plugin.PuckBearingSource
36
19
  import com.mapbox.maps.plugin.locationcomponent.location
@@ -41,8 +24,6 @@ import com.mapbox.maps.plugin.viewport.viewport
41
24
  import com.mapbox.rctmgl.components.camera.constants.CameraMode
42
25
  import com.mapbox.rctmgl.components.location.*
43
26
  import com.mapbox.rctmgl.location.*
44
- import com.mapbox.rctmgl.modules.RCTMGLLogging
45
- import com.mapbox.rctmgl.utils.LatLng
46
27
  import com.mapbox.rctmgl.utils.Logger
47
28
 
48
29
 
@@ -224,7 +205,7 @@ class RCTMGLCamera(private val mContext: Context, private val mManager: RCTMGLCa
224
205
  if (mLocationComponentManager == null) {
225
206
  mLocationComponentManager = mMapView!!.locationComponentManager
226
207
  }
227
- mLocationComponentManager!!.update(style)
208
+ mLocationComponentManager!!.update()
228
209
  }
229
210
 
230
211
  fun setMinZoomLevel(zoomLevel: Double?) {
@@ -290,6 +271,11 @@ class RCTMGLCamera(private val mContext: Context, private val mManager: RCTMGLCa
290
271
  mMapView?.let {
291
272
  val map = it
292
273
  val viewport = map.viewport;
274
+
275
+ if (mLocationComponentManager == null) {
276
+ mLocationComponentManager = it.locationComponentManager
277
+ }
278
+
293
279
  if (mFollowUserLocation == false) {
294
280
  viewport.idle()
295
281
  mLocationComponentManager?.setFollowLocation(false)
@@ -298,10 +284,10 @@ class RCTMGLCamera(private val mContext: Context, private val mManager: RCTMGLCa
298
284
 
299
285
  mLocationComponentManager?.setFollowLocation(true)
300
286
  mLocationManager?.let {
301
-
302
- val provider = it.provider
303
- map.location.setLocationProvider(provider);
304
- map.location2.setLocationProvider(provider);
287
+ val provider = map.location.getLocationProvider()
288
+ if (provider != null) {
289
+ it.provider = provider
290
+ }
305
291
  }
306
292
 
307
293
  val location = map.location2
@@ -2,124 +2,166 @@ package com.mapbox.rctmgl.components.location
2
2
 
3
3
  import android.content.Context
4
4
  import android.graphics.Color
5
+ import android.graphics.drawable.Drawable
5
6
  import android.graphics.drawable.VectorDrawable
6
7
  import androidx.appcompat.content.res.AppCompatResources
8
+ import androidx.lifecycle.Lifecycle
7
9
  import com.mapbox.maps.plugin.locationcomponent.location
8
10
  import com.mapbox.rctmgl.components.mapview.RCTMGLMapView
9
- import com.mapbox.maps.Style
10
11
  import com.mapbox.maps.plugin.LocationPuck2D
12
+ import com.mapbox.maps.plugin.PuckBearingSource
13
+ import com.mapbox.maps.plugin.lifecycle.lifecycle
11
14
  import com.mapbox.rctmgl.R
12
15
  import com.mapbox.rctmgl.location.LocationManager
13
16
 
14
17
  /**
15
18
  * The LocationComponent on android implements display of user's current location.
16
- * But viewport seems to be tied to it in the sense that if location is not enbabled then it's viewport user tracking is not working.
19
+ * But viewport seems to be tied to it in the sense that if location is not enabled then it's viewport user tracking is not working.
17
20
  * LocationComponentManager attempts to separate that, so that Camera can ask for location tracking independent of display of user current location.
18
21
  * And NativeUserLocation can ask for display of user's current location - independent of Camera's user tracking.
19
22
  */
20
23
  class LocationComponentManager(mapView: RCTMGLMapView, context: Context) {
21
- private var mShowNativeUserLocation = false
22
- private var mFollowLocation = false
23
24
  var mMapView = mapView
24
25
  var mContext = context
25
- var mState = State(enabled=true, hidden=false, tintColor= null)
26
- var mLocationManager: LocationManager? = LocationManager.getInstance(context!!)
26
+ private var mState = State(showUserLocation=false, followUserLocation=false, hidden=false, tintColor= null, bearingImage = null, puckBearingSource =null)
27
+
28
+ private var mLocationManager: LocationManager = LocationManager.getInstance(context)
29
+
30
+ private var mNeedsFullUpdate = true
31
+
32
+ private var mLocationManagerStarted = false
27
33
 
28
34
  data class State(
29
- val enabled: Boolean, // in case followUserLocation is active or visible
35
+ val showUserLocation: Boolean,
36
+ val followUserLocation: Boolean,
30
37
  val hidden: Boolean, // in case it isn't native
31
38
  val tintColor: Int?, // tint of location puck
32
- )
33
-
34
- fun showNativeUserLocation(showUserLocation: Boolean) {
35
- mShowNativeUserLocation = showUserLocation
36
-
37
- _applyChanges()
39
+ var bearingImage: Drawable?, // bearing image (background)
40
+ var puckBearingSource: PuckBearingSource? // bearing source
41
+ ) {
42
+ val enabled: Boolean
43
+ get() = showUserLocation || followUserLocation
38
44
  }
39
45
 
40
- fun setFollowLocation(followLoation: Boolean) {
41
- mFollowLocation = followLoation
42
-
43
- _applyChanges()
46
+ fun update(newStateCallback: (currentState: State) -> State) {
47
+ val newState = newStateCallback(mState);
48
+ if (newState != mState) {
49
+ applyStateChanges(mState, newState)
50
+ mState = newState
51
+ }
44
52
  }
45
53
 
46
- fun update(style: Style) {
47
- _applyChanges()
48
- }
54
+ private fun applyStateChanges(oldState: State, newState: State) {
55
+ mMapView.let {
56
+ val needsFullUpdate = mNeedsFullUpdate
49
57
 
50
- fun setRenderMode(renderMode: RenderMode) {
51
- _applyChanges()
58
+ applyStateChanges(it, oldState, newState, needsFullUpdate)
59
+
60
+ mNeedsFullUpdate = false
61
+ }
52
62
  }
53
63
 
54
- fun _applyChanges() {
55
- mMapView?.let {
56
- val newState = State(
57
- enabled = mShowNativeUserLocation || mFollowLocation,
58
- hidden = !mShowNativeUserLocation,
59
- tintColor = mMapView!!.tintColor,
60
- )
61
-
62
- if (! mState.equals(newState)) {
63
- it.location.updateSettings {
64
- val trackLocation = true
65
- enabled = newState.enabled
66
-
67
- if ((newState.hidden != mState.hidden) || (newState.tintColor != mState.tintColor)) {
68
- if (newState.hidden) {
69
- var emptyLocationPuck = LocationPuck2D()
70
- val empty = AppCompatResources.getDrawable(mContext!!, R.drawable.empty)
71
- emptyLocationPuck.bearingImage = empty
72
- emptyLocationPuck.shadowImage = empty
73
- emptyLocationPuck.topImage = empty
74
- //emptyLocationPuck.opacity = 0.0
75
- locationPuck = emptyLocationPuck
76
- pulsingEnabled = false
77
- } else {
78
- val mapboxBlueColor = Color.parseColor("#4A90E2")
79
- val tintColor = newState.tintColor
80
- val defaultLocationPuck = LocationPuck2D()
81
- var topImage = AppCompatResources.getDrawable(mContext!!, R.drawable.mapbox_user_icon)
82
- if (tintColor != null) {
83
- val drawable = topImage as VectorDrawable?
84
- drawable!!.setTint(tintColor)
85
- topImage = drawable
86
- }
87
- defaultLocationPuck.topImage = topImage
88
- val bearingImage = AppCompatResources.getDrawable(
89
- mContext!!, R.drawable.mapbox_user_stroke_icon
90
- )
91
- defaultLocationPuck.bearingImage = bearingImage
92
- val shadowImage = AppCompatResources.getDrawable(
93
- mContext!!, R.drawable.mapbox_user_icon_shadow
94
- )
95
- defaultLocationPuck.shadowImage = shadowImage
96
- locationPuck = defaultLocationPuck
97
- pulsingEnabled = true
98
- if (tintColor != null) {
99
- pulsingColor = tintColor
100
- } else {
101
- pulsingColor = mapboxBlueColor
102
- }
103
- }
64
+ private fun applyStateChanges(map: RCTMGLMapView, oldState: State, newState: State, fullUpdate: Boolean) {
65
+ if (map.getLifecycleState() != Lifecycle.State.STARTED) {
66
+ // In case lifecycle was already stopped, so we're part of shutdown, do not call updateSettings as it'll just restart
67
+ // the loationComponent that will not be stopped. See https://github.com/mapbox/mapbox-maps-android/issues/2017
68
+ if (!newState.enabled) {
69
+ stopLocationManager()
70
+ }
71
+ return
72
+ }
73
+ map.location.updateSettings {
74
+ enabled = newState.enabled
75
+
76
+ if (fullUpdate || (newState.hidden != oldState.hidden) || (newState.tintColor != oldState.tintColor) || (newState.bearingImage != oldState.bearingImage)) {
77
+ if (newState.hidden) {
78
+ var emptyLocationPuck = LocationPuck2D()
79
+ val empty = AppCompatResources.getDrawable(mContext, R.drawable.empty)
80
+ emptyLocationPuck.bearingImage = empty
81
+ emptyLocationPuck.shadowImage = empty
82
+ emptyLocationPuck.topImage = empty
83
+ //emptyLocationPuck.opacity = 0.0
84
+ locationPuck = emptyLocationPuck
85
+ pulsingEnabled = false
86
+ } else {
87
+ val mapboxBlueColor = Color.parseColor("#4A90E2")
88
+ val tintColor = newState.tintColor
89
+ val defaultLocationPuck = LocationPuck2D()
90
+ var topImage = AppCompatResources.getDrawable(mContext, R.drawable.mapbox_user_icon)
91
+ if (tintColor != null) {
92
+ val drawable = topImage as VectorDrawable?
93
+ drawable!!.setTint(tintColor)
94
+ topImage = drawable
104
95
  }
105
- }
106
-
107
- if (newState.enabled != mState.enabled) {
108
- if (newState.enabled) {
109
- mLocationManager?.startCounted()
110
- val provider = mLocationManager?.provider
111
- if (provider != null) {
112
- it.location.setLocationProvider(provider)
113
- }
96
+ defaultLocationPuck.topImage = topImage
97
+ val defaultBearingImage = AppCompatResources.getDrawable(
98
+ mContext, R.drawable.mapbox_user_stroke_icon
99
+ );
100
+ defaultLocationPuck.bearingImage = newState.bearingImage ?: defaultBearingImage
101
+ val shadowImage = AppCompatResources.getDrawable(
102
+ mContext, R.drawable.mapbox_user_icon_shadow
103
+ )
104
+ defaultLocationPuck.shadowImage = shadowImage
105
+ locationPuck = defaultLocationPuck
106
+ pulsingEnabled = true
107
+ if (tintColor != null) {
108
+ pulsingColor = tintColor
114
109
  } else {
115
- mLocationManager?.stopCounted()
110
+ pulsingColor = mapboxBlueColor
116
111
  }
117
112
  }
113
+ }
118
114
 
119
- mState = newState;
115
+ if (fullUpdate || newState.enabled != mState.enabled) {
116
+ if (newState.enabled) {
117
+ startLocationManager()
118
+ useMapLocationProvider(map)
119
+ } else {
120
+ stopLocationManager()
121
+ }
120
122
  }
123
+ }
124
+ }
125
+
126
+ private fun startLocationManager() {
127
+ if (!mLocationManagerStarted) {
128
+ mLocationManager.startCounted()
129
+ mLocationManagerStarted = true
130
+ }
131
+ }
132
+
133
+ private fun stopLocationManager() {
134
+ if (mLocationManagerStarted) {
135
+ mLocationManager.stopCounted()
136
+ mLocationManagerStarted = false
137
+ }
138
+ }
139
+
140
+ private fun useMapLocationProvider(mapView: RCTMGLMapView) {
141
+ val provider = mapView.location.getLocationProvider()
142
+ if (provider != null) {
143
+ mLocationManager.provider = provider
144
+ }
145
+ }
146
+
121
147
 
148
+ fun showNativeUserLocation(showUserLocation: Boolean) {
149
+ update {
150
+ it.copy(showUserLocation = showUserLocation)
151
+ }
152
+ }
122
153
 
154
+ fun setFollowLocation(followUserLocation: Boolean) {
155
+ update {
156
+ it.copy(followUserLocation = followUserLocation)
123
157
  }
124
158
  }
159
+
160
+ fun update() {
161
+ update { it }
162
+ }
163
+
164
+ fun onDestroy() {
165
+ stopLocationManager();
166
+ }
125
167
  }
@@ -2,25 +2,33 @@ package com.mapbox.rctmgl.components.location
2
2
 
3
3
  import android.annotation.SuppressLint
4
4
  import android.content.Context
5
+ import androidx.appcompat.content.res.AppCompatResources
5
6
  import com.mapbox.rctmgl.components.mapview.OnMapReadyCallback
6
7
  import com.mapbox.maps.MapboxMap
7
8
  import com.mapbox.android.core.permissions.PermissionsManager
8
9
  import com.mapbox.maps.Style
10
+ import com.mapbox.maps.plugin.PuckBearingSource
11
+ import com.mapbox.rctmgl.R
9
12
  import com.mapbox.rctmgl.components.AbstractMapFeature
10
13
  import com.mapbox.rctmgl.components.mapview.RCTMGLMapView
11
14
 
12
- class RCTMGLNativeUserLocation(context: Context?) : AbstractMapFeature(context), OnMapReadyCallback, Style.OnStyleLoaded {
15
+ enum class RenderMode {
16
+ GPS, COMPASS, NORMAL
17
+ }
18
+
19
+ class RCTMGLNativeUserLocation(context: Context) : AbstractMapFeature(context), OnMapReadyCallback, Style.OnStyleLoaded {
13
20
  private var mEnabled = true
14
21
  private var mMap: MapboxMap? = null
22
+ private var mRenderMode : RenderMode = RenderMode.NORMAL;
23
+ private var mContext : Context = context
15
24
 
16
- private var mRenderMode : RenderMode = RenderMode.COMPASS
17
25
  override fun addToMap(mapView: RCTMGLMapView) {
18
26
  super.addToMap(mapView)
19
27
  mEnabled = true
20
28
  mapView.getMapboxMap()
21
29
  mapView.getMapAsync(this)
22
- setRenderMode(mRenderMode)
23
30
  mMapView?.locationComponentManager?.showNativeUserLocation(true)
31
+ applyChanges()
24
32
  }
25
33
 
26
34
  override fun removeFromMap(mapView: RCTMGLMapView) {
@@ -34,6 +42,12 @@ class RCTMGLNativeUserLocation(context: Context?) : AbstractMapFeature(context),
34
42
  override fun onMapReady(mapboxMap: MapboxMap) {
35
43
  mMap = mapboxMap
36
44
  mapboxMap.getStyle(this)
45
+ applyChanges()
46
+ }
47
+
48
+ fun setAndroidRenderMode(renderMode: RenderMode) {
49
+ mRenderMode = renderMode;
50
+ applyChanges();
37
51
  }
38
52
 
39
53
  @SuppressLint("MissingPermission")
@@ -43,12 +57,24 @@ class RCTMGLNativeUserLocation(context: Context?) : AbstractMapFeature(context),
43
57
  return
44
58
  }
45
59
 
46
- mMapView?.locationComponentManager?.update(style)
60
+ mMapView?.locationComponentManager?.update()
47
61
  mMapView?.locationComponentManager?.showNativeUserLocation(mEnabled)
48
62
  }
49
63
 
50
- fun setRenderMode(renderMode: RenderMode) {
51
- mRenderMode = renderMode
52
- mMapView?.locationComponentManager?.setRenderMode(renderMode)
64
+ fun applyChanges() {
65
+ mMapView?.locationComponentManager?.let {
66
+ // emulate https://docs.mapbox.com/android/legacy/maps/guides/location-component/
67
+ when (mRenderMode) {
68
+ RenderMode.NORMAL ->
69
+ it.update { it.copy(bearingImage = null, puckBearingSource = null)}
70
+ RenderMode.GPS -> it.update {
71
+ it.copy(bearingImage = AppCompatResources.getDrawable(
72
+ mContext, R.drawable.mapbox_user_bearing_icon
73
+ ), puckBearingSource = PuckBearingSource.COURSE) }
74
+ RenderMode.COMPASS -> it.update{ it.copy(bearingImage= AppCompatResources.getDrawable(
75
+ mContext, R.drawable.mapbox_user_puck_icon
76
+ ), puckBearingSource = PuckBearingSource.HEADING) }
77
+ }
78
+ }
53
79
  }
54
80
  }
@@ -0,0 +1,32 @@
1
+ package com.mapbox.rctmgl.components.location
2
+
3
+ import com.facebook.react.uimanager.ThemedReactContext
4
+ import com.facebook.react.uimanager.ViewGroupManager
5
+ import com.facebook.react.uimanager.annotations.ReactProp
6
+ import com.mapbox.rctmgl.utils.Logger
7
+ import javax.annotation.Nonnull
8
+
9
+ class RCTMGLNativeUserLocationManager : ViewGroupManager<RCTMGLNativeUserLocation>() {
10
+ @Nonnull
11
+ override fun getName(): String {
12
+ return REACT_CLASS
13
+ }
14
+
15
+ @ReactProp(name = "androidRenderMode")
16
+ fun setAndroidRenderMode(userLocation: RCTMGLNativeUserLocation, mode: String) {
17
+ when (mode) {
18
+ "compass" -> userLocation.setAndroidRenderMode(RenderMode.COMPASS);
19
+ "gps" -> userLocation.setAndroidRenderMode(RenderMode.GPS);
20
+ "normal" -> userLocation.setAndroidRenderMode(RenderMode.NORMAL);
21
+ }
22
+ }
23
+
24
+ @Nonnull
25
+ override fun createViewInstance(@Nonnull reactContext: ThemedReactContext): RCTMGLNativeUserLocation {
26
+ return RCTMGLNativeUserLocation(reactContext)
27
+ }
28
+
29
+ companion object {
30
+ const val REACT_CLASS = "RCTMGLNativeUserLocation"
31
+ }
32
+ }
@@ -28,6 +28,7 @@ import com.mapbox.maps.extension.style.layers.properties.generated.ProjectionNam
28
28
  import com.mapbox.maps.extension.style.layers.properties.generated.Visibility
29
29
  import com.mapbox.maps.extension.style.projection.generated.Projection
30
30
  import com.mapbox.maps.extension.style.projection.generated.setProjection
31
+ import com.mapbox.maps.plugin.animation.camera
31
32
  import com.mapbox.maps.plugin.annotation.Annotation
32
33
  import com.mapbox.maps.plugin.annotation.AnnotationConfig
33
34
  import com.mapbox.maps.plugin.annotation.annotations
@@ -38,10 +39,13 @@ import com.mapbox.maps.plugin.compass.compass
38
39
  import com.mapbox.maps.plugin.compass.generated.CompassSettings
39
40
  import com.mapbox.maps.plugin.delegates.listeners.*
40
41
  import com.mapbox.maps.plugin.gestures.*
42
+ import com.mapbox.maps.plugin.locationcomponent.location
43
+ import com.mapbox.maps.plugin.locationcomponent.location2
41
44
  import com.mapbox.maps.plugin.logo.generated.LogoSettings
42
45
  import com.mapbox.maps.plugin.logo.logo
43
46
  import com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings
44
47
  import com.mapbox.maps.plugin.scalebar.scalebar
48
+ import com.mapbox.maps.plugin.viewport.viewport
45
49
  import com.mapbox.rctmgl.R
46
50
  import com.mapbox.rctmgl.components.AbstractMapFeature
47
51
  import com.mapbox.rctmgl.components.annotation.RCTMGLMarkerView
@@ -77,11 +81,64 @@ data class OrnamentSettings(
77
81
  var position: Int = -1
78
82
  )
79
83
 
80
-
81
- interface RCTMGLMapViewLifecycleOwner : LifecycleOwner {
84
+ /***
85
+ * Mapbox's MapView observers lifecycle events see MapboxLifecyclePluginImpl - (ON_START, ON_STOP, ON_DESTROY)
86
+ * We need to emulate those.
87
+ */
88
+ interface RCTMGLLifeCycleOwner : LifecycleOwner {
82
89
  fun handleLifecycleEvent(event: Lifecycle.Event)
83
90
  }
84
91
 
92
+ class RCTMGLLifeCycle {
93
+ private var lifecycleOwner : RCTMGLLifeCycleOwner? = null
94
+
95
+ fun onAttachedToWindow(view: View) {
96
+ if (lifecycleOwner == null) {
97
+ lifecycleOwner = object : RCTMGLLifeCycleOwner {
98
+ private lateinit var lifecycleRegistry: LifecycleRegistry
99
+ init {
100
+ lifecycleRegistry = LifecycleRegistry(this)
101
+ lifecycleRegistry.currentState = Lifecycle.State.CREATED
102
+ }
103
+
104
+ override fun handleLifecycleEvent(event: Lifecycle.Event) {
105
+ try {
106
+ lifecycleRegistry.handleLifecycleEvent(event)
107
+ } catch (e: RuntimeException) {
108
+ Log.e("RCTMGLMapView", "handleLifecycleEvent, handleLifecycleEvent error: $e")
109
+ }
110
+ }
111
+
112
+ override fun getLifecycle(): Lifecycle {
113
+ return lifecycleRegistry
114
+ }
115
+ }
116
+ ViewTreeLifecycleOwner.set(view, lifecycleOwner);
117
+ }
118
+ lifecycleOwner?.handleLifecycleEvent(Lifecycle.Event.ON_START)
119
+ }
120
+
121
+ fun onDetachedFromWindow() {
122
+ if (lifecycleOwner?.lifecycle?.currentState == Lifecycle.State.DESTROYED) {
123
+ return
124
+ }
125
+ lifecycleOwner?.handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event.ON_STOP)
126
+ }
127
+
128
+ fun onDestroy() {
129
+ if (lifecycleOwner?.lifecycle?.currentState == Lifecycle.State.STARTED || lifecycleOwner?.lifecycle?.currentState == Lifecycle.State.RESUMED) {
130
+ lifecycleOwner?.handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event.ON_STOP)
131
+ }
132
+ if (lifecycleOwner?.lifecycle?.currentState != Lifecycle.State.DESTROYED) {
133
+ lifecycleOwner?.handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event.ON_DESTROY)
134
+ }
135
+ }
136
+
137
+ fun getState() : Lifecycle.State {
138
+ return lifecycleOwner?.lifecycle?.currentState ?: Lifecycle.State.INITIALIZED;
139
+ }
140
+ }
141
+
85
142
  open class RCTMGLMapView(private val mContext: Context, var mManager: RCTMGLMapViewManager /*, MapboxMapOptions options*/) : MapView(mContext), OnMapClickListener, OnMapLongClickListener {
86
143
  /**
87
144
  * `PointAnnotations` are rendered to a canvas, but the React Native `Image` component is
@@ -1140,51 +1197,34 @@ open class RCTMGLMapView(private val mContext: Context, var mManager: RCTMGLMapV
1140
1197
  // endregion
1141
1198
 
1142
1199
  // region lifecycle
1143
- private var lifecycleOwner : RCTMGLMapViewLifecycleOwner? = null
1200
+ private val lifecycle : RCTMGLLifeCycle by lazy { RCTMGLLifeCycle() }
1201
+
1202
+ fun getLifecycleState() : Lifecycle.State {
1203
+ return this.lifecycle.getState()
1204
+ }
1144
1205
 
1145
1206
  override fun onDetachedFromWindow() {
1146
- lifecycleOwner?.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE)
1207
+ lifecycle.onDetachedFromWindow()
1147
1208
  super.onDetachedFromWindow();
1148
1209
  }
1149
1210
 
1150
1211
  override fun onDestroy() {
1151
1212
  removeAllFeatures()
1152
1213
  viewAnnotationManager.removeAllViewAnnotations()
1153
- lifecycleOwner?.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
1214
+ mLocationComponentManager?.onDestroy();
1215
+
1216
+ lifecycle.onDestroy()
1154
1217
  super.onDestroy()
1155
1218
  }
1156
1219
 
1157
1220
  fun onDropViewInstance() {
1158
1221
  removeAllFeatures()
1159
1222
  viewAnnotationManager.removeAllViewAnnotations()
1160
- lifecycleOwner?.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
1223
+ lifecycle.onDestroy()
1161
1224
  }
1162
1225
 
1163
1226
  override fun onAttachedToWindow() {
1164
- if (lifecycleOwner == null) {
1165
- lifecycleOwner = object : RCTMGLMapViewLifecycleOwner {
1166
- private lateinit var lifecycleRegistry: LifecycleRegistry
1167
- init {
1168
- lifecycleRegistry = LifecycleRegistry(this)
1169
- lifecycleRegistry.currentState = Lifecycle.State.CREATED
1170
- }
1171
-
1172
- override fun handleLifecycleEvent(event: Lifecycle.Event) {
1173
- try {
1174
- lifecycleRegistry.handleLifecycleEvent(event)
1175
- } catch (e: RuntimeException) {
1176
- Log.e("RCTMGLMapView", "onAttachedToWindow error: $e")
1177
- }
1178
- }
1179
-
1180
- override fun getLifecycle(): Lifecycle {
1181
- return lifecycleRegistry
1182
- }
1183
- }
1184
- ViewTreeLifecycleOwner.set(this, lifecycleOwner);
1185
- } else {
1186
- lifecycleOwner?.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
1187
- }
1227
+ lifecycle.onAttachedToWindow(this)
1188
1228
  super.onAttachedToWindow()
1189
1229
  }
1190
1230