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

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: 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
deleted file mode 100644
index 9c8ac56a43d44f17b7d71f0ca3d2dded694001bc..0000000000000000000000000000000000000000
--- a/content/public/android/java/src/org/chromium/content/browser/LocationProvider.java
+++ /dev/null
@@ -1,269 +0,0 @@
-// Copyright 2012 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.
-
-package org.chromium.content.browser;
-
-import android.content.Context;
-import android.location.Criteria;
-import android.location.Location;
-import android.location.LocationListener;
-import android.location.LocationManager;
-import android.os.Bundle;
-import android.util.Log;
-
-import org.chromium.base.ActivityStatus;
-import org.chromium.base.CalledByNative;
-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
- */
-class LocationProvider {
-
- // Log tag
- private static final String TAG = "LocationProvider";
-
- /**
- * 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 {
-
- 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();
- }
- }
-
- /**
- * Stop listening for location updates.
- */
- private void stop() {
- unregisterFromLocationUpdates();
- ActivityStatus.unregisterStateListener(this);
- mShouldRunAfterActivityResume = false;
- }
-
- /**
- * Returns true if we are currently listening for location updates, false if not.
- */
- private boolean isRunning() {
- return mIsRunning;
- }
-
- @Override
- public void onLocationChanged(Location location) {
- // Callbacks from the system location sevice are queued to this thread, so it's
- // possible that we receive callbacks after unregistering. At this point, the
- // native object will no longer exist.
- if (mIsRunning) {
- updateNewLocation(location);
- }
- }
-
- private void updateNewLocation(Location location) {
- nativeNewLocationAvailable(location.getLatitude(), location.getLongitude(),
- location.getTime() / 1000.0,
- location.hasAltitude(), location.getAltitude(),
- location.hasAccuracy(), location.getAccuracy(),
- location.hasBearing(), location.getBearing(),
- location.hasSpeed(), location.getSpeed());
- }
-
- @Override
- public void onStatusChanged(String provider, int status, Bundle extras) {
- }
-
- @Override
- public void onProviderEnabled(String provider) {
- }
-
- @Override
- public void onProviderDisabled(String provider) {
- }
-
- private void ensureLocationManagerCreated() {
- if (mLocationManager != null) return;
- mLocationManager = (LocationManager) mContext.getSystemService(
- Context.LOCATION_SERVICE);
- if (mLocationManager == null) {
- Log.e(TAG, "Could not get location manager.");
- }
- }
-
- /**
- * Registers this object with the location service.
- */
- private void registerForLocationUpdates() {
- ensureLocationManagerCreated();
- if (usePassiveOneShotLocation()) return;
-
- assert !mIsRunning;
- mIsRunning = true;
-
- // We're running on the main thread. The C++ side is responsible to
- // bounce notifications to the Geolocation thread as they arrive in the mainLooper.
- try {
- Criteria criteria = new Criteria();
- mLocationManager.requestLocationUpdates(0, 0, criteria, this,
- ThreadUtils.getUiThreadLooper());
- if (mIsGpsEnabled) {
- criteria.setAccuracy(Criteria.ACCURACY_FINE);
- mLocationManager.requestLocationUpdates(0, 0, criteria, this,
- ThreadUtils.getUiThreadLooper());
- }
- } catch (SecurityException e) {
- Log.e(TAG, "Caught security exception registering for location updates from " +
- "system. This should only happen in DumpRenderTree.");
- } catch (IllegalArgumentException e) {
- Log.e(TAG, "Caught IllegalArgumentException registering for location updates.");
- }
- }
-
- /**
- * Unregisters this object from the location service.
- */
- private void unregisterFromLocationUpdates() {
- if (mIsRunning) {
- mIsRunning = false;
- mLocationManager.removeUpdates(this);
- }
- }
-
- private boolean usePassiveOneShotLocation() {
- 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.
- final Location location = mLocationManager.getLastKnownLocation(
- LocationManager.PASSIVE_PROVIDER);
- if (location != null) {
- ThreadUtils.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- updateNewLocation(location);
- }
- });
- }
- return true;
- }
-
- /*
- * Checks if the passive location provider is the only provider available
- * in the system.
- */
- private boolean isOnlyPassiveLocationProviderEnabled() {
- List<String> providers = mLocationManager.getProviders(true);
- return providers != null && providers.size() == 1
- && 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);
-}
« no previous file with comments | « content/content_jni.gypi ('k') | content/public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698