diff --git a/Libraries/Geolocation/Geolocation.js b/Libraries/Geolocation/Geolocation.js index 82bc1c9a059c74..42d7378eb102be 100644 --- a/Libraries/Geolocation/Geolocation.js +++ b/Libraries/Geolocation/Geolocation.js @@ -26,6 +26,7 @@ type GeoOptions = { timeout: number; maximumAge: number; enableHighAccuracy: bool; + distanceFilter: number; } /** @@ -68,7 +69,7 @@ var Geolocation = { /* * Invokes the success callback whenever the location changes. Supported - * options: timeout (ms), maximumAge (ms), enableHighAccuracy (bool) + * options: timeout (ms), maximumAge (ms), enableHighAccuracy (bool), distanceFilter(m) */ watchPosition: function(success: Function, error?: Function, options?: GeoOptions): number { if (!updatesEnabled) { diff --git a/Libraries/Geolocation/RCTLocationObserver.m b/Libraries/Geolocation/RCTLocationObserver.m index 63ceb7c9d95d64..e06a0c94829bdb 100644 --- a/Libraries/Geolocation/RCTLocationObserver.m +++ b/Libraries/Geolocation/RCTLocationObserver.m @@ -31,6 +31,7 @@ typedef NS_ENUM(NSInteger, RCTPositionErrorCode) { double timeout; double maximumAge; double accuracy; + double distanceFilter; } RCTLocationOptions; @implementation RCTConvert (RCTLocationOptions) @@ -38,10 +39,15 @@ @implementation RCTConvert (RCTLocationOptions) + (RCTLocationOptions)RCTLocationOptions:(id)json { NSDictionary *options = [RCTConvert NSDictionary:json]; + + double accuracy = options[@"distanceFilter"] == NULL ? RCT_DEFAULT_LOCATION_ACCURACY + : [RCTConvert double:options[@"distanceFilter"]] ?: kCLDistanceFilterNone; + return (RCTLocationOptions){ .timeout = [RCTConvert NSTimeInterval:options[@"timeout"]] ?: INFINITY, .maximumAge = [RCTConvert NSTimeInterval:options[@"maximumAge"]] ?: INFINITY, - .accuracy = [RCTConvert BOOL:options[@"enableHighAccuracy"]] ? kCLLocationAccuracyBest : RCT_DEFAULT_LOCATION_ACCURACY + .accuracy = [RCTConvert BOOL:options[@"enableHighAccuracy"]] ? kCLLocationAccuracyBest : RCT_DEFAULT_LOCATION_ACCURACY, + .distanceFilter = accuracy }; } @@ -128,7 +134,7 @@ - (void)beginLocationUpdates { if (!_locationManager) { _locationManager = [CLLocationManager new]; - _locationManager.distanceFilter = RCT_DEFAULT_LOCATION_ACCURACY; + _locationManager.distanceFilter = _observerOptions.distanceFilter; _locationManager.delegate = self; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/location/LocationModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/location/LocationModule.java index 9973563fc12024..86dec164b26abd 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/location/LocationModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/location/LocationModule.java @@ -36,6 +36,7 @@ public class LocationModule extends ReactContextBaseJavaModule { private @Nullable String mWatchedProvider; + private static final float RCT_DEFAULT_LOCATION_ACCURACY = 100; private final LocationListener mLocationListener = new LocationListener() { @Override @@ -73,11 +74,13 @@ private static class LocationOptions { private final long timeout; private final double maximumAge; private final boolean highAccuracy; + private final float distanceFilter; - private LocationOptions(long timeout, double maximumAge, boolean highAccuracy) { + private LocationOptions(long timeout, double maximumAge, boolean highAccuracy, float distanceFilter) { this.timeout = timeout; this.maximumAge = maximumAge; this.highAccuracy = highAccuracy; + this.distanceFilter = distanceFilter; } private static LocationOptions fromReactMap(ReadableMap map) { @@ -88,8 +91,10 @@ private static LocationOptions fromReactMap(ReadableMap map) { map.hasKey("maximumAge") ? map.getDouble("maximumAge") : Double.POSITIVE_INFINITY; boolean highAccuracy = map.hasKey("enableHighAccuracy") && map.getBoolean("enableHighAccuracy"); + float distanceFilter = + map.hasKey("distanceFilter") ? (float) map.getDouble("distanceFilter") : RCT_DEFAULT_LOCATION_ACCURACY; - return new LocationOptions(timeout, maximumAge, highAccuracy); + return new LocationOptions(timeout, maximumAge, highAccuracy, distanceFilter); } } @@ -151,7 +156,7 @@ public void startObserving(ReadableMap options) { } if (!provider.equals(mWatchedProvider)) { locationManager.removeUpdates(mLocationListener); - locationManager.requestLocationUpdates(provider, 1000, 0, mLocationListener); + locationManager.requestLocationUpdates(provider, 1000, locationOptions.distanceFilter, mLocationListener); } mWatchedProvider = provider; } catch (SecurityException e) {