react-native-nitro-geolocation 1.2.6 → 1.3.1

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 (223) hide show
  1. package/README.md +61 -272
  2. package/android/build.gradle +1 -0
  3. package/android/src/main/AndroidManifest.xml +39 -0
  4. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidFusedLocationProvider.kt +310 -0
  5. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidFusedRequestFactory.kt +31 -0
  6. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidGeolocationConversions.kt +71 -0
  7. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidGeolocationErrors.kt +85 -0
  8. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidGeolocationOptions.kt +92 -0
  9. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidLocationSettings.kt +3 -0
  10. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidProviderRoute.kt +74 -0
  11. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/NitroBackgroundLocation.kt +132 -0
  12. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/NitroGeolocation.kt +219 -476
  13. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/AndroidBackgroundHttpSync.kt +134 -0
  14. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/AndroidBackgroundPermissions.kt +196 -0
  15. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/AndroidBackgroundSerialization.kt +266 -0
  16. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroActivityRecognitionReceiver.kt +13 -0
  17. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroBackgroundEventHub.kt +65 -0
  18. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroBackgroundHeadlessTaskService.kt +58 -0
  19. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroBackgroundLocationController.kt +711 -0
  20. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroBackgroundLocationService.kt +48 -0
  21. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroBackgroundNotificationFactory.kt +37 -0
  22. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroBackgroundStore.kt +655 -0
  23. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroBootReceiver.kt +26 -0
  24. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroGeofenceReceiver.kt +14 -0
  25. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroLocationUpdateReceiver.kt +37 -0
  26. package/android/src/test/java/com/margelo/nitro/nitrogeolocation/AndroidFusedLocationProviderTest.kt +64 -0
  27. package/android/src/test/java/com/margelo/nitro/nitrogeolocation/AndroidProviderRouteTest.kt +116 -0
  28. package/ios/IOSBackgroundHttpSync.swift +126 -0
  29. package/ios/IOSBackgroundLocationDelegate.swift +36 -0
  30. package/ios/IOSBackgroundMotion.swift +55 -0
  31. package/ios/IOSBackgroundSerialization.swift +539 -0
  32. package/ios/IOSGeolocationConversions.swift +131 -0
  33. package/ios/IOSGeolocationDelegate.swift +31 -0
  34. package/ios/IOSGeolocationErrors.swift +39 -0
  35. package/ios/IOSGeolocationOptions.swift +135 -0
  36. package/ios/NitroBackgroundLocation.swift +849 -0
  37. package/ios/NitroGeolocation.swift +14 -347
  38. package/nitrogen/generated/android/c++/JActivityRecognitionOptions.hpp +69 -0
  39. package/nitrogen/generated/android/c++/JAndroidBackgroundLocationOptions.hpp +74 -0
  40. package/nitrogen/generated/android/c++/JAndroidBackgroundLocationStatus.hpp +67 -0
  41. package/nitrogen/generated/android/c++/JAndroidBackgroundProvider.hpp +61 -0
  42. package/nitrogen/generated/android/c++/JAndroidForegroundServiceOptions.hpp +90 -0
  43. package/nitrogen/generated/android/c++/JBackgroundEventEnvelope.hpp +129 -0
  44. package/nitrogen/generated/android/c++/JBackgroundEventType.hpp +70 -0
  45. package/nitrogen/generated/android/c++/JBackgroundHttpMethod.hpp +61 -0
  46. package/nitrogen/generated/android/c++/JBackgroundHttpSyncOptions.hpp +131 -0
  47. package/nitrogen/generated/android/c++/JBackgroundHttpSyncResult.hpp +111 -0
  48. package/nitrogen/generated/android/c++/JBackgroundLocation.hpp +110 -0
  49. package/nitrogen/generated/android/c++/JBackgroundLocationOptions.hpp +162 -0
  50. package/nitrogen/generated/android/c++/JBackgroundLocationSource.hpp +73 -0
  51. package/nitrogen/generated/android/c++/JBackgroundLocationState.hpp +70 -0
  52. package/nitrogen/generated/android/c++/JBackgroundLocationStatus.hpp +126 -0
  53. package/nitrogen/generated/android/c++/JBackgroundPermissionResult.hpp +79 -0
  54. package/nitrogen/generated/android/c++/JBackgroundPermissionStatus.hpp +64 -0
  55. package/nitrogen/generated/android/c++/JBackgroundTrackingMode.hpp +61 -0
  56. package/nitrogen/generated/android/c++/JBatterySnapshot.hpp +61 -0
  57. package/nitrogen/generated/android/c++/JDetectedActivity.hpp +66 -0
  58. package/nitrogen/generated/android/c++/JDetectedActivityType.hpp +76 -0
  59. package/nitrogen/generated/android/c++/JFunc_void_BackgroundEventEnvelope.hpp +114 -0
  60. package/nitrogen/generated/android/c++/JFunc_void_BackgroundLocation.hpp +95 -0
  61. package/nitrogen/generated/android/c++/JGeofenceEvent.hpp +94 -0
  62. package/nitrogen/generated/android/c++/JGeofenceRegion.hpp +112 -0
  63. package/nitrogen/generated/android/c++/JGeofenceTransition.hpp +61 -0
  64. package/nitrogen/generated/android/c++/JGeofencingOptions.hpp +82 -0
  65. package/nitrogen/generated/android/c++/JGetStoredBackgroundEventsOptions.hpp +90 -0
  66. package/nitrogen/generated/android/c++/JGetStoredBackgroundLocationsOptions.hpp +69 -0
  67. package/nitrogen/generated/android/c++/JHybridNitroBackgroundLocationSpec.cpp +662 -0
  68. package/nitrogen/generated/android/c++/JHybridNitroBackgroundLocationSpec.hpp +89 -0
  69. package/nitrogen/generated/android/c++/JIOSBackgroundActivityType.hpp +67 -0
  70. package/nitrogen/generated/android/c++/JIOSBackgroundLocationOptions.hpp +79 -0
  71. package/nitrogen/generated/android/c++/JIOSBackgroundLocationStatus.hpp +61 -0
  72. package/nitrogen/generated/android/c++/JLocationProviderStatus.hpp +5 -1
  73. package/nitrogen/generated/android/c++/JStoredBackgroundEventEnvelope.hpp +115 -0
  74. package/nitrogen/generated/android/c++/JStoredBackgroundLocation.hpp +122 -0
  75. package/nitrogen/generated/android/c++/JVariant_NullType_Boolean_String_Double.cpp +34 -0
  76. package/nitrogen/generated/android/c++/JVariant_NullType_Boolean_String_Double.hpp +100 -0
  77. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/ActivityRecognitionOptions.kt +66 -0
  78. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/AndroidBackgroundLocationOptions.kt +66 -0
  79. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/AndroidBackgroundLocationStatus.kt +61 -0
  80. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/AndroidBackgroundProvider.kt +24 -0
  81. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/AndroidForegroundServiceOptions.kt +91 -0
  82. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundEventEnvelope.kt +96 -0
  83. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundEventType.kt +27 -0
  84. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundHttpMethod.kt +24 -0
  85. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundHttpSyncOptions.kt +101 -0
  86. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundHttpSyncResult.kt +71 -0
  87. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundLocation.kt +96 -0
  88. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundLocationOptions.kt +136 -0
  89. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundLocationSource.kt +28 -0
  90. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundLocationState.kt +27 -0
  91. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundLocationStatus.kt +116 -0
  92. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundPermissionResult.kt +71 -0
  93. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundPermissionStatus.kt +25 -0
  94. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundTrackingMode.kt +24 -0
  95. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BatterySnapshot.kt +56 -0
  96. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/DetectedActivity.kt +61 -0
  97. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/DetectedActivityType.kt +29 -0
  98. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Func_void_BackgroundEventEnvelope.kt +80 -0
  99. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Func_void_BackgroundLocation.kt +80 -0
  100. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/GeofenceEvent.kt +66 -0
  101. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/GeofenceRegion.kt +96 -0
  102. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/GeofenceTransition.kt +24 -0
  103. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/GeofencingOptions.kt +56 -0
  104. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/GetStoredBackgroundEventsOptions.kt +66 -0
  105. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/GetStoredBackgroundLocationsOptions.kt +66 -0
  106. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/HybridNitroBackgroundLocationSpec.kt +174 -0
  107. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/IOSBackgroundActivityType.kt +26 -0
  108. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/IOSBackgroundLocationOptions.kt +76 -0
  109. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/IOSBackgroundLocationStatus.kt +56 -0
  110. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/LocationProviderStatus.kt +7 -2
  111. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/StoredBackgroundEventEnvelope.kt +76 -0
  112. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/StoredBackgroundLocation.kt +111 -0
  113. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Variant_NullType_Boolean_String_Double.kt +88 -0
  114. package/nitrogen/generated/android/nitrogeolocation+autolinking.cmake +3 -0
  115. package/nitrogen/generated/android/nitrogeolocationOnLoad.cpp +20 -0
  116. package/nitrogen/generated/ios/NitroGeolocation-Swift-Cxx-Bridge.cpp +104 -15
  117. package/nitrogen/generated/ios/NitroGeolocation-Swift-Cxx-Bridge.hpp +1107 -50
  118. package/nitrogen/generated/ios/NitroGeolocation-Swift-Cxx-Umbrella.hpp +102 -0
  119. package/nitrogen/generated/ios/NitroGeolocationAutolinking.mm +8 -0
  120. package/nitrogen/generated/ios/NitroGeolocationAutolinking.swift +15 -3
  121. package/nitrogen/generated/ios/c++/HybridNitroBackgroundLocationSpecSwift.cpp +11 -0
  122. package/nitrogen/generated/ios/c++/HybridNitroBackgroundLocationSpecSwift.hpp +416 -0
  123. package/nitrogen/generated/ios/swift/ActivityRecognitionOptions.swift +96 -0
  124. package/nitrogen/generated/ios/swift/AndroidBackgroundLocationOptions.swift +76 -0
  125. package/nitrogen/generated/ios/swift/AndroidBackgroundLocationStatus.swift +58 -0
  126. package/nitrogen/generated/ios/swift/AndroidBackgroundProvider.swift +44 -0
  127. package/nitrogen/generated/ios/swift/AndroidForegroundServiceOptions.swift +160 -0
  128. package/nitrogen/generated/ios/swift/BackgroundEventEnvelope.swift +110 -0
  129. package/nitrogen/generated/ios/swift/BackgroundEventType.swift +56 -0
  130. package/nitrogen/generated/ios/swift/BackgroundHttpMethod.swift +44 -0
  131. package/nitrogen/generated/ios/swift/BackgroundHttpSyncOptions.swift +259 -0
  132. package/nitrogen/generated/ios/swift/BackgroundHttpSyncResult.swift +87 -0
  133. package/nitrogen/generated/ios/swift/BackgroundLocation.swift +118 -0
  134. package/nitrogen/generated/ios/swift/BackgroundLocationOptions.swift +292 -0
  135. package/nitrogen/generated/ios/swift/BackgroundLocationSource.swift +60 -0
  136. package/nitrogen/generated/ios/swift/BackgroundLocationState.swift +56 -0
  137. package/nitrogen/generated/ios/swift/BackgroundLocationStatus.swift +124 -0
  138. package/nitrogen/generated/ios/swift/BackgroundPermissionResult.swift +81 -0
  139. package/nitrogen/generated/ios/swift/BackgroundPermissionStatus.swift +48 -0
  140. package/nitrogen/generated/ios/swift/BackgroundTrackingMode.swift +44 -0
  141. package/nitrogen/generated/ios/swift/BatterySnapshot.swift +60 -0
  142. package/nitrogen/generated/ios/swift/DetectedActivity.swift +39 -0
  143. package/nitrogen/generated/ios/swift/DetectedActivityType.swift +64 -0
  144. package/nitrogen/generated/ios/swift/Func_void_BackgroundEventEnvelope.swift +46 -0
  145. package/nitrogen/generated/ios/swift/Func_void_BackgroundHttpSyncResult.swift +46 -0
  146. package/nitrogen/generated/ios/swift/Func_void_BackgroundLocation.swift +46 -0
  147. package/nitrogen/generated/ios/swift/Func_void_BackgroundLocationStatus.swift +46 -0
  148. package/nitrogen/generated/ios/swift/Func_void_BackgroundPermissionResult.swift +46 -0
  149. package/nitrogen/generated/ios/swift/Func_void_std__optional_BackgroundLocationOptions_.swift +46 -0
  150. package/nitrogen/generated/ios/swift/Func_void_std__vector_GeofenceRegion_.swift +46 -0
  151. package/nitrogen/generated/ios/swift/Func_void_std__vector_StoredBackgroundEventEnvelope_.swift +46 -0
  152. package/nitrogen/generated/ios/swift/Func_void_std__vector_StoredBackgroundLocation_.swift +46 -0
  153. package/nitrogen/generated/ios/swift/GeofenceEvent.swift +50 -0
  154. package/nitrogen/generated/ios/swift/GeofenceRegion.swift +195 -0
  155. package/nitrogen/generated/ios/swift/GeofenceTransition.swift +44 -0
  156. package/nitrogen/generated/ios/swift/GeofencingOptions.swift +66 -0
  157. package/nitrogen/generated/ios/swift/GetStoredBackgroundEventsOptions.swift +102 -0
  158. package/nitrogen/generated/ios/swift/GetStoredBackgroundLocationsOptions.swift +96 -0
  159. package/nitrogen/generated/ios/swift/HybridNitroBackgroundLocationSpec.swift +81 -0
  160. package/nitrogen/generated/ios/swift/HybridNitroBackgroundLocationSpec_cxx.swift +654 -0
  161. package/nitrogen/generated/ios/swift/IOSBackgroundActivityType.swift +52 -0
  162. package/nitrogen/generated/ios/swift/IOSBackgroundLocationOptions.swift +125 -0
  163. package/nitrogen/generated/ios/swift/IOSBackgroundLocationStatus.swift +34 -0
  164. package/nitrogen/generated/ios/swift/LocationProviderStatus.swift +19 -1
  165. package/nitrogen/generated/ios/swift/StoredBackgroundEventEnvelope.swift +54 -0
  166. package/nitrogen/generated/ios/swift/StoredBackgroundLocation.swift +120 -0
  167. package/nitrogen/generated/ios/swift/Variant_NullType_Bool_String_Double.swift +34 -0
  168. package/nitrogen/generated/shared/c++/ActivityRecognitionOptions.hpp +95 -0
  169. package/nitrogen/generated/shared/c++/AndroidBackgroundLocationOptions.hpp +100 -0
  170. package/nitrogen/generated/shared/c++/AndroidBackgroundLocationStatus.hpp +93 -0
  171. package/nitrogen/generated/shared/c++/AndroidBackgroundProvider.hpp +80 -0
  172. package/nitrogen/generated/shared/c++/AndroidForegroundServiceOptions.hpp +116 -0
  173. package/nitrogen/generated/shared/c++/BackgroundEventEnvelope.hpp +140 -0
  174. package/nitrogen/generated/shared/c++/BackgroundEventType.hpp +92 -0
  175. package/nitrogen/generated/shared/c++/BackgroundHttpMethod.hpp +80 -0
  176. package/nitrogen/generated/shared/c++/BackgroundHttpSyncOptions.hpp +129 -0
  177. package/nitrogen/generated/shared/c++/BackgroundHttpSyncResult.hpp +101 -0
  178. package/nitrogen/generated/shared/c++/BackgroundLocation.hpp +134 -0
  179. package/nitrogen/generated/shared/c++/BackgroundLocationOptions.hpp +174 -0
  180. package/nitrogen/generated/shared/c++/BackgroundLocationSource.hpp +96 -0
  181. package/nitrogen/generated/shared/c++/BackgroundLocationState.hpp +92 -0
  182. package/nitrogen/generated/shared/c++/BackgroundLocationStatus.hpp +158 -0
  183. package/nitrogen/generated/shared/c++/BackgroundPermissionResult.hpp +107 -0
  184. package/nitrogen/generated/shared/c++/BackgroundPermissionStatus.hpp +84 -0
  185. package/nitrogen/generated/shared/c++/BackgroundTrackingMode.hpp +80 -0
  186. package/nitrogen/generated/shared/c++/BatterySnapshot.hpp +87 -0
  187. package/nitrogen/generated/shared/c++/DetectedActivity.hpp +92 -0
  188. package/nitrogen/generated/shared/c++/DetectedActivityType.hpp +100 -0
  189. package/nitrogen/generated/shared/c++/GeofenceEvent.hpp +103 -0
  190. package/nitrogen/generated/shared/c++/GeofenceRegion.hpp +123 -0
  191. package/nitrogen/generated/shared/c++/GeofenceTransition.hpp +80 -0
  192. package/nitrogen/generated/shared/c++/GeofencingOptions.hpp +90 -0
  193. package/nitrogen/generated/shared/c++/GetStoredBackgroundEventsOptions.hpp +98 -0
  194. package/nitrogen/generated/shared/c++/GetStoredBackgroundLocationsOptions.hpp +95 -0
  195. package/nitrogen/generated/shared/c++/HybridNitroBackgroundLocationSpec.cpp +47 -0
  196. package/nitrogen/generated/shared/c++/HybridNitroBackgroundLocationSpec.hpp +133 -0
  197. package/nitrogen/generated/shared/c++/IOSBackgroundActivityType.hpp +88 -0
  198. package/nitrogen/generated/shared/c++/IOSBackgroundLocationOptions.hpp +105 -0
  199. package/nitrogen/generated/shared/c++/IOSBackgroundLocationStatus.hpp +87 -0
  200. package/nitrogen/generated/shared/c++/LocationProviderStatus.hpp +5 -1
  201. package/nitrogen/generated/shared/c++/StoredBackgroundEventEnvelope.hpp +108 -0
  202. package/nitrogen/generated/shared/c++/StoredBackgroundLocation.hpp +146 -0
  203. package/package.json +17 -6
  204. package/src/NitroGeolocation.nitro.ts +4 -4
  205. package/src/api/getCurrentPosition.ts +1 -1
  206. package/src/api/requestLocationSettings.ts +3 -2
  207. package/src/background/NitroBackgroundLocation.nitro.ts +83 -0
  208. package/src/background/index.ts +200 -0
  209. package/src/background/index.web.ts +120 -0
  210. package/src/background/task.ts +13 -0
  211. package/src/background/types.ts +328 -0
  212. package/src/compat/index.web.ts +141 -0
  213. package/src/index.tsx +3 -0
  214. package/src/index.web.tsx +41 -0
  215. package/src/publicTypes.ts +6 -5
  216. package/src/types.ts +3 -0
  217. package/src/web/browser.ts +171 -0
  218. package/src/web/index.ts +167 -0
  219. package/src/web/useWatchPosition.ts +76 -0
  220. package/src/web/watch.ts +81 -0
  221. package/src/devtools/index.test.ts +0 -54
  222. package/src/utils/errors.test.ts +0 -65
  223. package/src/utils/provider.test.ts +0 -303
@@ -0,0 +1,37 @@
1
+ package com.margelo.nitro.nitrogeolocation.background
2
+
3
+ import android.content.BroadcastReceiver
4
+ import android.content.Context
5
+ import android.content.Intent
6
+ import android.location.Location
7
+ import android.location.LocationManager
8
+ import android.os.Build
9
+ import com.google.android.gms.location.LocationResult
10
+ import com.margelo.nitro.nitrogeolocation.BackgroundLocationSource
11
+
12
+ class NitroLocationUpdateReceiver : BroadcastReceiver() {
13
+ override fun onReceive(context: Context, intent: Intent) {
14
+ val controller = NitroBackgroundLocationController.getInstance(context)
15
+ val platformLocation = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
16
+ intent.getParcelableExtra(LocationManager.KEY_LOCATION_CHANGED, Location::class.java)
17
+ } else {
18
+ @Suppress("DEPRECATION")
19
+ intent.getParcelableExtra(LocationManager.KEY_LOCATION_CHANGED) as? Location
20
+ }
21
+ if (platformLocation != null) {
22
+ controller.handleNativeLocation(
23
+ platformLocation,
24
+ BackgroundLocationSource.FOREGROUNDSERVICE
25
+ )
26
+ return
27
+ }
28
+
29
+ val result = LocationResult.extractResult(intent) ?: return
30
+ for (location in result.locations) {
31
+ controller.handleNativeLocation(
32
+ location,
33
+ BackgroundLocationSource.FOREGROUNDSERVICE
34
+ )
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,64 @@
1
+ package com.margelo.nitro.nitrogeolocation
2
+
3
+ import org.junit.Assert.assertEquals
4
+ import org.junit.Test
5
+
6
+ class AndroidFusedLocationProviderTest {
7
+ @Test
8
+ fun initialUpdateMaxAgeHonorsMaxUpdateAgeWithoutMaximumAge() {
9
+ assertEquals(
10
+ 60_000.0,
11
+ fusedInitialUpdateMaxAge(
12
+ options = parsedOptions(maximumAge = 0.0, maxUpdateAge = 60_000.0),
13
+ effectiveMaximumAge = 0.0
14
+ ),
15
+ 0.0
16
+ )
17
+ }
18
+
19
+ @Test
20
+ fun initialUpdateMaxAgeUsesEffectiveMaximumAgeWhenMaxUpdateAgeIsAbsent() {
21
+ assertEquals(
22
+ 30_000.0,
23
+ fusedInitialUpdateMaxAge(
24
+ options = parsedOptions(maximumAge = 30_000.0, maxUpdateAge = null),
25
+ effectiveMaximumAge = 30_000.0
26
+ ),
27
+ 0.0
28
+ )
29
+ }
30
+
31
+ @Test
32
+ fun initialUpdateMaxAgePreservesExplicitZeroMaxUpdateAge() {
33
+ assertEquals(
34
+ 0.0,
35
+ fusedInitialUpdateMaxAge(
36
+ options = parsedOptions(maximumAge = 60_000.0, maxUpdateAge = 0.0),
37
+ effectiveMaximumAge = 0.0
38
+ ),
39
+ 0.0
40
+ )
41
+ }
42
+
43
+ private fun parsedOptions(
44
+ maximumAge: Double,
45
+ maxUpdateAge: Double?
46
+ ): ParsedOptions {
47
+ return ParsedOptions(
48
+ timeout = 10_000.0,
49
+ maximumAge = maximumAge,
50
+ androidAccuracy = AndroidAccuracyResolution(
51
+ mode = AndroidAccuracyMode.BALANCED,
52
+ explicitPreset = null
53
+ ),
54
+ interval = 1_000.0,
55
+ fastestInterval = 100.0,
56
+ distanceFilter = 0.0,
57
+ granularity = AndroidGranularity.PERMISSION,
58
+ waitForAccurateLocation = false,
59
+ maxUpdateAge = maxUpdateAge,
60
+ maxUpdateDelay = 0.0,
61
+ maxUpdates = null
62
+ )
63
+ }
64
+ }
@@ -0,0 +1,116 @@
1
+ package com.margelo.nitro.nitrogeolocation
2
+
3
+ import org.junit.Assert.assertEquals
4
+ import org.junit.Test
5
+
6
+ class AndroidProviderRouteTest {
7
+ @Test
8
+ fun autoPrefersFusedWhenGooglePlayServicesAreAvailable() {
9
+ assertEquals(
10
+ AndroidProviderRoute.FUSED,
11
+ selectAndroidProviderRoute(
12
+ locationProvider = LocationProvider.AUTO,
13
+ googlePlayServicesAvailable = true
14
+ )
15
+ )
16
+ }
17
+
18
+ @Test
19
+ fun playServicesPrefersFusedWhenGooglePlayServicesAreAvailable() {
20
+ assertEquals(
21
+ AndroidProviderRoute.FUSED,
22
+ selectAndroidProviderRoute(
23
+ locationProvider = LocationProvider.PLAYSERVICES,
24
+ googlePlayServicesAvailable = true
25
+ )
26
+ )
27
+ }
28
+
29
+ @Test
30
+ fun autoFallsBackToPlatformWhenGooglePlayServicesAreUnavailable() {
31
+ assertEquals(
32
+ AndroidProviderRoute.PLATFORM,
33
+ selectAndroidProviderRoute(
34
+ locationProvider = LocationProvider.AUTO,
35
+ googlePlayServicesAvailable = false
36
+ )
37
+ )
38
+ }
39
+
40
+ @Test
41
+ fun playServicesFallsBackToPlatformWhenGooglePlayServicesAreUnavailable() {
42
+ assertEquals(
43
+ AndroidProviderRoute.PLATFORM,
44
+ selectAndroidProviderRoute(
45
+ locationProvider = LocationProvider.PLAYSERVICES,
46
+ googlePlayServicesAvailable = false
47
+ )
48
+ )
49
+ }
50
+
51
+ @Test
52
+ fun platformProviderAlwaysUsesPlatformRoute() {
53
+ assertEquals(
54
+ AndroidProviderRoute.PLATFORM,
55
+ selectAndroidProviderRoute(
56
+ locationProvider = LocationProvider.ANDROID_PLATFORM,
57
+ googlePlayServicesAvailable = true
58
+ )
59
+ )
60
+ }
61
+
62
+ @Test
63
+ fun autoAndPlayServicesFallbackToPlatformAfterFusedRequestFailure() {
64
+ assertEquals(
65
+ AndroidProviderRoute.PLATFORM,
66
+ selectAndroidFallbackRouteAfterFusedFailure(LocationProvider.AUTO)
67
+ )
68
+ assertEquals(
69
+ AndroidProviderRoute.PLATFORM,
70
+ selectAndroidFallbackRouteAfterFusedFailure(LocationProvider.PLAYSERVICES)
71
+ )
72
+ }
73
+
74
+ @Test
75
+ fun currentLastKnownAndWatchInvokePlatformFallbackAfterFusedRequestFailure() {
76
+ assertInvokesPlatformFallback { platformFallback, failWithoutFallback ->
77
+ runAndroidCurrentPositionFallbackAfterFusedFailure(
78
+ locationProvider = LocationProvider.AUTO,
79
+ runPlatformFallback = platformFallback,
80
+ failWithoutFallback = failWithoutFallback
81
+ )
82
+ }
83
+ assertInvokesPlatformFallback { platformFallback, failWithoutFallback ->
84
+ runAndroidLastKnownPositionFallbackAfterFusedFailure(
85
+ locationProvider = LocationProvider.PLAYSERVICES,
86
+ runPlatformFallback = platformFallback,
87
+ failWithoutFallback = failWithoutFallback
88
+ )
89
+ }
90
+ assertInvokesPlatformFallback { platformFallback, failWithoutFallback ->
91
+ runAndroidWatchPositionFallbackAfterFusedFailure(
92
+ locationProvider = LocationProvider.AUTO,
93
+ runPlatformFallback = platformFallback,
94
+ failWithoutFallback = failWithoutFallback
95
+ )
96
+ }
97
+ }
98
+
99
+ private fun assertInvokesPlatformFallback(
100
+ runFallback: (
101
+ runPlatformFallback: () -> Unit,
102
+ failWithoutFallback: () -> Unit
103
+ ) -> Unit
104
+ ) {
105
+ var platformFallbackCalls = 0
106
+ var errorCalls = 0
107
+
108
+ runFallback(
109
+ { platformFallbackCalls += 1 },
110
+ { errorCalls += 1 }
111
+ )
112
+
113
+ assertEquals(1, platformFallbackCalls)
114
+ assertEquals(0, errorCalls)
115
+ }
116
+ }
@@ -0,0 +1,126 @@
1
+ import Foundation
2
+
3
+ final class IOSBackgroundHttpSync {
4
+ func uploadWithRetry(
5
+ locations: [StoredBackgroundLocation],
6
+ sync: BackgroundHttpSyncOptions
7
+ ) -> BackgroundHttpSyncResult {
8
+ if sync.batch == false {
9
+ return uploadSingleLocationsWithRetry(locations: locations, sync: sync)
10
+ }
11
+ let maxAttempts = sync.retry == true
12
+ ? Int(sync.maxRetries ?? 3) + 1
13
+ : 1
14
+ var lastResult: BackgroundHttpSyncResult?
15
+ for attempt in 0..<max(maxAttempts, 1) {
16
+ let result = upload(locations: locations, sync: sync)
17
+ if result.success {
18
+ return result
19
+ }
20
+ lastResult = result
21
+ if attempt < maxAttempts - 1 {
22
+ Thread.sleep(forTimeInterval: 1)
23
+ }
24
+ }
25
+ return lastResult ?? BackgroundHttpSyncResult(
26
+ success: false,
27
+ statusCode: nil,
28
+ syncedLocationIds: [],
29
+ failedLocationIds: locations.map(\.id),
30
+ error: "HTTP sync failed"
31
+ )
32
+ }
33
+
34
+ private func uploadSingleLocationsWithRetry(
35
+ locations: [StoredBackgroundLocation],
36
+ sync: BackgroundHttpSyncOptions
37
+ ) -> BackgroundHttpSyncResult {
38
+ let maxAttempts = sync.retry == true
39
+ ? Int(sync.maxRetries ?? 3) + 1
40
+ : 1
41
+ var synced: [String] = []
42
+ var failed: [String] = []
43
+ var lastStatusCode: Double?
44
+ var lastError: String?
45
+
46
+ for location in locations {
47
+ var didSync = false
48
+ for attempt in 0..<max(maxAttempts, 1) {
49
+ let result = upload(locations: [location], sync: sync)
50
+ lastStatusCode = result.statusCode
51
+ lastError = result.error
52
+ if result.success {
53
+ synced.append(location.id)
54
+ didSync = true
55
+ break
56
+ }
57
+ if attempt < maxAttempts - 1 {
58
+ Thread.sleep(forTimeInterval: 1)
59
+ }
60
+ }
61
+ if !didSync {
62
+ failed.append(location.id)
63
+ }
64
+ }
65
+
66
+ return BackgroundHttpSyncResult(
67
+ success: failed.isEmpty,
68
+ statusCode: lastStatusCode,
69
+ syncedLocationIds: synced,
70
+ failedLocationIds: failed,
71
+ error: failed.isEmpty ? nil : (lastError ?? "HTTP sync failed")
72
+ )
73
+ }
74
+
75
+ private func upload(
76
+ locations: [StoredBackgroundLocation],
77
+ sync: BackgroundHttpSyncOptions
78
+ ) -> BackgroundHttpSyncResult {
79
+ guard let url = URL(string: sync.url) else {
80
+ return BackgroundHttpSyncResult(
81
+ success: false,
82
+ statusCode: nil,
83
+ syncedLocationIds: [],
84
+ failedLocationIds: locations.map(\.id),
85
+ error: "Invalid sync URL"
86
+ )
87
+ }
88
+ var request = URLRequest(url: url)
89
+ request.httpMethod = sync.method?.stringValue ?? "POST"
90
+ request.setValue("application/json", forHTTPHeaderField: "Content-Type")
91
+ sync.headers?.forEach { request.setValue($0.value, forHTTPHeaderField: $0.key) }
92
+ let body: Any
93
+ if sync.batch == false, let location = locations.first {
94
+ if var template = sync.bodyTemplate.map(bodyTemplateDictionary) {
95
+ template["location"] = storedLocationDictionary(location)
96
+ body = template
97
+ } else {
98
+ body = storedLocationDictionary(location)
99
+ }
100
+ } else {
101
+ var template = sync.bodyTemplate.map(bodyTemplateDictionary) ?? [:]
102
+ template["locations"] = locations.map(storedLocationDictionary)
103
+ body = template
104
+ }
105
+ request.httpBody = try? JSONSerialization.data(withJSONObject: body)
106
+
107
+ let semaphore = DispatchSemaphore(value: 0)
108
+ var statusCode: Int?
109
+ var requestError: String?
110
+ URLSession.shared.dataTask(with: request) { _, response, error in
111
+ statusCode = (response as? HTTPURLResponse)?.statusCode
112
+ requestError = error?.localizedDescription
113
+ semaphore.signal()
114
+ }.resume()
115
+ semaphore.wait()
116
+
117
+ let success = statusCode.map { (200..<300).contains($0) } ?? false
118
+ return BackgroundHttpSyncResult(
119
+ success: success,
120
+ statusCode: statusCode.map(Double.init),
121
+ syncedLocationIds: success ? locations.map(\.id) : [],
122
+ failedLocationIds: success ? [] : locations.map(\.id),
123
+ error: success ? nil : (requestError ?? "HTTP sync failed")
124
+ )
125
+ }
126
+ }
@@ -0,0 +1,36 @@
1
+ import CoreLocation
2
+ import Foundation
3
+
4
+ final class NitroBackgroundLocationDelegate: NSObject, CLLocationManagerDelegate {
5
+ weak var owner: NitroBackgroundLocation?
6
+
7
+ init(owner: NitroBackgroundLocation) {
8
+ self.owner = owner
9
+ super.init()
10
+ }
11
+
12
+ func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
13
+ owner?.handleLocations(locations)
14
+ owner?.applyDeferredUpdatesIfNeeded(manager)
15
+ }
16
+
17
+ func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
18
+ owner?.handleError(error)
19
+ }
20
+
21
+ func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
22
+ owner?.handleRegion(region, transition: .enter)
23
+ }
24
+
25
+ func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
26
+ owner?.handleRegion(region, transition: .exit)
27
+ }
28
+
29
+ func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
30
+ owner?.handleAuthorizationChange()
31
+ }
32
+
33
+ func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
34
+ owner?.handleAuthorizationChange()
35
+ }
36
+ }
@@ -0,0 +1,55 @@
1
+ import CoreLocation
2
+ import CoreMotion
3
+ import Foundation
4
+
5
+ internal func motionActivityType(_ activity: CMMotionActivity) -> DetectedActivityType {
6
+ if activity.automotive {
7
+ return .invehicle
8
+ }
9
+ if activity.cycling {
10
+ return .onbicycle
11
+ }
12
+ if activity.running {
13
+ return .running
14
+ }
15
+ if activity.walking {
16
+ return .walking
17
+ }
18
+ if activity.stationary {
19
+ return .still
20
+ }
21
+ return .unknown
22
+ }
23
+
24
+ internal func motionConfidence(_ confidence: CMMotionActivityConfidence) -> Double {
25
+ switch confidence {
26
+ case .low:
27
+ return 25
28
+ case .medium:
29
+ return 60
30
+ case .high:
31
+ return 95
32
+ @unknown default:
33
+ return 0
34
+ }
35
+ }
36
+
37
+ internal func mapActivityType(_ activityType: IOSBackgroundActivityType?) -> CLActivityType {
38
+ switch activityType {
39
+ case .automotivenavigation:
40
+ return .automotiveNavigation
41
+ case .fitness:
42
+ return .fitness
43
+ case .othernavigation:
44
+ return .otherNavigation
45
+ case .airborne:
46
+ if #available(iOS 12.0, *) {
47
+ return .airborne
48
+ }
49
+ return .other
50
+ case .other, nil:
51
+ return .other
52
+ @unknown default:
53
+ return .other
54
+ }
55
+ }