react-native-nitro-geolocation 1.1.4 → 1.2.0

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 (186) hide show
  1. package/README.md +74 -8
  2. package/android/build.gradle +6 -0
  3. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidAccuracy.kt +105 -0
  4. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidHeadingManager.kt +313 -0
  5. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidLocationSettings.kt +313 -0
  6. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/GetCurrentPosition.kt +46 -45
  7. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/LocationMetadata.kt +26 -0
  8. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/LocationValues.kt +31 -0
  9. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/NitroGeolocation.kt +1025 -140
  10. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/NitroGeolocationCompat.kt +11 -11
  11. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/RequestAuthorization.kt +6 -6
  12. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/WatchPosition.kt +46 -45
  13. package/ios/CLLocation+GeolocationMetadata.swift +32 -0
  14. package/ios/LocationManager.swift +205 -51
  15. package/ios/NitroGeolocation.swift +949 -110
  16. package/ios/NitroGeolocationCompat.swift +7 -7
  17. package/nitrogen/generated/android/c++/JAccuracyAuthorization.hpp +61 -0
  18. package/nitrogen/generated/android/c++/JAndroidAccuracyPreset.hpp +64 -0
  19. package/nitrogen/generated/android/c++/JAndroidGranularity.hpp +61 -0
  20. package/nitrogen/generated/android/c++/{JRNConfigurationInternal.hpp → JCompatGeolocationConfigurationInternal.hpp} +10 -10
  21. package/nitrogen/generated/android/c++/{JGeolocationError.hpp → JCompatGeolocationError.hpp} +10 -10
  22. package/nitrogen/generated/android/c++/JCompatGeolocationOptions.hpp +105 -0
  23. package/nitrogen/generated/android/c++/JCompatGeolocationResponse.hpp +67 -0
  24. package/nitrogen/generated/android/c++/JFunc_void_AccuracyAuthorization.hpp +77 -0
  25. package/nitrogen/generated/android/c++/JFunc_void_CompatGeolocationError.hpp +78 -0
  26. package/nitrogen/generated/android/c++/JFunc_void_CompatGeolocationResponse.hpp +84 -0
  27. package/nitrogen/generated/android/c++/JFunc_void_GeolocationResponse.hpp +2 -0
  28. package/nitrogen/generated/android/c++/JFunc_void_Heading.hpp +78 -0
  29. package/nitrogen/generated/android/c++/JFunc_void_LocationProviderStatus.hpp +78 -0
  30. package/nitrogen/generated/android/c++/JFunc_void_PermissionStatus.hpp +77 -0
  31. package/nitrogen/generated/android/c++/JFunc_void_std__vector_GeocodedLocation_.hpp +97 -0
  32. package/nitrogen/generated/android/c++/JFunc_void_std__vector_ReverseGeocodedAddress_.hpp +98 -0
  33. package/nitrogen/generated/android/c++/JGeocodedLocation.hpp +65 -0
  34. package/nitrogen/generated/android/c++/JGeocodingCoordinates.hpp +61 -0
  35. package/nitrogen/generated/android/c++/{JModernGeolocationConfiguration.hpp → JGeolocationConfiguration.hpp} +10 -10
  36. package/nitrogen/generated/android/c++/JGeolocationResponse.hpp +13 -3
  37. package/nitrogen/generated/android/c++/JHeading.hpp +69 -0
  38. package/nitrogen/generated/android/c++/JHeadingOptions.hpp +57 -0
  39. package/nitrogen/generated/android/c++/JHybridNitroGeolocationCompatSpec.cpp +46 -30
  40. package/nitrogen/generated/android/c++/JHybridNitroGeolocationCompatSpec.hpp +4 -4
  41. package/nitrogen/generated/android/c++/JHybridNitroGeolocationSpec.cpp +169 -33
  42. package/nitrogen/generated/android/c++/JHybridNitroGeolocationSpec.hpp +14 -3
  43. package/nitrogen/generated/android/c++/JIOSAccuracyPreset.hpp +73 -0
  44. package/nitrogen/generated/android/c++/JIOSActivityType.hpp +67 -0
  45. package/nitrogen/generated/android/c++/JLocationAccuracyOptions.hpp +65 -0
  46. package/nitrogen/generated/android/c++/JLocationAvailability.hpp +62 -0
  47. package/nitrogen/generated/android/c++/JLocationProviderStatus.hpp +77 -0
  48. package/nitrogen/generated/android/c++/JLocationProviderUsed.hpp +67 -0
  49. package/nitrogen/generated/android/c++/JLocationRequestOptions.hpp +49 -3
  50. package/nitrogen/generated/android/c++/{JGeolocationOptions.hpp → JLocationSettingsOptions.hpp} +28 -22
  51. package/nitrogen/generated/android/c++/JReverseGeocodedAddress.hpp +82 -0
  52. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/AccuracyAuthorization.kt +24 -0
  53. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/AndroidAccuracyPreset.kt +25 -0
  54. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/AndroidGranularity.kt +24 -0
  55. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/{RNConfigurationInternal.kt → CompatGeolocationConfigurationInternal.kt} +5 -5
  56. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/{GeolocationError.kt → CompatGeolocationError.kt} +5 -5
  57. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/CompatGeolocationOptions.kt +68 -0
  58. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/CompatGeolocationResponse.kt +41 -0
  59. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Func_void_AccuracyAuthorization.kt +80 -0
  60. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/{Func_void_GeolocationError.kt → Func_void_CompatGeolocationError.kt} +9 -9
  61. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Func_void_CompatGeolocationResponse.kt +80 -0
  62. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Func_void_Heading.kt +80 -0
  63. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Func_void_LocationProviderStatus.kt +80 -0
  64. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Func_void_PermissionStatus.kt +80 -0
  65. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Func_void_std__vector_GeocodedLocation_.kt +80 -0
  66. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Func_void_std__vector_ReverseGeocodedAddress_.kt +80 -0
  67. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/GeocodedLocation.kt +44 -0
  68. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/GeocodingCoordinates.kt +41 -0
  69. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/{ModernGeolocationConfiguration.kt → GeolocationConfiguration.kt} +5 -5
  70. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/GeolocationResponse.kt +9 -3
  71. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Heading.kt +47 -0
  72. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/HeadingOptions.kt +38 -0
  73. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/HybridNitroGeolocationCompatSpec.kt +7 -7
  74. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/HybridNitroGeolocationSpec.kt +92 -3
  75. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/IOSAccuracyPreset.kt +28 -0
  76. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/IOSActivityType.kt +26 -0
  77. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/LocationAccuracyOptions.kt +41 -0
  78. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/LocationAvailability.kt +41 -0
  79. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/LocationProviderStatus.kt +53 -0
  80. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/LocationProviderUsed.kt +26 -0
  81. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/LocationRequestOptions.kt +30 -3
  82. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/{GeolocationOptions.kt → LocationSettingsOptions.kt} +11 -11
  83. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/ReverseGeocodedAddress.kt +56 -0
  84. package/nitrogen/generated/android/nitrogeolocationOnLoad.cpp +18 -4
  85. package/nitrogen/generated/ios/NitroGeolocation-Swift-Cxx-Bridge.cpp +76 -12
  86. package/nitrogen/generated/ios/NitroGeolocation-Swift-Cxx-Bridge.hpp +519 -77
  87. package/nitrogen/generated/ios/NitroGeolocation-Swift-Cxx-Umbrella.hpp +61 -12
  88. package/nitrogen/generated/ios/c++/HybridNitroGeolocationCompatSpecSwift.hpp +28 -16
  89. package/nitrogen/generated/ios/c++/HybridNitroGeolocationSpecSwift.hpp +131 -13
  90. package/nitrogen/generated/ios/swift/AccuracyAuthorization.swift +44 -0
  91. package/nitrogen/generated/ios/swift/AndroidAccuracyPreset.swift +48 -0
  92. package/nitrogen/generated/ios/swift/AndroidGranularity.swift +44 -0
  93. package/nitrogen/generated/ios/swift/{RNConfigurationInternal.swift → CompatGeolocationConfigurationInternal.swift} +5 -5
  94. package/nitrogen/generated/ios/swift/{GeolocationError.swift → CompatGeolocationError.swift} +5 -5
  95. package/nitrogen/generated/ios/swift/CompatGeolocationOptions.swift +208 -0
  96. package/nitrogen/generated/ios/swift/CompatGeolocationResponse.swift +34 -0
  97. package/nitrogen/generated/ios/swift/Func_void_AccuracyAuthorization.swift +46 -0
  98. package/nitrogen/generated/ios/swift/Func_void_CompatGeolocationError.swift +46 -0
  99. package/nitrogen/generated/ios/swift/Func_void_CompatGeolocationResponse.swift +46 -0
  100. package/nitrogen/generated/ios/swift/{Func_void_GeolocationError.swift → Func_void_Heading.swift} +11 -11
  101. package/nitrogen/generated/ios/swift/Func_void_LocationAvailability.swift +46 -0
  102. package/nitrogen/generated/ios/swift/Func_void_LocationProviderStatus.swift +46 -0
  103. package/nitrogen/generated/ios/swift/Func_void_bool.swift +46 -0
  104. package/nitrogen/generated/ios/swift/Func_void_std__vector_GeocodedLocation_.swift +46 -0
  105. package/nitrogen/generated/ios/swift/Func_void_std__vector_ReverseGeocodedAddress_.swift +46 -0
  106. package/nitrogen/generated/ios/swift/GeocodedLocation.swift +52 -0
  107. package/nitrogen/generated/ios/swift/GeocodingCoordinates.swift +34 -0
  108. package/nitrogen/generated/ios/swift/{ModernGeolocationConfiguration.swift → GeolocationConfiguration.swift} +5 -5
  109. package/nitrogen/generated/ios/swift/GeolocationResponse.swift +31 -2
  110. package/nitrogen/generated/ios/swift/Heading.swift +70 -0
  111. package/nitrogen/generated/ios/swift/HeadingOptions.swift +42 -0
  112. package/nitrogen/generated/ios/swift/HybridNitroGeolocationCompatSpec.swift +4 -4
  113. package/nitrogen/generated/ios/swift/HybridNitroGeolocationCompatSpec_cxx.swift +28 -28
  114. package/nitrogen/generated/ios/swift/HybridNitroGeolocationSpec.swift +14 -3
  115. package/nitrogen/generated/ios/swift/HybridNitroGeolocationSpec_cxx.swift +318 -15
  116. package/nitrogen/generated/ios/swift/IOSAccuracyPreset.swift +60 -0
  117. package/nitrogen/generated/ios/swift/IOSActivityType.swift +52 -0
  118. package/nitrogen/generated/ios/swift/LocationAccuracyOptions.swift +46 -0
  119. package/nitrogen/generated/ios/swift/LocationAvailability.swift +47 -0
  120. package/nitrogen/generated/ios/swift/LocationProviderStatus.swift +106 -0
  121. package/nitrogen/generated/ios/swift/LocationProviderUsed.swift +52 -0
  122. package/nitrogen/generated/ios/swift/LocationRequestOptions.swift +142 -1
  123. package/nitrogen/generated/ios/swift/{GeolocationOptions.swift → LocationSettingsOptions.swift} +39 -46
  124. package/nitrogen/generated/ios/swift/ReverseGeocodedAddress.swift +150 -0
  125. package/nitrogen/generated/shared/c++/AccuracyAuthorization.hpp +80 -0
  126. package/nitrogen/generated/shared/c++/AndroidAccuracyPreset.hpp +84 -0
  127. package/nitrogen/generated/shared/c++/AndroidGranularity.hpp +80 -0
  128. package/nitrogen/generated/shared/c++/{RNConfigurationInternal.hpp → CompatGeolocationConfigurationInternal.hpp} +11 -11
  129. package/nitrogen/generated/shared/c++/{GeolocationError.hpp → CompatGeolocationError.hpp} +11 -11
  130. package/nitrogen/generated/shared/c++/CompatGeolocationOptions.hpp +128 -0
  131. package/nitrogen/generated/shared/c++/CompatGeolocationResponse.hpp +88 -0
  132. package/nitrogen/generated/shared/c++/GeocodedLocation.hpp +91 -0
  133. package/nitrogen/generated/shared/c++/GeocodingCoordinates.hpp +87 -0
  134. package/nitrogen/generated/shared/c++/{ModernGeolocationConfiguration.hpp → GeolocationConfiguration.hpp} +11 -11
  135. package/nitrogen/generated/shared/c++/GeolocationResponse.hpp +14 -2
  136. package/nitrogen/generated/shared/c++/Heading.hpp +95 -0
  137. package/nitrogen/generated/shared/c++/HeadingOptions.hpp +83 -0
  138. package/nitrogen/generated/shared/c++/HybridNitroGeolocationCompatSpec.hpp +16 -16
  139. package/nitrogen/generated/shared/c++/HybridNitroGeolocationSpec.cpp +11 -0
  140. package/nitrogen/generated/shared/c++/HybridNitroGeolocationSpec.hpp +51 -12
  141. package/nitrogen/generated/shared/c++/IOSAccuracyPreset.hpp +96 -0
  142. package/nitrogen/generated/shared/c++/IOSActivityType.hpp +88 -0
  143. package/nitrogen/generated/shared/c++/LocationAccuracyOptions.hpp +92 -0
  144. package/nitrogen/generated/shared/c++/LocationAvailability.hpp +88 -0
  145. package/nitrogen/generated/shared/c++/LocationProviderStatus.hpp +103 -0
  146. package/nitrogen/generated/shared/c++/LocationProviderUsed.hpp +88 -0
  147. package/nitrogen/generated/shared/c++/LocationRequestOptions.hpp +47 -3
  148. package/nitrogen/generated/shared/c++/{GeolocationOptions.hpp → LocationSettingsOptions.hpp} +26 -24
  149. package/nitrogen/generated/shared/c++/ReverseGeocodedAddress.hpp +108 -0
  150. package/package.json +1 -1
  151. package/src/NitroGeolocation.nitro.ts +291 -17
  152. package/src/NitroGeolocationCompat.nitro.ts +12 -12
  153. package/src/api/geocode.ts +18 -0
  154. package/src/api/getAccuracyAuthorization.ts +12 -0
  155. package/src/api/getCurrentPosition.ts +5 -3
  156. package/src/api/getHeading.ts +13 -0
  157. package/src/api/getLastKnownPosition.ts +28 -0
  158. package/src/api/getLocationAvailability.ts +11 -0
  159. package/src/api/getProviderStatus.ts +16 -0
  160. package/src/api/hasServicesEnabled.ts +13 -0
  161. package/src/api/index.ts +11 -0
  162. package/src/api/requestLocationSettings.ts +29 -0
  163. package/src/api/requestPermission.ts +3 -1
  164. package/src/api/requestTemporaryFullAccuracy.ts +21 -0
  165. package/src/api/reverseGeocode.ts +23 -0
  166. package/src/api/setConfiguration.ts +8 -4
  167. package/src/api/watchHeading.ts +19 -0
  168. package/src/api/watchPosition.ts +2 -2
  169. package/src/compat/getCurrentPosition.ts +7 -7
  170. package/src/compat/index.tsx +5 -5
  171. package/src/compat/requestAuthorization.ts +2 -2
  172. package/src/compat/setRNConfiguration.ts +7 -5
  173. package/src/compat/watchPosition.ts +7 -7
  174. package/src/devtools/getCurrentPosition.ts +5 -3
  175. package/src/devtools/index.ts +1 -1
  176. package/src/devtools/watchPosition.ts +6 -7
  177. package/src/hooks/useWatchPosition.ts +2 -2
  178. package/src/index.tsx +35 -6
  179. package/src/publicTypes.ts +96 -0
  180. package/src/types.ts +113 -37
  181. package/src/utils/errors.test.ts +65 -0
  182. package/src/utils/errors.ts +45 -18
  183. package/src/utils/index.ts +2 -2
  184. package/src/utils/provider.test.ts +172 -1
  185. package/src/utils/provider.ts +50 -5
  186. package/nitrogen/generated/android/c++/JFunc_void_GeolocationError.hpp +0 -78
@@ -11,15 +11,15 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
11
11
 
12
12
  private struct LocationRequest {
13
13
  let id: UUID = UUID()
14
- let success: (GeolocationResponse) -> Void
15
- let error: ((GeolocationError) -> Void)?
14
+ let success: (CompatGeolocationResponse) -> Void
15
+ let error: ((CompatGeolocationError) -> Void)?
16
16
  let options: ParsedOptions
17
17
  var timer: DispatchSourceTimer?
18
18
  }
19
19
 
20
20
  private struct WatchSubscription {
21
- let success: (GeolocationResponse) -> Void
22
- let error: ((GeolocationError) -> Void)?
21
+ let success: (CompatGeolocationResponse) -> Void
22
+ let error: ((CompatGeolocationError) -> Void)?
23
23
  let options: ParsedOptions
24
24
  }
25
25
 
@@ -29,13 +29,18 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
29
29
  let accuracy: CLLocationAccuracy
30
30
  let distanceFilter: CLLocationDistance
31
31
  let useSignificantChanges: Bool
32
+ let activityType: CLActivityType?
33
+ let pausesLocationUpdatesAutomatically: Bool?
34
+ let showsBackgroundLocationIndicator: Bool?
32
35
 
33
- static func parse(from options: GeolocationOptions?) -> ParsedOptions {
36
+ static func parse(from options: CompatGeolocationOptions?) -> ParsedOptions {
34
37
  let timeout = options?.timeout ?? DEFAULT_TIMEOUT
35
38
  let maximumAge = options?.maximumAge ?? DEFAULT_MAXIMUM_AGE
36
39
  let enableHighAccuracy = options?.enableHighAccuracy ?? false
37
- let accuracy =
38
- enableHighAccuracy ? kCLLocationAccuracyBest : kCLLocationAccuracyHundredMeters
40
+ let accuracy = resolveAccuracy(
41
+ preset: options?.accuracy?.ios,
42
+ enableHighAccuracy: enableHighAccuracy
43
+ )
39
44
  let distanceFilter = options?.distanceFilter ?? kCLDistanceFilterNone
40
45
  let useSignificantChanges = options?.useSignificantChanges ?? false
41
46
 
@@ -44,9 +49,59 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
44
49
  maximumAge: maximumAge,
45
50
  accuracy: accuracy,
46
51
  distanceFilter: distanceFilter,
47
- useSignificantChanges: useSignificantChanges
52
+ useSignificantChanges: useSignificantChanges,
53
+ activityType: resolveActivityType(options?.activityType),
54
+ pausesLocationUpdatesAutomatically: options?.pausesLocationUpdatesAutomatically,
55
+ showsBackgroundLocationIndicator: options?.showsBackgroundLocationIndicator
48
56
  )
49
57
  }
58
+
59
+ private static func resolveAccuracy(
60
+ preset: IOSAccuracyPreset?,
61
+ enableHighAccuracy: Bool
62
+ ) -> CLLocationAccuracy {
63
+ guard let preset else {
64
+ return enableHighAccuracy
65
+ ? kCLLocationAccuracyBest
66
+ : kCLLocationAccuracyHundredMeters
67
+ }
68
+
69
+ switch preset {
70
+ case .bestfornavigation:
71
+ return kCLLocationAccuracyBestForNavigation
72
+ case .best:
73
+ return kCLLocationAccuracyBest
74
+ case .nearesttenmeters:
75
+ return kCLLocationAccuracyNearestTenMeters
76
+ case .hundredmeters:
77
+ return kCLLocationAccuracyHundredMeters
78
+ case .kilometer:
79
+ return kCLLocationAccuracyKilometer
80
+ case .threekilometers:
81
+ return kCLLocationAccuracyThreeKilometers
82
+ case .reduced:
83
+ return kCLLocationAccuracyReduced
84
+ }
85
+ }
86
+
87
+ private static func resolveActivityType(_ activityType: IOSActivityType?) -> CLActivityType? {
88
+ guard let activityType else {
89
+ return nil
90
+ }
91
+
92
+ switch activityType {
93
+ case .other:
94
+ return .other
95
+ case .automotivenavigation:
96
+ return .automotiveNavigation
97
+ case .fitness:
98
+ return .fitness
99
+ case .othernavigation:
100
+ return .otherNavigation
101
+ case .airborne:
102
+ return .airborne
103
+ }
104
+ }
50
105
  }
51
106
 
52
107
  // MARK: - Properties
@@ -57,7 +112,7 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
57
112
 
58
113
  // Authorization
59
114
  private var queuedAuthorizationCallbacks:
60
- [(success: (() -> Void)?, error: ((GeolocationError) -> Void)?)] = []
115
+ [(success: (() -> Void)?, error: ((CompatGeolocationError) -> Void)?)] = []
61
116
 
62
117
  // getCurrentPosition
63
118
  private var pendingRequests: [LocationRequest] = []
@@ -83,7 +138,7 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
83
138
  skipPermissionRequests: Bool,
84
139
  enableBackgroundLocationUpdates: Bool,
85
140
  success: (() -> Void)?,
86
- error: ((GeolocationError) -> Void)?
141
+ error: ((CompatGeolocationError) -> Void)?
87
142
  ) {
88
143
  initializeLocationManagerIfNeeded()
89
144
  enqueueAuthorizationCallbacks(success: success, error: error)
@@ -114,7 +169,7 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
114
169
  }
115
170
 
116
171
  private func enqueueAuthorizationCallbacks(
117
- success: (() -> Void)?, error: ((GeolocationError) -> Void)?
172
+ success: (() -> Void)?, error: ((CompatGeolocationError) -> Void)?
118
173
  ) {
119
174
  guard success != nil || error != nil else { return }
120
175
  queuedAuthorizationCallbacks.append((success: success, error: error))
@@ -146,9 +201,9 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
146
201
  // MARK: - Get Current Position
147
202
 
148
203
  func getCurrentPosition(
149
- success: @escaping (GeolocationResponse) -> Void,
150
- error: ((GeolocationError) -> Void)?,
151
- options: GeolocationOptions?
204
+ success: @escaping (CompatGeolocationResponse) -> Void,
205
+ error: ((CompatGeolocationError) -> Void)?,
206
+ options: CompatGeolocationOptions?
152
207
  ) {
153
208
  let parsedOptions = ParsedOptions.parse(from: options)
154
209
 
@@ -170,10 +225,6 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
170
225
 
171
226
  initializeLocationManagerIfNeeded()
172
227
 
173
- // Configure location manager
174
- locationManager?.desiredAccuracy = parsedOptions.accuracy
175
- locationManager?.distanceFilter = parsedOptions.distanceFilter
176
-
177
228
  // Create request
178
229
  var request = LocationRequest(
179
230
  success: success,
@@ -193,16 +244,17 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
193
244
 
194
245
  pendingRequests.append(request)
195
246
 
196
- // Start location updates
247
+ // Update configuration and start location updates
248
+ updateLocationManagerConfiguration()
197
249
  startMonitoring()
198
250
  }
199
251
 
200
252
  // MARK: - Watch Position
201
253
 
202
254
  func watchPosition(
203
- success: @escaping (GeolocationResponse) -> Void,
204
- error: ((GeolocationError) -> Void)?,
205
- options: GeolocationOptions?
255
+ success: @escaping (CompatGeolocationResponse) -> Void,
256
+ error: ((CompatGeolocationError) -> Void)?,
257
+ options: CompatGeolocationOptions?
206
258
  ) -> Double {
207
259
  let parsedOptions = ParsedOptions.parse(from: options)
208
260
  let watchId = nextWatchId
@@ -218,10 +270,7 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
218
270
 
219
271
  initializeLocationManagerIfNeeded()
220
272
 
221
- // Configure location manager
222
- locationManager?.desiredAccuracy = parsedOptions.accuracy
223
- locationManager?.distanceFilter = parsedOptions.distanceFilter
224
-
273
+ updateLocationManagerConfiguration()
225
274
  startMonitoring()
226
275
 
227
276
  return watchId
@@ -233,6 +282,8 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
233
282
  // Stop monitoring if no more watches or pending requests
234
283
  if activeWatches.isEmpty && pendingRequests.isEmpty {
235
284
  stopMonitoring()
285
+ } else {
286
+ updateLocationManagerConfiguration()
236
287
  }
237
288
  }
238
289
 
@@ -242,6 +293,8 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
242
293
  // Stop monitoring if no pending requests
243
294
  if pendingRequests.isEmpty {
244
295
  stopMonitoring()
296
+ } else {
297
+ updateLocationManagerConfiguration()
245
298
  }
246
299
  }
247
300
 
@@ -284,11 +337,13 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
284
337
  // 3. Stop monitoring if no more watches or pending requests
285
338
  if activeWatches.isEmpty && pendingRequests.isEmpty {
286
339
  stopMonitoring()
340
+ } else {
341
+ updateLocationManagerConfiguration()
287
342
  }
288
343
  }
289
344
 
290
345
  func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
291
- let geoError: GeolocationError
346
+ let geoError: CompatGeolocationError
292
347
 
293
348
  if let clError = error as? CLError {
294
349
  switch clError.code {
@@ -345,26 +400,55 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
345
400
  guard let manager = locationManager else { return }
346
401
 
347
402
  // Find the best (most accurate) settings from all pending requests and active watches
348
- var bestAccuracy = kCLLocationAccuracyHundredMeters
349
- var smallestDistanceFilter = kCLDistanceFilterNone
403
+ var bestAccuracy: CLLocationAccuracy?
404
+ var smallestDistanceFilter: CLLocationDistance?
405
+ var activityType: CLActivityType?
406
+ var pausesLocationUpdatesAutomatically: Bool?
407
+ var showsBackgroundLocationIndicator = false
350
408
  var shouldUseSignificantChanges = false
351
409
 
352
410
  for request in pendingRequests {
353
- bestAccuracy = min(bestAccuracy, request.options.accuracy)
354
- smallestDistanceFilter = min(smallestDistanceFilter, request.options.distanceFilter)
411
+ bestAccuracy = mergeAccuracy(bestAccuracy, request.options.accuracy)
412
+ smallestDistanceFilter = mergeDistanceFilter(
413
+ smallestDistanceFilter,
414
+ request.options.distanceFilter
415
+ )
416
+ activityType = mergeActivityType(activityType, request.options.activityType)
417
+ pausesLocationUpdatesAutomatically = mergePausesLocationUpdatesAutomatically(
418
+ pausesLocationUpdatesAutomatically,
419
+ request.options.pausesLocationUpdatesAutomatically
420
+ )
421
+ showsBackgroundLocationIndicator = showsBackgroundLocationIndicator ||
422
+ (request.options.showsBackgroundLocationIndicator ?? false)
355
423
  shouldUseSignificantChanges =
356
424
  shouldUseSignificantChanges || request.options.useSignificantChanges
357
425
  }
358
426
 
359
427
  for (_, watch) in activeWatches {
360
- bestAccuracy = min(bestAccuracy, watch.options.accuracy)
361
- smallestDistanceFilter = min(smallestDistanceFilter, watch.options.distanceFilter)
428
+ bestAccuracy = mergeAccuracy(bestAccuracy, watch.options.accuracy)
429
+ smallestDistanceFilter = mergeDistanceFilter(
430
+ smallestDistanceFilter,
431
+ watch.options.distanceFilter
432
+ )
433
+ activityType = mergeActivityType(activityType, watch.options.activityType)
434
+ pausesLocationUpdatesAutomatically = mergePausesLocationUpdatesAutomatically(
435
+ pausesLocationUpdatesAutomatically,
436
+ watch.options.pausesLocationUpdatesAutomatically
437
+ )
438
+ showsBackgroundLocationIndicator = showsBackgroundLocationIndicator ||
439
+ (watch.options.showsBackgroundLocationIndicator ?? false)
362
440
  shouldUseSignificantChanges =
363
441
  shouldUseSignificantChanges || watch.options.useSignificantChanges
364
442
  }
365
443
 
366
- manager.desiredAccuracy = bestAccuracy
367
- manager.distanceFilter = smallestDistanceFilter
444
+ manager.desiredAccuracy = bestAccuracy ?? kCLLocationAccuracyHundredMeters
445
+ manager.distanceFilter = smallestDistanceFilter ?? kCLDistanceFilterNone
446
+ manager.activityType = activityType ?? .other
447
+ manager.pausesLocationUpdatesAutomatically = pausesLocationUpdatesAutomatically ?? true
448
+
449
+ if #available(iOS 11.0, *) {
450
+ manager.showsBackgroundLocationIndicator = showsBackgroundLocationIndicator
451
+ }
368
452
 
369
453
  // Update significant changes mode if changed
370
454
  if shouldUseSignificantChanges != usingSignificantChanges {
@@ -374,6 +458,79 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
374
458
  }
375
459
  }
376
460
 
461
+ private func mergeAccuracy(
462
+ _ current: CLLocationAccuracy?,
463
+ _ next: CLLocationAccuracy
464
+ ) -> CLLocationAccuracy {
465
+ guard let current else {
466
+ return next
467
+ }
468
+
469
+ return min(current, next)
470
+ }
471
+
472
+ private func mergeActivityType(
473
+ _ current: CLActivityType?,
474
+ _ next: CLActivityType?
475
+ ) -> CLActivityType? {
476
+ guard let next else {
477
+ return current
478
+ }
479
+
480
+ guard let current else {
481
+ return next
482
+ }
483
+
484
+ return activityTypeRank(next) > activityTypeRank(current) ? next : current
485
+ }
486
+
487
+ private func activityTypeRank(_ activityType: CLActivityType) -> Int {
488
+ switch activityType {
489
+ case .other:
490
+ return 0
491
+ case .otherNavigation:
492
+ return 1
493
+ case .automotiveNavigation:
494
+ return 2
495
+ case .fitness:
496
+ return 3
497
+ case .airborne:
498
+ return 4
499
+ @unknown default:
500
+ return 0
501
+ }
502
+ }
503
+
504
+ private func mergePausesLocationUpdatesAutomatically(
505
+ _ current: Bool?,
506
+ _ next: Bool?
507
+ ) -> Bool? {
508
+ guard let next else {
509
+ return current
510
+ }
511
+
512
+ guard let current else {
513
+ return next
514
+ }
515
+
516
+ return current && next
517
+ }
518
+
519
+ private func mergeDistanceFilter(
520
+ _ current: CLLocationDistance?,
521
+ _ next: CLLocationDistance
522
+ ) -> CLLocationDistance {
523
+ guard let current else {
524
+ return next
525
+ }
526
+
527
+ if current == kCLDistanceFilterNone || next == kCLDistanceFilterNone {
528
+ return kCLDistanceFilterNone
529
+ }
530
+
531
+ return min(current, next)
532
+ }
533
+
377
534
  private func startMonitoring() {
378
535
  if usingSignificantChanges {
379
536
  locationManager?.startMonitoringSignificantLocationChanges()
@@ -427,6 +584,8 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
427
584
  // Stop monitoring if no more watches or pending requests
428
585
  if activeWatches.isEmpty && pendingRequests.isEmpty {
429
586
  stopMonitoring()
587
+ } else {
588
+ updateLocationManagerConfiguration()
430
589
  }
431
590
  }
432
591
  }
@@ -450,13 +609,13 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
450
609
  invokeQueuedAuthorizationCallbacks(error: error)
451
610
  }
452
611
 
453
- private func createGeolocationError(for status: CLAuthorizationStatus) -> GeolocationError {
612
+ private func createGeolocationError(for status: CLAuthorizationStatus) -> CompatGeolocationError {
454
613
  let message =
455
614
  status == .restricted
456
615
  ? "This application is not authorized to use location services"
457
616
  : "User denied access to location services."
458
617
 
459
- return GeolocationError(
618
+ return CompatGeolocationError(
460
619
  code: Double(PERMISSION_DENIED),
461
620
  message: message,
462
621
  PERMISSION_DENIED: Double(PERMISSION_DENIED),
@@ -466,7 +625,7 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
466
625
  }
467
626
 
468
627
  private func invokeQueuedAuthorizationCallbacks(
469
- success: Bool = false, error: GeolocationError? = nil
628
+ success: Bool = false, error: CompatGeolocationError? = nil
470
629
  ) {
471
630
  for callback in queuedAuthorizationCallbacks {
472
631
  if success {
@@ -478,23 +637,18 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
478
637
  queuedAuthorizationCallbacks.removeAll()
479
638
  }
480
639
 
481
- func locationToPosition(_ location: CLLocation) -> GeolocationResponse {
482
- let altitude = location.verticalAccuracy < 0 ? 0.0 : location.altitude
483
- let altitudeAccuracy = location.verticalAccuracy < 0 ? 0.0 : location.verticalAccuracy
484
- let heading = location.course >= 0 ? location.course : -1.0
485
- let speed = location.speed >= 0 ? location.speed : 0.0
486
-
640
+ func locationToPosition(_ location: CLLocation) -> CompatGeolocationResponse {
487
641
  let coordsObj = GeolocationCoordinates(
488
642
  latitude: location.coordinate.latitude,
489
643
  longitude: location.coordinate.longitude,
490
- altitude: .second(altitude),
644
+ altitude: location.nitroGeolocationAltitude,
491
645
  accuracy: location.horizontalAccuracy,
492
- altitudeAccuracy: .second(altitudeAccuracy),
493
- heading: .second(heading),
494
- speed: .second(speed)
646
+ altitudeAccuracy: location.nitroGeolocationAltitudeAccuracy,
647
+ heading: location.nitroGeolocationHeading,
648
+ speed: location.nitroGeolocationSpeed
495
649
  )
496
650
 
497
- let position = GeolocationResponse(
651
+ let position = CompatGeolocationResponse(
498
652
  coords: coordsObj,
499
653
  timestamp: location.timestamp.timeIntervalSince1970 * 1000
500
654
  )
@@ -502,8 +656,8 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
502
656
  return position
503
657
  }
504
658
 
505
- private func createError(code: Int, message: String) -> GeolocationError {
506
- return GeolocationError(
659
+ private func createError(code: Int, message: String) -> CompatGeolocationError {
660
+ return CompatGeolocationError(
507
661
  code: Double(code),
508
662
  message: message,
509
663
  PERMISSION_DENIED: Double(PERMISSION_DENIED),