react-native-nitro-geolocation 1.1.3 → 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 +316 -0
  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
package/README.md ADDED
@@ -0,0 +1,316 @@
1
+ # react-native-nitro-geolocation
2
+
3
+ [![NPM](https://img.shields.io/npm/v/react-native-nitro-geolocation)](https://www.npmjs.com/package/react-native-nitro-geolocation)
4
+
5
+ **Simple Native Geolocation for React Native** — Powered by Nitro Modules with JSI
6
+
7
+ A complete reimplementation of [`@react-native-community/geolocation`](https://github.com/michalchudziak/react-native-geolocation) for the React Native New Architecture, featuring:
8
+
9
+ - 🎯 **Simple functional API** — Direct function calls, no complex abstractions
10
+ - ⚡ **JSI-powered performance** — Direct native calls without the Bridge
11
+ - 🔁 **100% API compatibility** via `/compat` for easy migration
12
+ - 🧹 **Automatic cleanup** — No manual subscription management
13
+ - 📱 **Consistent behavior** across iOS and Android
14
+ - 🛠️ **DevTools Plugin** — Mock locations with interactive map (Rozenite)
15
+
16
+ ![react-native-nitro-geolocation](https://raw.githubusercontent.com/jingjing2222/react-native-nitro-geolocation/main/demo.gif)
17
+
18
+ ---
19
+
20
+ ## 📘 Documentation
21
+
22
+ Full documentation available at:
23
+ 👉 [https://react-native-nitro-geolocation.pages.dev](https://react-native-nitro-geolocation.pages.dev)
24
+
25
+ ---
26
+
27
+ ## 🧭 Introduction
28
+
29
+ React Native Nitro Geolocation provides **two APIs** to fit your needs:
30
+
31
+ ### 1. Modern API (Recommended)
32
+
33
+ **Simple functional API** with direct calls and a single hook for tracking:
34
+
35
+ ```tsx
36
+ import {
37
+ setConfiguration,
38
+ requestPermission,
39
+ requestLocationSettings,
40
+ getLocationAvailability,
41
+ getCurrentPosition,
42
+ getLastKnownPosition,
43
+ geocode,
44
+ reverseGeocode,
45
+ getHeading,
46
+ watchHeading,
47
+ unwatch,
48
+ getAccuracyAuthorization,
49
+ requestTemporaryFullAccuracy,
50
+ useWatchPosition,
51
+ } from "react-native-nitro-geolocation";
52
+
53
+ // Configure once at app startup
54
+ setConfiguration({
55
+ authorizationLevel: "whenInUse",
56
+ locationProvider: "auto",
57
+ });
58
+
59
+ // Request permission
60
+ const status = await requestPermission();
61
+
62
+ // Android, v1.2+: ask the user to enable settings required for accurate location
63
+ await requestLocationSettings({ accuracy: { android: "high" } });
64
+
65
+ // v1.2+: check whether the platform can currently provide locations
66
+ const availability = await getLocationAvailability();
67
+
68
+ // Get current location
69
+ const position = await getCurrentPosition({
70
+ accuracy: { android: "high", ios: "best" },
71
+ granularity: "permission",
72
+ waitForAccurateLocation: true,
73
+ });
74
+
75
+ // v1.2+: read cached location explicitly without starting a fresh request
76
+ const cached = await getLastKnownPosition({
77
+ maximumAge: 60_000,
78
+ accuracy: { android: "balanced", ios: "hundredMeters" },
79
+ });
80
+
81
+ // v1.2+: convert between addresses and coordinates with native geocoders
82
+ const locations = await geocode("City Hall, Seoul, South Korea");
83
+ const addresses = await reverseGeocode({
84
+ latitude: 37.5665,
85
+ longitude: 126.978,
86
+ });
87
+
88
+ // v1.2+: inspect precise/reduced accuracy authorization
89
+ const accuracyAuthorization = await getAccuracyAuthorization();
90
+ if (accuracyAuthorization === "reduced") {
91
+ await requestTemporaryFullAccuracy("TurnByTurnNavigation");
92
+ }
93
+
94
+ // v1.2+: read and watch compass heading
95
+ const heading = await getHeading();
96
+ const headingToken = watchHeading((nextHeading) => {
97
+ console.log(nextHeading.magneticHeading);
98
+ });
99
+ unwatch(headingToken);
100
+
101
+ // Continuous tracking with hook
102
+ function LocationTracker() {
103
+ const { position, error, isWatching } = useWatchPosition({
104
+ enabled: true,
105
+ accuracy: { android: "high", ios: "bestForNavigation" },
106
+ distanceFilter: 10,
107
+ });
108
+
109
+ if (error) return <Text>Error: {error.message}</Text>;
110
+ if (!position) return <Text>Waiting...</Text>;
111
+
112
+ return (
113
+ <Text>
114
+ {position.coords.latitude}, {position.coords.longitude}
115
+ </Text>
116
+ );
117
+ }
118
+ ```
119
+
120
+ **Benefits**:
121
+
122
+ ### 2. Compat API (Compatibility)
123
+
124
+ **Drop-in replacement** for `@react-native-community/geolocation`:
125
+
126
+ ```tsx
127
+ import Geolocation from "react-native-nitro-geolocation/compat";
128
+
129
+ Geolocation.getCurrentPosition(
130
+ (position) => console.log(position),
131
+ (error) => console.error(error),
132
+ { enableHighAccuracy: true }
133
+ );
134
+
135
+ const watchId = Geolocation.watchPosition((position) => console.log(position));
136
+ Geolocation.clearWatch(watchId);
137
+ ```
138
+
139
+ ---
140
+
141
+ ## ⚡ Quick Start
142
+
143
+ ### 1. Installation
144
+
145
+ ```bash
146
+ # Install Nitro core and Geolocation module
147
+ yarn add react-native-nitro-modules react-native-nitro-geolocation
148
+
149
+ # or using npm
150
+ npm install react-native-nitro-modules react-native-nitro-geolocation
151
+ ```
152
+
153
+ Rebuild your native app:
154
+
155
+ ```bash
156
+ cd ios && pod install
157
+ ```
158
+
159
+ ---
160
+
161
+ ### 2. iOS Setup
162
+
163
+ Add permissions to your **Info.plist**:
164
+
165
+ ```xml
166
+ <key>NSLocationWhenInUseUsageDescription</key>
167
+ <string>This app requires access to your location while it's in use.</string>
168
+ <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
169
+ <string>This app requires access to your location at all times.</string>
170
+ ```
171
+
172
+ ---
173
+
174
+ ### 3. Android Setup
175
+
176
+ Add permissions to **AndroidManifest.xml**:
177
+
178
+ ```xml
179
+ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
180
+ <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
181
+ ```
182
+
183
+ Optional (for background):
184
+
185
+ ```xml
186
+ <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
187
+ ```
188
+
189
+ ---
190
+
191
+ ### 4. Development Tools (Optional)
192
+
193
+ #### DevTools Plugin (Rozenite)
194
+
195
+ > **Prerequisites**: Requires [Rozenite DevTools](https://github.com/rozenite/rozenite) to be installed.
196
+ >
197
+ > **API Compatibility**: Only works with the Modern API. Does not support the Compat API (`/compat`).
198
+
199
+ Mock geolocation data during development with an interactive map interface:
200
+
201
+ ![DevTools Plugin](https://raw.githubusercontent.com/jingjing2222/react-native-nitro-geolocation/main/devtools.gif)
202
+
203
+ ```bash
204
+ npm install @react-native-nitro-geolocation/rozenite-plugin
205
+ # or
206
+ yarn add @react-native-nitro-geolocation/rozenite-plugin
207
+ ```
208
+
209
+ **Setup**:
210
+
211
+ ```tsx
212
+ import {
213
+ useGeolocationDevTools,
214
+ createPosition,
215
+ } from "@react-native-nitro-geolocation/rozenite-plugin";
216
+
217
+ function App() {
218
+ // Enable location mocking in development
219
+ useGeolocationDevTools({
220
+ initialPosition: createPosition("Seoul, South Korea"),
221
+ });
222
+
223
+ return <YourApp />;
224
+ }
225
+ ```
226
+
227
+ **Features**:
228
+
229
+ - 🗺️ Interactive Leaflet map interface
230
+ - 📍 Click to set location instantly
231
+ - ⌨️ Arrow key navigation for precise control
232
+ - 🏙️ 20 pre-configured city presets
233
+ - ✏️ Manual latitude/longitude input
234
+ - 📊 Real-time heading, speed, and accuracy calculation
235
+ - 🌓 Dark mode support
236
+
237
+ [See full DevTools guide →](https://react-native-nitro-geolocation.pages.dev/guide/devtools)
238
+
239
+ ---
240
+
241
+ ### 5. Usage
242
+
243
+ #### Modern API (Recommended)
244
+
245
+ ```tsx
246
+ // Get current location
247
+ const position = await getCurrentPosition({
248
+ accuracy: { android: "high", ios: "best" },
249
+ });
250
+
251
+ // Real-time tracking with hook
252
+ const { position, error } = useWatchPosition({
253
+ enabled: true,
254
+ accuracy: { android: "balanced", ios: "nearestTenMeters" },
255
+ distanceFilter: 10
256
+ });
257
+ ```
258
+
259
+ Accuracy presets are available since `v1.2`.
260
+
261
+ `getLastKnownPosition(options?)`, `getLocationAvailability()`, `getHeading()`,
262
+ `watchHeading()`, `geocode(address)`, `reverseGeocode(coords)`, selected
263
+ Android request options (`granularity`, `waitForAccurateLocation`,
264
+ `maxUpdateAge`, `maxUpdateDelay`, and `maxUpdates`), iOS tuning options
265
+ (`activityType`, `pausesLocationUpdatesAutomatically`, and
266
+ `showsBackgroundLocationIndicator`), `getAccuracyAuthorization()`, and
267
+ `requestTemporaryFullAccuracy(purposeKey)` are available since `v1.2`.
268
+
269
+ `enableHighAccuracy` is deprecated in the Modern API and remains supported only
270
+ for v1 compatibility. Prefer `accuracy`; when `accuracy.android` or
271
+ `accuracy.ios` is provided for the current platform, that explicit preset takes
272
+ precedence over the boolean. `enableHighAccuracy` is expected to be removed from
273
+ the Modern API in v2.
274
+
275
+ The `/compat` API keeps `enableHighAccuracy` for drop-in compatibility with
276
+ `@react-native-community/geolocation`.
277
+
278
+ #### Compat API (Compatibility)
279
+
280
+ ```tsx
281
+ import Geolocation from "react-native-nitro-geolocation/compat";
282
+
283
+ Geolocation.getCurrentPosition((pos) => console.log(pos));
284
+ const watchId = Geolocation.watchPosition((pos) => console.log(pos));
285
+ Geolocation.clearWatch(watchId);
286
+ ```
287
+
288
+ ---
289
+
290
+ ---
291
+
292
+ ## 🔄 Migration from `@react-native-community/geolocation`
293
+
294
+ Change the import to use `/compat` — 100% API compatible:
295
+ ```diff
296
+ - import Geolocation from '@react-native-community/geolocation';
297
+ + import Geolocation from 'react-native-nitro-geolocation/compat';
298
+ ```
299
+
300
+ ---
301
+
302
+ ## 📖 Learn More
303
+
304
+ - [Introduction](https://react-native-nitro-geolocation.pages.dev/guide/)
305
+ - [Quick Start Guide](https://react-native-nitro-geolocation.pages.dev/guide/quick-start)
306
+ - [Modern API Reference](https://react-native-nitro-geolocation.pages.dev/guide/modern-api)
307
+ - [Compat API Reference](https://react-native-nitro-geolocation.pages.dev/guide/compat-api)
308
+ - [DevTools Plugin Guide](https://react-native-nitro-geolocation.pages.dev/guide/devtools)
309
+ - [Why Nitro Module?](https://react-native-nitro-geolocation.pages.dev/guide/why-nitro-module)
310
+ - [Benchmark Results](https://react-native-nitro-geolocation.pages.dev/guide/benchmark)
311
+
312
+ ---
313
+
314
+ ## License
315
+
316
+ MIT License.
@@ -30,6 +30,10 @@ def getExtOrIntegerDefault(name) {
30
30
  return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["NitroGeolocation_" + name]).toInteger()
31
31
  }
32
32
 
33
+ def getExtOrDefaultValue(name, defaultValue) {
34
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["NitroGeolocation_" + name] ?: defaultValue)
35
+ }
36
+
33
37
  android {
34
38
  namespace "com.margelo.nitro.nitrogeolocation"
35
39
 
@@ -123,6 +127,8 @@ def kotlin_version = getExtOrDefault("kotlinVersion")
123
127
 
124
128
  dependencies {
125
129
  implementation "com.facebook.react:react-android"
130
+ implementation "com.google.android.gms:play-services-base:${getExtOrDefaultValue('playServicesBaseVersion', '18.5.0')}"
131
+ implementation "com.google.android.gms:play-services-location:${getExtOrDefaultValue('playServicesLocationVersion', '21.3.0')}"
126
132
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
127
133
  implementation project(":react-native-nitro-modules")
128
134
  }
@@ -0,0 +1,105 @@
1
+ package com.margelo.nitro.nitrogeolocation
2
+
3
+ import android.location.LocationManager
4
+ import com.google.android.gms.location.Granularity
5
+ import com.google.android.gms.location.Priority
6
+
7
+ internal enum class AndroidAccuracyMode {
8
+ HIGH,
9
+ BALANCED,
10
+ LOW,
11
+ PASSIVE
12
+ }
13
+
14
+ internal data class AndroidAccuracyResolution(
15
+ val mode: AndroidAccuracyMode,
16
+ val explicitPreset: AndroidAccuracyPreset?
17
+ )
18
+
19
+ internal fun resolveAndroidAccuracy(
20
+ accuracy: LocationAccuracyOptions?,
21
+ enableHighAccuracy: Boolean
22
+ ): AndroidAccuracyResolution {
23
+ val preset = accuracy?.android
24
+ val mode = when (preset) {
25
+ AndroidAccuracyPreset.HIGH -> AndroidAccuracyMode.HIGH
26
+ AndroidAccuracyPreset.BALANCED -> AndroidAccuracyMode.BALANCED
27
+ AndroidAccuracyPreset.LOW -> AndroidAccuracyMode.LOW
28
+ AndroidAccuracyPreset.PASSIVE -> AndroidAccuracyMode.PASSIVE
29
+ null -> if (enableHighAccuracy) AndroidAccuracyMode.HIGH else AndroidAccuracyMode.BALANCED
30
+ }
31
+
32
+ return AndroidAccuracyResolution(mode = mode, explicitPreset = preset)
33
+ }
34
+
35
+ internal fun AndroidAccuracyResolution.providerOrder(): List<String> {
36
+ return when (mode) {
37
+ AndroidAccuracyMode.HIGH -> listOf(
38
+ LocationManager.GPS_PROVIDER,
39
+ LocationManager.NETWORK_PROVIDER
40
+ )
41
+ AndroidAccuracyMode.BALANCED -> if (explicitPreset == null) {
42
+ listOf(LocationManager.NETWORK_PROVIDER, LocationManager.GPS_PROVIDER)
43
+ } else {
44
+ listOf(LocationManager.NETWORK_PROVIDER)
45
+ }
46
+ AndroidAccuracyMode.LOW -> listOf(
47
+ LocationManager.NETWORK_PROVIDER,
48
+ LocationManager.PASSIVE_PROVIDER
49
+ )
50
+ AndroidAccuracyMode.PASSIVE -> listOf(LocationManager.PASSIVE_PROVIDER)
51
+ }
52
+ }
53
+
54
+ internal fun AndroidAccuracyResolution.gmsPriority(): Int {
55
+ return when (mode) {
56
+ AndroidAccuracyMode.HIGH -> Priority.PRIORITY_HIGH_ACCURACY
57
+ AndroidAccuracyMode.BALANCED -> Priority.PRIORITY_BALANCED_POWER_ACCURACY
58
+ AndroidAccuracyMode.LOW -> Priority.PRIORITY_LOW_POWER
59
+ AndroidAccuracyMode.PASSIVE -> Priority.PRIORITY_PASSIVE
60
+ }
61
+ }
62
+
63
+ internal fun AndroidGranularity?.gmsGranularity(): Int {
64
+ return when (this) {
65
+ AndroidGranularity.COARSE -> Granularity.GRANULARITY_COARSE
66
+ AndroidGranularity.FINE -> Granularity.GRANULARITY_FINE
67
+ AndroidGranularity.PERMISSION,
68
+ null -> Granularity.GRANULARITY_PERMISSION_LEVEL
69
+ }
70
+ }
71
+
72
+ internal fun AndroidGranularity?.allowsProvider(provider: String): Boolean {
73
+ return when (this) {
74
+ AndroidGranularity.COARSE -> provider != LocationManager.GPS_PROVIDER
75
+ AndroidGranularity.FINE,
76
+ AndroidGranularity.PERMISSION,
77
+ null -> true
78
+ }
79
+ }
80
+
81
+ internal fun mostDemandingAndroidAccuracy(
82
+ current: AndroidAccuracyResolution?,
83
+ next: AndroidAccuracyResolution
84
+ ): AndroidAccuracyResolution {
85
+ if (current == null) return next
86
+
87
+ val currentRank = current.mode.demandRank()
88
+ val nextRank = next.mode.demandRank()
89
+
90
+ return when {
91
+ nextRank > currentRank -> next
92
+ nextRank < currentRank -> current
93
+ current.explicitPreset == null && next.explicitPreset != null -> next
94
+ else -> current
95
+ }
96
+ }
97
+
98
+ private fun AndroidAccuracyMode.demandRank(): Int {
99
+ return when (this) {
100
+ AndroidAccuracyMode.PASSIVE -> 0
101
+ AndroidAccuracyMode.LOW -> 1
102
+ AndroidAccuracyMode.BALANCED -> 2
103
+ AndroidAccuracyMode.HIGH -> 3
104
+ }
105
+ }