Index: content/public/test/android/javatests/src/org/chromium/content/browser/test/util/MockLocationProvider.java |
diff --git a/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/MockLocationProvider.java b/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/MockLocationProvider.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5b0db392c7ec3e8c58dc696658b238e6838111af |
--- /dev/null |
+++ b/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/MockLocationProvider.java |
@@ -0,0 +1,92 @@ |
+// 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. |
+ |
+package org.chromium.content.browser.test.util; |
+ |
+import android.os.Handler; |
+import android.os.HandlerThread; |
+import android.os.Message; |
+ |
+import org.chromium.content.browser.LocationProviderAdapter; |
+import org.chromium.content.browser.LocationProviderFactory; |
+ |
+/** |
+ * A mock location provider. When started, runs a background thread that periodically |
+ * posts location updates. This does not involve any system Location APIs and thus |
+ * does not require any special permissions in the test app or on the device. |
+ */ |
+public class MockLocationProvider implements LocationProviderFactory.LocationProvider { |
+ private boolean mIsRunning; |
+ private Handler mHandler; |
+ private HandlerThread mHandlerThread; |
+ private static final Object mLock = new Object(); |
+ |
+ private static final int UPDATE_LOCATION_MSG = 100; |
+ |
+ public MockLocationProvider() { |
+ } |
+ |
+ public void stopUpdates() { |
+ if (mHandlerThread != null) { |
+ mHandlerThread.quit(); |
+ } |
+ } |
+ |
+ @Override |
+ public void start(boolean gpsEnabled) { |
+ if (mIsRunning) return; |
+ |
+ if (mHandlerThread == null) { |
+ startMockLocationProviderThread(); |
+ } |
+ |
+ mIsRunning = true; |
+ synchronized (mLock) { |
+ mHandler.sendEmptyMessage(UPDATE_LOCATION_MSG); |
+ } |
+ } |
+ |
+ @Override |
+ public void stop() { |
+ if (!mIsRunning) return; |
+ mIsRunning = false; |
+ synchronized (mLock) { |
+ mHandler.removeMessages(UPDATE_LOCATION_MSG); |
+ } |
+ } |
+ |
+ @Override |
+ public boolean isRunning() { |
+ return mIsRunning; |
+ } |
+ |
+ private void startMockLocationProviderThread() { |
+ assert mHandlerThread == null; |
+ assert mHandler == null; |
+ |
+ mHandlerThread = new HandlerThread("MockLocationProviderImpl"); |
+ mHandlerThread.start(); |
+ mHandler = new Handler(mHandlerThread.getLooper()) { |
+ @Override |
+ public void handleMessage(Message msg) { |
+ synchronized (mLock) { |
+ if (msg.what == UPDATE_LOCATION_MSG) { |
+ newLocation(); |
+ sendEmptyMessageDelayed(UPDATE_LOCATION_MSG, 250); |
+ } |
+ } |
+ } |
+ }; |
+ } |
+ |
+ private void newLocation() { |
+ LocationProviderAdapter.newLocationAvailable( |
+ 0, 0, System.currentTimeMillis() / 1000.0, |
+ false, 0, |
+ true, 0.5, |
+ false, 0, |
+ false, 0); |
+ } |
+}; |
+ |