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