diff --git a/README.md b/README.md index f1b9104..a16c25b 100644 --- a/README.md +++ b/README.md @@ -116,12 +116,15 @@ You can call `configure` multiple times at it will only change the setting which ```javascript RNLocation.configure({ - distanceFilter: 0, + distanceFilter: 100, // Meters + desiredAccuracy: { + ios: "best", + android: "balancedPowerAccuracy" + }, // iOS Only activityType: "other", allowsBackgroundLocationUpdates: false, - desiredAccuracy: "best", - headingFilter: 1, + headingFilter: 1, // Degrees headingOrientation: "portrait", pausesLocationUpdatesAutomatically: false, showsBackgroundLocationIndicator: false, diff --git a/android/src/main/java/com/github/reactnativecommunity/location/RNFusedLocationProvider.java b/android/src/main/java/com/github/reactnativecommunity/location/RNFusedLocationProvider.java index bfd0fd8..a421b09 100644 --- a/android/src/main/java/com/github/reactnativecommunity/location/RNFusedLocationProvider.java +++ b/android/src/main/java/com/github/reactnativecommunity/location/RNFusedLocationProvider.java @@ -70,6 +70,37 @@ public void configure(final Activity activity, final ReadableMap options, final } } + // Priority + if (options.hasKey("desiredAccuracy")) { + if (options.getType("desiredAccuracy") == ReadableType.Map) { + ReadableMap desiredAccuracy = options.getMap("desiredAccuracy"); + if (desiredAccuracy.hasKey("android")) { + if (desiredAccuracy.getType("android") == ReadableType.String) { + String desiredAccuracyAndroid = desiredAccuracy.getString("android"); + if (desiredAccuracyAndroid.equals("balancedPowerAccuracy")) { + locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); + hasChanges = true; + } else if (desiredAccuracyAndroid.equals("highAccuracy")) { + locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); + hasChanges = true; + } else if (desiredAccuracyAndroid.equals("lowPower")) { + locationRequest.setPriority(LocationRequest.PRIORITY_LOW_POWER); + hasChanges = true; + } else if (desiredAccuracyAndroid.equals("noPower")) { + locationRequest.setPriority(LocationRequest.PRIORITY_NO_POWER); + hasChanges = true; + } else { + Utils.emitWarning(context, "desiredAccuracy.android was passed an unknown value: " + desiredAccuracyAndroid, "401"); + } + } else { + Utils.emitWarning(context, "desiredAccuracy.android must be a string", "401"); + } + } + } else { + Utils.emitWarning(context, "desiredAccuracy must be an object", "401"); + } + } + // Return early if no changes were made if (!hasChanges) { promise.resolve(null); diff --git a/example/App.js b/example/App.js index 1c6c591..c4bcc6b 100644 --- a/example/App.js +++ b/example/App.js @@ -46,8 +46,8 @@ export default class App extends React.PureComponent { _startUpdatingLocation = () => { this.locationSubscription = RNLocation.subscribeToLocationUpdates( - location => { - this.setState({ location }); + locations => { + this.setState({ location: locations[0] }); } ); }; @@ -101,21 +101,21 @@ export default class App extends React.PureComponent { Course - {location.coords.course} + {location.course} Speed - {location.coords.speed} + {location.speed} Altitude - {location.coords.altitude} + {location.altitude} @@ -124,31 +124,25 @@ export default class App extends React.PureComponent { Latitude - - {location.coords.latitude} - + {location.latitude} Longitude - - {location.coords.longitude} - + {location.longitude} Accuracy - - {location.coords.accuracy} - + {location.accuracy} Altitude Accuracy - {location.coords.altitudeAccuracy} + {location.altitudeAccuracy} diff --git a/ios/RNLocation.m b/ios/RNLocation.m index d27b88a..84432da 100644 --- a/ios/RNLocation.m +++ b/ios/RNLocation.m @@ -141,17 +141,20 @@ - (void)stopObserving } // Desired accuracy - NSString *desiredAccuracy = [RCTConvert NSString:options[@"desiredAccuracy"]]; - if ([desiredAccuracy isEqualToString:@"bestForNavigation"]) { - self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; - } else if ([desiredAccuracy isEqualToString:@"best"]) { - self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; - } else if ([desiredAccuracy isEqualToString:@"nearestTenMeters"]) { - self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters; - } else if ([desiredAccuracy isEqualToString:@"hundredMeters"]) { - self.locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; - } else if ([desiredAccuracy isEqualToString:@"threeKilometers"]) { - self.locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers; + NSDictionary *desiredAccuracy = [RCTConvert NSDictionary:options[@"desiredAccuracy"]]; + if (desiredAccuracy != nil) { + NSString *desiredAccuracyIOS = [RCTConvert NSString:desiredAccuracy[@"ios"]]; + if ([desiredAccuracyIOS isEqualToString:@"bestForNavigation"]) { + self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; + } else if ([desiredAccuracyIOS isEqualToString:@"best"]) { + self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; + } else if ([desiredAccuracyIOS isEqualToString:@"nearestTenMeters"]) { + self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters; + } else if ([desiredAccuracyIOS isEqualToString:@"hundredMeters"]) { + self.locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; + } else if ([desiredAccuracyIOS isEqualToString:@"threeKilometers"]) { + self.locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers; + } } // Distance filter @@ -171,11 +174,11 @@ - (void)stopObserving NSString *headingOrientation = [RCTConvert NSString:options[@"headingOrientation"]]; if ([headingOrientation isEqualToString:@"portrait"]) { self.locationManager.headingOrientation = CLDeviceOrientationPortrait; - } else if ([desiredAccuracy isEqualToString:@"portraitUpsideDown"]) { + } else if ([headingOrientation isEqualToString:@"portraitUpsideDown"]) { self.locationManager.headingOrientation = CLDeviceOrientationPortraitUpsideDown; - } else if ([desiredAccuracy isEqualToString:@"landscapeLeft"]) { + } else if ([headingOrientation isEqualToString:@"landscapeLeft"]) { self.locationManager.headingOrientation = CLDeviceOrientationLandscapeLeft; - } else if ([desiredAccuracy isEqualToString:@"landscapeRight"]) { + } else if ([headingOrientation isEqualToString:@"landscapeRight"]) { self.locationManager.headingOrientation = CLDeviceOrientationLandscapeRight; } diff --git a/src/types.ts b/src/types.ts index 99b76e7..a738ed1 100644 --- a/src/types.ts +++ b/src/types.ts @@ -16,11 +16,21 @@ export type LocationActivityType = | "otherNavigation" | "airborne"; // iOS 12+ /** - * The accuracy of a geographical coordinate. + * The accuracy of the location responses for Android. * @platform ios * @see [Apple Docs](https://developer.apple.com/documentation/corelocation/cllocationaccuracy?language=objc) */ -export type LocationAccuracy = +export type LocationPriorityAndroid = + | "balancedPowerAccuracy" + | "highAccuracy" + | "lowPower" + | "noPower"; +/** + * The accuracy of a geographical coordinate for iOS. + * @platform ios + * @see [Apple Docs](https://developer.apple.com/documentation/corelocation/cllocationaccuracy?language=objc) + */ +export type LocationAccuracyIOS = | "bestForNavigation" | "best" | "nearestTenMeters" @@ -132,11 +142,15 @@ export interface ConfigureOptions { */ allowsBackgroundLocationUpdates?: boolean | void; /** - * The accuracy of the location data. Defaults to `best`. - * @platform ios + * The accuracy of the location data. Defaults to `best` on iOS and `balancedPowerAccuracy` on Android. + * @platform android ios * @see [Apple Docs](https://developer.apple.com/documentation/corelocation/cllocationmanager/1423836-desiredaccuracy) + * @see [Android Docs](https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#setPriority(int)) */ - desiredAccuracy?: LocationAccuracy | void; + desiredAccuracy?: { + ios?: LocationAccuracyIOS | void; + android?: LocationPriorityAndroid | void; + } | void; /** * The minimum angle in degrees that the device heading needs to change before the heading update callback in your app is called. Defaults to `0` for no filtering. * @platform ios