From c6024f6391a78502dee6f2841c53daf37a61ed6c Mon Sep 17 00:00:00 2001 From: Gant Laborde Date: Tue, 20 Sep 2016 05:46:59 -0700 Subject: [PATCH] - Add ability to detect if location was mocked Summary: Since API 18, Android locations have had the `isFromMockProvider()` function, to verify the validity of a provided location. This was one of many methods one could verify location data, but as of Marshmallow, the other ways of detecting if "Mock Locations" is on in developer settings has been deprecated or defunct. This means some devices can only detect location mocking by exposing the method on the location object. This change provides that exposure. Closes https://github.com/facebook/react-native/pull/9390 Differential Revision: D3858205 Pulled By: bestander fbshipit-source-id: 3bae429cc0596ea01926c5be204f4403e4a2414f --- Libraries/Geolocation/Geolocation.js | 5 ++++- .../react/modules/location/LocationModule.java | 5 +++++ flow/Position.js | 14 ++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 flow/Position.js diff --git a/Libraries/Geolocation/Geolocation.js b/Libraries/Geolocation/Geolocation.js index 8e943b0352a..6f6c27f20f7 100644 --- a/Libraries/Geolocation/Geolocation.js +++ b/Libraries/Geolocation/Geolocation.js @@ -31,7 +31,7 @@ type GeoOptions = { } /** - * The Geolocation API follows the web spec: + * The Geolocation API extends the web spec: * https://developer.mozilla.org/en-US/docs/Web/API/Geolocation * * As a browser polyfill, this API is available through the `navigator.geolocation` @@ -48,6 +48,9 @@ type GeoOptions = { * * `` * + * Android API >= 18 Positions will also contain a `mocked` boolean to indicate if position + * was created from a mock provider. + * */ var Geolocation = { 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 52235a30c63..ea0ed5a5c8a 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 @@ -214,6 +214,11 @@ public class LocationModule extends ReactContextBaseJavaModule { coords.putDouble("speed", location.getSpeed()); map.putMap("coords", coords); map.putDouble("timestamp", location.getTime()); + + if (android.os.Build.VERSION.SDK_INT >= 18) { + map.putBoolean("mocked", location.isFromMockProvider()); + } + return map; } diff --git a/flow/Position.js b/flow/Position.js new file mode 100644 index 00000000000..3ec6e087ee4 --- /dev/null +++ b/flow/Position.js @@ -0,0 +1,14 @@ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +declare class Position { + coords: Coordinates, + timestamp: number, + mocked: boolean, +}