@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
@@ -3,8 +3,6 @@ package com.mapbox.rctmgl.location
3
3
  import android.annotation.SuppressLint
4
4
  import android.content.Context
5
5
  import android.location.Location
6
- //import com.mapbox.maps.plugin.locationcomponent.LocationConsumer.onLocationUpdated
7
- //import com.mapbox.maps.plugin.locationcomponent.LocationConsumer.onBearingUpdated
8
6
  import com.mapbox.android.core.location.LocationEngine
9
7
  import com.mapbox.android.core.location.LocationEngineCallback
10
8
  import com.mapbox.android.core.location.LocationEngineResult
@@ -20,9 +18,52 @@ import java.lang.ref.WeakReference
20
18
  import java.util.ArrayList
21
19
  import kotlin.Exception
22
20
 
23
- internal class LocationProviderForEngine(var mEngine: LocationEngine?) : LocationProvider, LocationEngineCallback<LocationEngineResult> {
21
+
22
+ open class SingletonHolder<out T, in A>(creator: (A) -> T) {
23
+ private var creator: ((A) -> T)? = creator
24
+ @Volatile private var instance: T? = null
25
+
26
+ fun getInstance(arg: A): T {
27
+ val i = instance
28
+ if (i != null) {
29
+ return i
30
+ }
31
+
32
+ return synchronized(this) {
33
+ val i2 = instance
34
+ if (i2 != null) {
35
+ i2
36
+ } else {
37
+ val created = creator!!(arg)
38
+ instance = created
39
+ creator = null
40
+ created
41
+ }
42
+ }
43
+ }
44
+ }
45
+
46
+ internal class LocationProviderForEngine(var mEngine: LocationEngine?, val context: Context) : LocationProvider, LocationEngineCallback<LocationEngineResult> {
24
47
  var mConsumers = ArrayList<LocationConsumer>()
25
- fun beforeAddingFirstConsumer() {}
48
+ @SuppressLint("MissingPermission")
49
+ fun beforeAddingFirstConsumer() {
50
+ val request = LocationEngineRequest.Builder(LocationManager.DEFAULT_INTERVAL_MILLIS
51
+ )
52
+ .setFastestInterval(LocationManager.DEFAULT_FASTEST_INTERVAL_MILLIS)
53
+ .setPriority(LocationEngineRequest.PRIORITY_HIGH_ACCURACY)
54
+ .build();
55
+
56
+ if (!PermissionsManager.areLocationPermissionsGranted(context)) {
57
+ return
58
+ }
59
+
60
+ mEngine?.requestLocationUpdates(
61
+ request,
62
+ this,
63
+ Looper.getMainLooper()
64
+ )
65
+
66
+ }
26
67
  fun afterRemovedLastConsumer() {}
27
68
  @SuppressLint("MissingPermission")
28
69
  override fun registerLocationConsumer(locationConsumer: LocationConsumer) {
@@ -66,25 +107,29 @@ class LocationManager private constructor(private val context: Context) : Locati
66
107
  private var isActive = false
67
108
  private var lastLocation: Location? = null
68
109
  private var locationEngineRequest: LocationEngineRequest? = null
69
- private var locationProvider: LocationProviderForEngine? = null
70
- private var nStarts : Int = 0;
71
- private var isPaused : Boolean = false;
72
-
110
+ private var locationProvider: LocationProvider? = null
111
+ private var nStarts : Int = 0
112
+ private var isPaused : Boolean = false
73
113
 
74
-
75
- val provider: LocationProvider
114
+ var provider: LocationProvider
76
115
  get() {
77
- if (locationProvider == null) {
78
- locationProvider = LocationProviderForEngine(engine)
116
+ var ret = locationProvider
117
+ if (ret == null) {
118
+ val engine = LocationProviderForEngine(engine, context)
119
+ locationProvider = engine
120
+ return engine
121
+ } else {
122
+ return ret
79
123
  }
80
- return locationProvider!!
124
+ }
125
+ set(value) {
126
+ locationProvider = value
81
127
  }
82
128
 
83
129
  interface OnUserLocationChange {
84
130
  fun onLocationChange(location: Location?)
85
131
  }
86
132
 
87
-
88
133
  /// public interface
89
134
 
90
135
  fun startCounted() {
@@ -228,23 +273,17 @@ class LocationManager private constructor(private val context: Context) : Locati
228
273
 
229
274
  override fun onSuccess(result: LocationEngineResult?) {
230
275
  onLocationChanged(result?.lastLocation)
231
- if (locationProvider != null) {
232
- locationProvider!!.onSuccess(result)
276
+ val provider = locationProvider
277
+ if (provider != null && provider is LocationProviderForEngine) {
278
+ provider.onSuccess(result)
233
279
  }
234
280
  }
235
281
 
236
- companion object {
282
+ companion object : SingletonHolder<LocationManager, Context>(::LocationManager) {
237
283
  const val DEFAULT_FASTEST_INTERVAL_MILLIS: Long = 1000
238
284
  const val DEFAULT_INTERVAL_MILLIS: Long = 1000
239
285
  const val LOG_TAG = "LocationManager"
240
- private var INSTANCE: WeakReference<LocationManager>? = null
241
- @JvmStatic
242
- fun getInstance(context: Context): LocationManager? {
243
- if (INSTANCE == null) {
244
- INSTANCE = WeakReference(LocationManager(context))
245
- }
246
- return INSTANCE!!.get()
247
- }
286
+
248
287
  }
249
288
 
250
289
  init {
@@ -55,6 +55,7 @@ class MGLModule : NSObject {
55
55
  "WillStartLoadingMap": RCTMGLEvent.EventType.willStartLoadingMap.rawValue,
56
56
  "DidFinishLoadingStyle": RCTMGLEvent.EventType.didFinishLoadingStyle.rawValue,
57
57
  "DidFinishLoadingMap": RCTMGLEvent.EventType.didFinishLoadingMap.rawValue,
58
+ "MapLoadingError": RCTMGLEvent.EventType.mapLoadingError.rawValue,
58
59
  "DidFinishRenderingFrameFully": RCTMGLEvent.EventType.didFinishRenderingFully.rawValue,
59
60
  "DidFinishRenderingFrame": RCTMGLEvent.EventType.didFinishRendering.rawValue,
60
61
  ],
@@ -56,6 +56,7 @@ class RCTMGLAtmosphere : RCTMGLSingletonLayer, RCTMGLMapComponent, RCTMGLSourceC
56
56
  styler.atmosphereLayer(
57
57
  layer: &atmosphere,
58
58
  reactStyle: reactStyle,
59
+ oldReactStyle: oldReactStyle,
59
60
  applyUpdater: { (updater) in fatalError("Atmosphere: TODO - implement apply updater")},
60
61
  isValid: { fatalError("Atmosphere: TODO - no isValid") }
61
62
  )
@@ -33,6 +33,7 @@ class RCTMGLBackgroundLayer: RCTMGLLayer {
33
33
  styler.backgroundLayer(
34
34
  layer: &styleLayer,
35
35
  reactStyle: reactStyle,
36
+ oldReactStyle: oldReatStyle,
36
37
  applyUpdater: { (updater) in logged("RCTMGLBackgroundLayer.addStyles") {
37
38
  try style.updateLayer(withId: self.id, type: LayerType.self) { (layer: inout LayerType) in updater(&layer) }
38
39
  }},
@@ -34,6 +34,7 @@ class RCTMGLCircleLayer: RCTMGLVectorLayer {
34
34
  styler.circleLayer(
35
35
  layer: &styleLayer,
36
36
  reactStyle: reactStyle,
37
+ oldReactStyle: oldReatStyle,
37
38
  applyUpdater: { (updater) in logged("RCTMGLCircleLayer.updateLayer") {
38
39
  try style.updateLayer(withId: self.id, type: LayerType.self) { (layer: inout LayerType) in updater(&layer) }
39
40
  }},
@@ -28,6 +28,7 @@ class RCTMGLEvent : NSObject, RCTMGLEventProtocol {
28
28
  case mapIdle
29
29
  case imageMissing
30
30
  case didFinishLoadingMap
31
+ case mapLoadingError
31
32
  case didFinishRenderingFully
32
33
  case didFinishRendering
33
34
  case didFinishLoadingStyle
@@ -33,6 +33,7 @@ class RCTMGLFillExtrusionLayer: RCTMGLVectorLayer {
33
33
  styler.fillExtrusionLayer(
34
34
  layer: &styleLayer,
35
35
  reactStyle: reactStyle,
36
+ oldReactStyle: oldReatStyle,
36
37
  applyUpdater: { (updater) in logged("RCTMGLFillExtrusionLayer.updateLayer") {
37
38
  try style.updateLayer(withId: self.id, type: LayerType.self) { (layer: inout LayerType) in updater(&layer) }
38
39
  }},
@@ -35,6 +35,7 @@ class RCTMGLFillLayer: RCTMGLVectorLayer {
35
35
  styler.fillLayer(
36
36
  layer: &styleLayer,
37
37
  reactStyle: reactStyle,
38
+ oldReactStyle: oldReatStyle,
38
39
  applyUpdater: { (updater) in logged("RCTMGLFillLayer.updateLayer") {
39
40
  try style.updateLayer(withId: self.id, type: LayerType.self) { (layer: inout FillLayer) in updater(&layer) }
40
41
  }},
@@ -35,6 +35,7 @@ class RCTMGLHeatmapLayer: RCTMGLVectorLayer {
35
35
  styler.heatmapLayer(
36
36
  layer: &styleLayer,
37
37
  reactStyle: reactStyle,
38
+ oldReactStyle: oldReatStyle,
38
39
  applyUpdater: { (updater) in logged("RCTMGLHeatmapLayer.updateLayer") {
39
40
  try style.updateLayer(withId: self.id, type: LayerType.self) { (layer: inout HeatmapLayer) in updater(&layer) }
40
41
  }},
@@ -13,7 +13,11 @@ class RCTMGLLayer : UIView, RCTMGLMapComponent, RCTMGLSourceConsumer {
13
13
  didSet { self.optionsChanged() }
14
14
  }
15
15
 
16
+ var oldReatStyle: Dictionary<String, Any>? = nil
16
17
  @objc var reactStyle : Dictionary<String, Any>? = nil {
18
+ willSet {
19
+ oldReatStyle = reactStyle
20
+ }
17
21
  didSet {
18
22
  DispatchQueue.main.async {
19
23
  self.addStylesAndUpdate()
@@ -4,7 +4,11 @@ import MapboxMaps
4
4
  class RCTMGLLight: UIView, RCTMGLMapComponent {
5
5
  weak var bridge : RCTBridge! = nil
6
6
  weak var map: MapboxMap! = nil
7
+ var oldReactStyle: [String:Any]?
7
8
  @objc var reactStyle : [String:Any]! = nil {
9
+ willSet {
10
+ oldReactStyle = reactStyle
11
+ }
8
12
  didSet {
9
13
  if map != nil {
10
14
  addStyles()
@@ -13,17 +17,15 @@ class RCTMGLLight: UIView, RCTMGLMapComponent {
13
17
  }
14
18
 
15
19
  func apply(light: Light) {
16
- self.map.style
17
20
  let lightData = try! JSONEncoder().encode(light)
18
21
  let lightDictionary = try! JSONSerialization.jsonObject(with: lightData)
19
- print("=> lightDictionary \(lightDictionary)")
20
22
  try! self.map.style.setLight(properties: lightDictionary as! [String:Any])
21
23
  }
22
24
 
23
25
  func addStyles() {
24
26
  var light = Light()
25
27
  let style = RCTMGLStyle(style: map.style)
26
- style.lightLayer(layer: &light, reactStyle: reactStyle, applyUpdater: { (updater) in
28
+ style.lightLayer(layer: &light, reactStyle: reactStyle, oldReactStyle: oldReactStyle, applyUpdater: { (updater) in
27
29
  updater(&light)
28
30
  self.apply(light: light)
29
31
  }, isValid: {
@@ -37,6 +37,7 @@ class RCTMGLLineLayer: RCTMGLVectorLayer {
37
37
  styler.lineLayer(
38
38
  layer: &styleLayer,
39
39
  reactStyle: reactStyle,
40
+ oldReactStyle: oldReatStyle,
40
41
  applyUpdater: { (updater) in logged("RCTMGLLineLayer.updateLayer") {
41
42
  try style.updateLayer(withId: self.id, type: LayerType.self) { (layer: inout LayerType) in updater(&layer) }
42
43
  }},
@@ -12,5 +12,9 @@ RCT_EXTERN_METHOD(getLastKnownLocation)
12
12
  RCT_EXTERN_METHOD(setMinDisplacement:(CLLocationDistance)minDisplacement)
13
13
  RCT_EXTERN_METHOD(setRequestsAlwaysUse:(BOOL)requestsAlwaysUse)
14
14
 
15
+ RCT_EXTERN_METHOD(setLocationEventThrottle:(NSNumber *)throttleValue)
16
+
17
+ RCT_EXTERN_METHOD(simulateHeading:(nonnull NSNumber)changesPerSecond increment:(nonnull NSNumber))
18
+
15
19
 
16
20
  @end
@@ -57,6 +57,10 @@ class RCTMGLLocationManager : LocationProviderDelegate {
57
57
  weak var delegate: RCTMGLLocationManagerDelegate?
58
58
  weak var locationProviderDelage: LocationProviderDelegate?
59
59
 
60
+ var headingSimulator: Timer? = nil
61
+ var simulatedHeading: Double = 0.0
62
+ var simulatedHeadingIncrement: Double = 1.0
63
+
60
64
  init() {
61
65
  provider = AppleLocationProvider()
62
66
  provider.setDelegate(self)
@@ -219,6 +223,54 @@ extension RCTMGLLocationManager: LocationProvider {
219
223
  }
220
224
  }
221
225
 
226
+ // MARK: heading simulation
227
+
228
+ final public class SimulatedHeading: CLHeading {
229
+ init(trueHeading: CLLocationDirection, timestamp: Date) {
230
+ _trueHeading = trueHeading
231
+ _timestamp = timestamp
232
+ super.init()
233
+ }
234
+
235
+ required init?(coder: NSCoder) {
236
+ fatalError("init(coder:) has not been implemented")
237
+ }
238
+
239
+ private var _trueHeading: CLLocationDirection = 0
240
+ private var _timestamp: Date
241
+
242
+ public override var trueHeading: CLLocationDirection {
243
+ get { _trueHeading }
244
+ set { _trueHeading = newValue }
245
+ }
246
+
247
+ public override var timestamp: Date{
248
+ get { _timestamp }
249
+ set { _timestamp = newValue }
250
+ }
251
+ }
252
+
253
+ extension RCTMGLLocationManager {
254
+ func simulateHeading(changesPerSecond: Int, increment: Double) {
255
+ self.simulatedHeadingIncrement = increment
256
+ DispatchQueue.main.async {
257
+ if let headingSimulator = self.headingSimulator {
258
+ headingSimulator.invalidate()
259
+ }
260
+ self.headingSimulator = nil
261
+
262
+ if (changesPerSecond > 0) {
263
+ self.headingSimulator = Timer.scheduledTimer(withTimeInterval: 1.0/Double(changesPerSecond), repeats: true) { [weak self] (_) in
264
+ guard let self = self else { return }
265
+
266
+ self.simulatedHeading = (self.simulatedHeading + self.simulatedHeadingIncrement).truncatingRemainder(dividingBy: 360.0)
267
+ self.locationProvider(self.provider, didUpdateHeading: SimulatedHeading(trueHeading: self.simulatedHeading, timestamp: Date()) )
268
+ }
269
+ }
270
+ }
271
+ }
272
+ }
273
+
222
274
 
223
275
  @objc(RCTMGLLocationModule)
224
276
  class RCTMGLLocationModule: RCTEventEmitter, RCTMGLLocationManagerDelegate {
@@ -234,6 +286,14 @@ class RCTMGLLocationModule: RCTEventEmitter, RCTMGLLocationManagerDelegate {
234
286
  }
235
287
  }
236
288
 
289
+ var locationEventThrottle : (
290
+ waitBetweenEvents: Double?,
291
+ lastSentTimestamp: Double?
292
+ ) = (
293
+ nil,
294
+ nil
295
+ )
296
+
237
297
  override init() {
238
298
  locationManager = RCTMGLLocationManager()
239
299
  super.init()
@@ -277,6 +337,10 @@ class RCTMGLLocationModule: RCTEventEmitter, RCTMGLLocationManagerDelegate {
277
337
  locationManager.setRequestsAlwaysUse(requestsAlwaysUse);
278
338
  }
279
339
 
340
+ @objc func simulateHeading(_ changesPerSecond: NSNumber, increment: NSNumber) {
341
+ locationManager.simulateHeading(changesPerSecond: changesPerSecond.intValue, increment: increment.doubleValue)
342
+ }
343
+
280
344
  @objc
281
345
  override func startObserving() {
282
346
  super.startObserving()
@@ -290,14 +354,46 @@ class RCTMGLLocationModule: RCTEventEmitter, RCTMGLLocationManagerDelegate {
290
354
  }
291
355
 
292
356
  func locationManager(_ locationManager: RCTMGLLocationManager, didUpdateLocation location: RCTMGLLocation) {
293
- guard hasListener else {
357
+ guard hasListener, let _ = bridge else {
294
358
  return
295
359
  }
296
-
297
- guard let _ = bridge else {
298
- return
360
+
361
+ if shouldSendLocationEvent() {
362
+ self.sendEvent(withName: RCT_MAPBOX_USER_LOCATION_UPDATE, body: location.toJSON())
363
+ }
364
+ }
365
+
366
+ // MARK: - location event throttle
367
+ @objc
368
+ func setLocationEventThrottle(_ throttleValue:NSNumber) {
369
+ let throttleValue = throttleValue.doubleValue
370
+ if throttleValue > 0.0 {
371
+ locationEventThrottle.waitBetweenEvents = throttleValue
372
+ } else {
373
+ locationEventThrottle.waitBetweenEvents = nil
299
374
  }
375
+ }
300
376
 
301
- self.sendEvent(withName: RCT_MAPBOX_USER_LOCATION_UPDATE, body: location.toJSON())
377
+ func shouldSendLocationEvent() -> Bool {
378
+ guard let waitBetweenEvents = locationEventThrottle.waitBetweenEvents, waitBetweenEvents > 0 else {
379
+ return true
380
+ }
381
+
382
+ let currentTimestamp: Double = CACurrentMediaTime() * 1000.0
383
+
384
+ guard let lastSentTimestamp = locationEventThrottle.lastSentTimestamp else {
385
+ locationEventThrottle.lastSentTimestamp = currentTimestamp
386
+ return true;
387
+ }
388
+
389
+ if (currentTimestamp - lastSentTimestamp > waitBetweenEvents) {
390
+ locationEventThrottle.lastSentTimestamp = currentTimestamp
391
+ return true;
392
+ }
393
+
394
+ return false;
302
395
  }
396
+
303
397
  }
398
+
399
+
@@ -445,8 +445,21 @@ extension RCTMGLMapView {
445
445
  }
446
446
 
447
447
  public func setupEvents() {
448
- self.onEvery(event: .mapLoadingError, handler: {(self, event) in
449
- if let message = event.payload.error.errorDescription {
448
+ self.onEvery(event: .mapLoadingError, handler: { (self, event) in
449
+ let eventPayload : MapLoadingErrorPayload = event.payload
450
+ var payload : [String:String] = [
451
+ "error": eventPayload.error.errorDescription ?? eventPayload.error.localizedDescription
452
+ ]
453
+ if let tileId = eventPayload.tileId {
454
+ payload["tileId"] = "x:\(tileId.x) y:\(tileId.y) z:\(tileId.z)"
455
+ }
456
+ if let sourceId = eventPayload.sourceId {
457
+ payload["sourceId"] = sourceId
458
+ }
459
+ let rctmglEvent = RCTMGLEvent(type: .mapLoadingError, payload: payload);
460
+ self.fireEvent(event: rctmglEvent, callback: self.reactOnMapChange)
461
+
462
+ if let message = eventPayload.error.errorDescription {
450
463
  Logger.log(level: .error, message: "MapLoad error \(message)")
451
464
  } else {
452
465
  Logger.log(level: .error, message: "MapLoad error \(event)")
@@ -29,6 +29,7 @@ class RCTMGLRasterLayer: RCTMGLLayer {
29
29
  styler.rasterLayer(
30
30
  layer: &styleLayer,
31
31
  reactStyle: reactStyle,
32
+ oldReactStyle: oldReatStyle,
32
33
  applyUpdater:{ (updater) in logged("RCTMGLRasterLayer.updateLayer") {
33
34
  try style.updateLayer(withId: self.id, type: LayerType.self) { (layer: inout LayerType) in updater(&layer) }
34
35
  }},
@@ -7,7 +7,11 @@ class RCTMGLSingletonLayer : UIView {
7
7
  weak var map : RCTMGLMapView? = nil
8
8
  var style: Style? = nil
9
9
 
10
+ var oldReactStyle: [String:Any]?
10
11
  @objc var reactStyle : Dictionary<String, Any>? = nil {
12
+ willSet {
13
+ oldReactStyle = reactStyle
14
+ }
11
15
  didSet {
12
16
  DispatchQueue.main.async {
13
17
  self.addStylesAndUpdate()
@@ -32,6 +32,7 @@ class RCTMGLSkyLayer: RCTMGLLayer {
32
32
  styler.skyLayer(
33
33
  layer: &styleLayer,
34
34
  reactStyle: reactStyle,
35
+ oldReactStyle: oldReatStyle,
35
36
  applyUpdater: { (updater) in logged("RCTMGLSkyLayer.addStyles") {
36
37
  try style.updateLayer(withId: self.id, type: LayerType.self) { (layer: inout LayerType) in updater(&layer) }
37
38
  }},