Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(221)

Unified Diff: content/public/android/java/src/org/chromium/content/browser/LocationProvider.java

Issue 65273002: Add a mechanism to pause and resume geolocation requests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add new test case, fix a bug :) Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/public/android/java/src/org/chromium/content/browser/LocationProvider.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/LocationProvider.java
index afcc17a68e9bf6b0978667fe5526f91e9e334755..ad2373b3389dae1a35ef431472a52f8f8e09436f 100644
--- a/content/public/android/java/src/org/chromium/content/browser/LocationProvider.java
+++ b/content/public/android/java/src/org/chromium/content/browser/LocationProvider.java
@@ -10,8 +10,13 @@ import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Message;
import android.util.Log;
+import com.google.common.annotations.VisibleForTesting;
+
import org.chromium.base.ActivityStatus;
import org.chromium.base.CalledByNative;
import org.chromium.base.ThreadUtils;
@@ -26,74 +31,118 @@ import java.util.concurrent.FutureTask;
* content/browser/geolocation/android_location_api_adapter.h.
* Based on android.webkit.GeolocationService.java
*/
-class LocationProvider {
+public class LocationProvider {
// Log tag
private static final String TAG = "LocationProvider";
+ private static boolean sUseMockProvider;
+
+ @VisibleForTesting
+ public static void enableMockLocationProvider() {
mkosiba (inactive) 2013/12/09 16:26:08 nit: I think it would be a bit cleaner if the Loca
+ sUseMockProvider = true;
+ }
+
+ private interface ContentLocationProvider {
+ public void start(boolean gpsEnabled);
+ public void stop();
+ public boolean isRunning();
+ }
+
+ private static class MockLocationProviderImpl implements ContentLocationProvider {
+ private boolean mIsRunning;
+ private Handler mHandler;
+ private static final Object mLock = new Object();
+
+ private static final int UPDATE_LOCATION = 100;
+
+ public MockLocationProviderImpl() {
+ HandlerThread handlerThread = new HandlerThread("MockLocationProviderImpl");
+ handlerThread.start();
+ mHandler = new Handler(handlerThread.getLooper()) {
+ @Override
+ public void handleMessage(Message msg) {
+ synchronized(mLock) {
+ if (msg.what == UPDATE_LOCATION) {
+ newLocation();
+ sendEmptyMessageDelayed(UPDATE_LOCATION, 1000);
+ }
+ }
+ }
+ };
+ }
+
+ @Override
+ public void start(boolean gpsEnabled) {
+ if (mIsRunning) return;
+ mIsRunning = true;
+ synchronized (mLock) {
+ mHandler.sendEmptyMessage(UPDATE_LOCATION);
+ }
+ }
+
+ @Override
+ public void stop() {
+ if (!mIsRunning) return;
+ mIsRunning = false;
+ synchronized (mLock) {
+ mHandler.removeMessages(UPDATE_LOCATION);
+ }
+ }
+
+ @Override
+ public boolean isRunning() {
+ return mIsRunning;
+ }
+
+ private void newLocation() {
+ nativeNewLocationAvailable(0, 0, System.currentTimeMillis() / 1000.0,
+ false, 0,
+ true, 0.5,
+ false, 0,
+ false, 0);
+ }
+ };
+
/**
* This is the core of android location provider. It is a separate class for clarity
* so that it can manage all processing completely in the UI thread. The container class
* 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, ContentLocationProvider {
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;
}
@@ -140,7 +189,7 @@ class LocationProvider {
/**
* Registers this object with the location service.
*/
- private void registerForLocationUpdates() {
+ private void registerForLocationUpdates(boolean isGpsEnabled) {
ensureLocationManagerCreated();
if (usePassiveOneShotLocation()) return;
@@ -153,7 +202,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());
@@ -207,10 +256,14 @@ class LocationProvider {
}
// Delegate handling the real work in the main thread.
- private LocationProviderImpl mImpl;
+ private ContentLocationProvider mImpl;
private LocationProvider(Context context) {
- mImpl = new LocationProviderImpl(context);
+ if (sUseMockProvider) {
+ mImpl = new MockLocationProviderImpl();
+ } else {
+ mImpl = new LocationProviderImpl(context);
+ }
}
@CalledByNative

Powered by Google App Engine
This is Rietveld 408576698