MockLocationProvider.java revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Copyright 2013 The Chromium Authors. All rights reserved.
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// found in the LICENSE file.
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpackage org.chromium.content.browser.test.util;
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.os.Handler;
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.os.HandlerThread;
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.os.Message;
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport org.chromium.content.browser.LocationProviderAdapter;
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport org.chromium.content.browser.LocationProviderFactory;
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/**
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * A mock location provider. When started, runs a background thread that periodically
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * posts location updates. This does not involve any system Location APIs and thus
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * does not require any special permissions in the test app or on the device.
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */
1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic class MockLocationProvider implements LocationProviderFactory.LocationProvider {
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    private boolean mIsRunning;
2134fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn    private Handler mHandler;
2234fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn    private HandlerThread mHandlerThread;
237562408b2261d38415453378b6188f74fda99d88Mathias Agopian    private static final Object mLock = new Object();
247562408b2261d38415453378b6188f74fda99d88Mathias Agopian
2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    private static final int UPDATE_LOCATION_MSG = 100;
261b86fe063badb5f28c467ade39be0f4008688947Andreas Huber
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    public MockLocationProvider() {
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    public void stopUpdates() {
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mHandlerThread != null) {
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mHandlerThread.quit();
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    @Override
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    public void start(boolean gpsEnabled) {
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mIsRunning) return;
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mHandlerThread == null) {
417fc9a6fdf146ded90b51c52f4a05d797294dcb85Glenn Kasten            startMockLocationProviderThread();
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mIsRunning = true;
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        synchronized (mLock) {
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mHandler.sendEmptyMessage(UPDATE_LOCATION_MSG);
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
495ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    @Override
51e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    public void stop() {
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (!mIsRunning) return;
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mIsRunning = false;
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        synchronized (mLock) {
5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mHandler.removeMessages(UPDATE_LOCATION_MSG);
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
5829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    @Override
6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    public boolean isRunning() {
6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mIsRunning;
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
643856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    private void startMockLocationProviderThread() {
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        assert mHandlerThread == null;
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        assert mHandler == null;
6729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mHandlerThread = new HandlerThread("MockLocationProviderImpl");
6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mHandlerThread.start();
708d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten        mHandler = new Handler(mHandlerThread.getLooper()) {
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            @Override
7229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            public void handleMessage(Message msg) {
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                synchronized (mLock) {
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    if (msg.what == UPDATE_LOCATION_MSG) {
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                        newLocation();
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                        sendEmptyMessageDelayed(UPDATE_LOCATION_MSG, 250);
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    }
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                }
793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            }
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        };
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    private void newLocation() {
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LocationProviderAdapter.newLocationAvailable(
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                0, 0, System.currentTimeMillis() / 1000.0,
863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                false, 0,
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                true, 0.5,
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                false, 0,
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                false, 0);
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project