| 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..1d7f43bb57d82ad0e9d879aa6bf1cc20e37085a0
 | 
| --- /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 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 enableHighAccuracy) {
 | 
| +        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);
 | 
| +    }
 | 
| +};
 | 
| +
 | 
| 
 |