| Index: device/geolocation/android/java/src/org/chromium/device/geolocation/LocationProviderAndroid.java
|
| diff --git a/device/geolocation/android/java/src/org/chromium/device/geolocation/LocationProviderAndroid.java b/device/geolocation/android/java/src/org/chromium/device/geolocation/LocationProviderAndroid.java
|
| index 261ce9dfd3c147140266a3e244010aec30152027..6c45be9b48a5f36d8e2dcc959e6ddd233b3e070c 100644
|
| --- a/device/geolocation/android/java/src/org/chromium/device/geolocation/LocationProviderAndroid.java
|
| +++ b/device/geolocation/android/java/src/org/chromium/device/geolocation/LocationProviderAndroid.java
|
| @@ -13,6 +13,7 @@ import android.os.Bundle;
|
|
|
| import org.chromium.base.Log;
|
| import org.chromium.base.ThreadUtils;
|
| +import org.chromium.base.VisibleForTesting;
|
|
|
| import java.util.List;
|
|
|
| @@ -37,17 +38,20 @@ public class LocationProviderAndroid
|
|
|
| @Override
|
| public void start(boolean enableHighAccuracy) {
|
| + ThreadUtils.assertOnUiThread();
|
| unregisterFromLocationUpdates();
|
| registerForLocationUpdates(enableHighAccuracy);
|
| }
|
|
|
| @Override
|
| public void stop() {
|
| + ThreadUtils.assertOnUiThread();
|
| unregisterFromLocationUpdates();
|
| }
|
|
|
| @Override
|
| public boolean isRunning() {
|
| + assert ThreadUtils.runningOnUiThread();
|
| return mIsRunning;
|
| }
|
|
|
| @@ -57,7 +61,7 @@ public class LocationProviderAndroid
|
| // possible that we receive callbacks after unregistering. At this point, the
|
| // native object will no longer exist.
|
| if (mIsRunning) {
|
| - updateNewLocation(location);
|
| + LocationProviderAdapter.onNewLocationAvailable(location);
|
| }
|
| }
|
|
|
| @@ -70,7 +74,12 @@ public class LocationProviderAndroid
|
| @Override
|
| public void onProviderDisabled(String provider) {}
|
|
|
| - private void ensureLocationManagerCreated() {
|
| + @VisibleForTesting
|
| + public void setLocationManagerForTesting(LocationManager manager) {
|
| + mLocationManager = manager;
|
| + }
|
| +
|
| + private void createLocationManagerIfNeeded() {
|
| if (mLocationManager != null) return;
|
| mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
|
| if (mLocationManager == null) {
|
| @@ -82,7 +91,7 @@ public class LocationProviderAndroid
|
| * Registers this object with the location service.
|
| */
|
| private void registerForLocationUpdates(boolean enableHighAccuracy) {
|
| - ensureLocationManagerCreated();
|
| + createLocationManagerIfNeeded();
|
| if (usePassiveOneShotLocation()) return;
|
|
|
| assert !mIsRunning;
|
| @@ -103,8 +112,8 @@ public class LocationProviderAndroid
|
| unregisterFromLocationUpdates();
|
| // Propagate an error to JavaScript, this can happen in case of WebView
|
| // when the embedding app does not have sufficient permissions.
|
| - LocationProviderAdapter.newErrorAvailable("application does not have sufficient "
|
| - + "geolocation permissions.");
|
| + LocationProviderAdapter.newErrorAvailable(
|
| + "application does not have sufficient geolocation permissions.");
|
| } catch (IllegalArgumentException e) {
|
| Log.e(TAG, "Caught IllegalArgumentException registering for location updates.");
|
| unregisterFromLocationUpdates();
|
| @@ -116,33 +125,26 @@ public class LocationProviderAndroid
|
| * Unregisters this object from the location service.
|
| */
|
| private void unregisterFromLocationUpdates() {
|
| - if (mIsRunning) {
|
| - mIsRunning = false;
|
| - mLocationManager.removeUpdates(this);
|
| - }
|
| - }
|
| -
|
| - private void updateNewLocation(Location location) {
|
| - LocationProviderAdapter.newLocationAvailable(location.getLatitude(),
|
| - location.getLongitude(), location.getTime() / 1000.0, location.hasAltitude(),
|
| - location.getAltitude(), location.hasAccuracy(), location.getAccuracy(),
|
| - location.hasBearing(), location.getBearing(), location.hasSpeed(),
|
| - location.getSpeed());
|
| + if (!mIsRunning) return;
|
| + mIsRunning = false;
|
| + mLocationManager.removeUpdates(this);
|
| }
|
|
|
| private boolean usePassiveOneShotLocation() {
|
| - if (!isOnlyPassiveLocationProviderEnabled()) return false;
|
| + if (!isOnlyPassiveLocationProviderEnabled()) {
|
| + return false;
|
| + }
|
|
|
| // Do not request a location update if the only available location provider is
|
| // the passive one. Make use of the last known location and call
|
| - // onLocationChanged directly.
|
| + // onNewLocationAvailable directly.
|
| final Location location =
|
| mLocationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);
|
| if (location != null) {
|
| ThreadUtils.runOnUiThread(new Runnable() {
|
| @Override
|
| public void run() {
|
| - updateNewLocation(location);
|
| + LocationProviderAdapter.onNewLocationAvailable(location);
|
| }
|
| });
|
| }
|
| @@ -154,7 +156,7 @@ public class LocationProviderAndroid
|
| * in the system.
|
| */
|
| private boolean isOnlyPassiveLocationProviderEnabled() {
|
| - List<String> providers = mLocationManager.getProviders(true);
|
| + final List<String> providers = mLocationManager.getProviders(true);
|
| return providers != null && providers.size() == 1
|
| && providers.get(0).equals(LocationManager.PASSIVE_PROVIDER);
|
| }
|
|
|