Index: content/public/android/java/src/org/chromium/content/browser/LocationProviderFactory.java |
diff --git a/content/public/android/java/src/org/chromium/content/browser/LocationProvider.java b/content/public/android/java/src/org/chromium/content/browser/LocationProviderFactory.java |
similarity index 59% |
rename from content/public/android/java/src/org/chromium/content/browser/LocationProvider.java |
rename to content/public/android/java/src/org/chromium/content/browser/LocationProviderFactory.java |
index 9c8ac56a43d44f17b7d71f0ca3d2dded694001bc..b88ad597748b9489bce93ac97c278c54340f167a 100644 |
--- a/content/public/android/java/src/org/chromium/content/browser/LocationProvider.java |
+++ b/content/public/android/java/src/org/chromium/content/browser/LocationProviderFactory.java |
@@ -1,4 +1,4 @@ |
-// Copyright 2012 The Chromium Authors. All rights reserved. |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
@@ -12,24 +12,43 @@ import android.location.LocationManager; |
import android.os.Bundle; |
import android.util.Log; |
-import org.chromium.base.ActivityStatus; |
-import org.chromium.base.CalledByNative; |
+import com.google.common.annotations.VisibleForTesting; |
+ |
import org.chromium.base.ThreadUtils; |
import java.util.List; |
-import java.util.concurrent.FutureTask; |
/** |
- * Implements the Java side of LocationProviderAndroid. |
- * Delegates all real functionality to the inner class. |
- * See detailed documentation on |
- * content/browser/geolocation/android_location_api_adapter.h. |
- * Based on android.webkit.GeolocationService.java |
+ * Factory to create a LocationProvider to allow us to inject |
+ * a mock for tests. |
*/ |
-class LocationProvider { |
+public class LocationProviderFactory { |
+ private static LocationProviderFactory.LocationProvider sProviderImpl; |
+ |
+ /** |
+ * LocationProviderFactory.get() returns an instance of this interface. |
+ */ |
+ public interface LocationProvider { |
+ public void start(boolean gpsEnabled); |
+ public void stop(); |
+ public boolean isRunning(); |
+ } |
- // Log tag |
- private static final String TAG = "LocationProvider"; |
+ private LocationProviderFactory() { |
+ } |
+ |
+ @VisibleForTesting |
+ public static void setLocationProviderImpl(LocationProviderFactory.LocationProvider provider) { |
+ assert sProviderImpl == null; |
+ sProviderImpl = provider; |
+ } |
+ |
+ public static LocationProvider get(Context context) { |
+ if (sProviderImpl == null) { |
+ sProviderImpl = new LocationProviderImpl(context); |
+ } |
+ return sProviderImpl; |
+ } |
/** |
* This is the core of android location provider. It is a separate class for clarity |
@@ -37,63 +56,42 @@ class LocationProvider { |
* ensures that the start/stop calls into this class are done in the UI thread. |
*/ |
private static class LocationProviderImpl |
- implements LocationListener, ActivityStatus.StateListener { |
+ implements LocationListener, LocationProviderFactory.LocationProvider { |
+ |
+ // Log tag |
+ private static final String TAG = "LocationProvider"; |
private Context mContext; |
private LocationManager mLocationManager; |
private boolean mIsRunning; |
- private boolean mShouldRunAfterActivityResume; |
- private boolean mIsGpsEnabled; |
LocationProviderImpl(Context context) { |
mContext = context; |
} |
- @Override |
- public void onActivityStateChange(int state) { |
- if (state == ActivityStatus.PAUSED) { |
- mShouldRunAfterActivityResume |= mIsRunning; |
- unregisterFromLocationUpdates(); |
- } else if (state == ActivityStatus.RESUMED) { |
- assert !mIsRunning; |
- if (mShouldRunAfterActivityResume) { |
- registerForLocationUpdates(); |
- } |
- } |
- } |
- |
/** |
* Start listening for location updates. |
* @param gpsEnabled Whether or not we're interested in high accuracy GPS. |
*/ |
- private void start(boolean gpsEnabled) { |
- if (!mIsRunning && !mShouldRunAfterActivityResume) { |
- // Currently idle so start listening to activity status changes. |
- ActivityStatus.registerStateListener(this); |
- } |
- mIsGpsEnabled = gpsEnabled; |
- |
- if (ActivityStatus.getState() != ActivityStatus.RESUMED) { |
- mShouldRunAfterActivityResume = true; |
- } else { |
- unregisterFromLocationUpdates(); |
- registerForLocationUpdates(); |
- } |
+ @Override |
+ public void start(boolean gpsEnabled) { |
+ unregisterFromLocationUpdates(); |
+ registerForLocationUpdates(gpsEnabled); |
} |
/** |
* Stop listening for location updates. |
*/ |
- private void stop() { |
+ @Override |
+ public void stop() { |
unregisterFromLocationUpdates(); |
- ActivityStatus.unregisterStateListener(this); |
- mShouldRunAfterActivityResume = false; |
} |
/** |
* Returns true if we are currently listening for location updates, false if not. |
*/ |
- private boolean isRunning() { |
+ @Override |
+ public boolean isRunning() { |
return mIsRunning; |
} |
@@ -108,7 +106,8 @@ class LocationProvider { |
} |
private void updateNewLocation(Location location) { |
- nativeNewLocationAvailable(location.getLatitude(), location.getLongitude(), |
+ LocationProviderAdapter.newLocationAvailable( |
+ location.getLatitude(), location.getLongitude(), |
location.getTime() / 1000.0, |
location.hasAltitude(), location.getAltitude(), |
location.hasAccuracy(), location.getAccuracy(), |
@@ -140,7 +139,7 @@ class LocationProvider { |
/** |
* Registers this object with the location service. |
*/ |
- private void registerForLocationUpdates() { |
+ private void registerForLocationUpdates(boolean isGpsEnabled) { |
ensureLocationManagerCreated(); |
if (usePassiveOneShotLocation()) return; |
@@ -153,7 +152,7 @@ class LocationProvider { |
Criteria criteria = new Criteria(); |
mLocationManager.requestLocationUpdates(0, 0, criteria, this, |
ThreadUtils.getUiThreadLooper()); |
- if (mIsGpsEnabled) { |
+ if (isGpsEnabled) { |
criteria.setAccuracy(Criteria.ACCURACY_FINE); |
mLocationManager.requestLocationUpdates(0, 0, criteria, this, |
ThreadUtils.getUiThreadLooper()); |
@@ -205,65 +204,6 @@ class LocationProvider { |
&& providers.get(0).equals(LocationManager.PASSIVE_PROVIDER); |
} |
} |
+} |
- // Delegate handling the real work in the main thread. |
- private LocationProviderImpl mImpl; |
- |
- private LocationProvider(Context context) { |
- mImpl = new LocationProviderImpl(context); |
- } |
- |
- @CalledByNative |
- static LocationProvider create(Context context) { |
- return new LocationProvider(context); |
- } |
- |
- /** |
- * Start listening for location updates until we're told to quit. May be |
- * called in any thread. |
- * @param gpsEnabled Whether or not we're interested in high accuracy GPS. |
- */ |
- @CalledByNative |
- public boolean start(final boolean gpsEnabled) { |
- FutureTask<Void> task = new FutureTask<Void>(new Runnable() { |
- @Override |
- public void run() { |
- mImpl.start(gpsEnabled); |
- } |
- }, null); |
- ThreadUtils.runOnUiThread(task); |
- return true; |
- } |
- |
- /** |
- * Stop listening for location updates. May be called in any thread. |
- */ |
- @CalledByNative |
- public void stop() { |
- FutureTask<Void> task = new FutureTask<Void>(new Runnable() { |
- @Override |
- public void run() { |
- mImpl.stop(); |
- } |
- }, null); |
- ThreadUtils.runOnUiThread(task); |
- } |
- |
- /** |
- * Returns true if we are currently listening for location updates, false if not. |
- * Must be called only in the UI thread. |
- */ |
- public boolean isRunning() { |
- assert ThreadUtils.runningOnUiThread(); |
- return mImpl.isRunning(); |
- } |
- // Native functions |
- public static native void nativeNewLocationAvailable( |
- double latitude, double longitude, double timeStamp, |
- boolean hasAltitude, double altitude, |
- boolean hasAccuracy, double accuracy, |
- boolean hasHeading, double heading, |
- boolean hasSpeed, double speed); |
- public static native void nativeNewErrorAvailable(String message); |
-} |