MockLocationProvider.java revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package org.chromium.content.browser.test.util;
6
7import android.os.Handler;
8import android.os.HandlerThread;
9import android.os.Message;
10
11import org.chromium.content.browser.LocationProviderAdapter;
12import org.chromium.content.browser.LocationProviderFactory;
13
14/**
15 * A mock location provider. When started, runs a background thread that periodically
16 * posts location updates. This does not involve any system Location APIs and thus
17 * does not require any special permissions in the test app or on the device.
18 */
19public class MockLocationProvider implements LocationProviderFactory.LocationProvider {
20    private boolean mIsRunning;
21    private Handler mHandler;
22    private HandlerThread mHandlerThread;
23    private final Object mLock = new Object();
24
25    private static final int UPDATE_LOCATION_MSG = 100;
26
27    public MockLocationProvider() {
28    }
29
30    public void stopUpdates() {
31        if (mHandlerThread != null) {
32            mHandlerThread.quit();
33        }
34    }
35
36    @Override
37    public void start(boolean gpsEnabled) {
38        if (mIsRunning) return;
39
40        if (mHandlerThread == null) {
41            startMockLocationProviderThread();
42        }
43
44        mIsRunning = true;
45        synchronized (mLock) {
46            mHandler.sendEmptyMessage(UPDATE_LOCATION_MSG);
47        }
48    }
49
50    @Override
51    public void stop() {
52        if (!mIsRunning) return;
53        mIsRunning = false;
54        synchronized (mLock) {
55            mHandler.removeMessages(UPDATE_LOCATION_MSG);
56        }
57    }
58
59    @Override
60    public boolean isRunning() {
61        return mIsRunning;
62    }
63
64    private void startMockLocationProviderThread() {
65        assert mHandlerThread == null;
66        assert mHandler == null;
67
68        mHandlerThread = new HandlerThread("MockLocationProviderImpl");
69        mHandlerThread.start();
70        mHandler = new Handler(mHandlerThread.getLooper()) {
71            @Override
72            public void handleMessage(Message msg) {
73                synchronized (mLock) {
74                    if (msg.what == UPDATE_LOCATION_MSG) {
75                        newLocation();
76                        sendEmptyMessageDelayed(UPDATE_LOCATION_MSG, 250);
77                    }
78                }
79            }
80        };
81    }
82
83    private void newLocation() {
84        LocationProviderAdapter.newLocationAvailable(
85                0, 0, System.currentTimeMillis() / 1000.0,
86                false, 0,
87                true, 0.5,
88                false, 0,
89                false, 0);
90    }
91};
92
93