Index: content/public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java |
diff --git a/content/public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java b/content/public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1ad8a3bcefac52ed9b415a9cb12261b5c70b5721 |
--- /dev/null |
+++ b/content/public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java |
@@ -0,0 +1,100 @@ |
+// 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 com.google.common.annotations.VisibleForTesting; |
+ |
+import org.chromium.base.CalledByNative; |
+import org.chromium.base.ThreadUtils; |
+ |
+import java.util.concurrent.FutureTask; |
+ |
+/** |
+ * Implements the Java side of LocationProviderAndroid. |
+ * Delegates all real functionality to the implementation |
+ * returned from LocationProviderFactory. |
+ * See detailed documentation on |
+ * content/browser/geolocation/android_location_api_adapter.h. |
+ * Based on android.webkit.GeolocationService.java |
+ */ |
+@VisibleForTesting |
+public class LocationProviderAdapter { |
+ |
+ // Delegate handling the real work in the main thread. |
+ private LocationProviderFactory.LocationProvider mImpl; |
+ |
+ private LocationProviderAdapter(Context context) { |
+ mImpl = LocationProviderFactory.get(context); |
+ } |
+ |
+ @CalledByNative |
+ static LocationProviderAdapter create(Context context) { |
+ return new LocationProviderAdapter(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(); |
+ } |
+ |
+ public static void newLocationAvailable(double latitude, double longitude, double timestamp, |
+ boolean hasAltitude, double altitude, |
+ boolean hasAccuracy, double accuracy, |
+ boolean hasHeading, double heading, |
+ boolean hasSpeed, double speed) { |
+ nativeNewLocationAvailable(latitude, longitude, timestamp, hasAltitude, altitude, |
+ hasAccuracy, accuracy, hasHeading, heading, hasSpeed, speed); |
+ } |
+ |
+ public static void newErrorAvailable(String message) { |
+ nativeNewErrorAvailable(message); |
+ } |
+ |
+ // Native functions |
+ private 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); |
+ private static native void nativeNewErrorAvailable(String message); |
+} |