19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 Google Inc.
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.location;
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.PendingIntent;
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.Criteria;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.Location;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.LocationManager;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.AndroidTestCase;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.MediumTest;
2978a1c9067fec4664e36df5b0ccbc4e16979fcb35Brett Chabotimport android.test.suitebuilder.annotation.Suppress;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Tests for LocationManager.addProximityAlert
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TODO: add tests for more scenarios
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * To run:
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  adb shell am instrument -e class android.location.LocationManagerProximityTest \
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     -w android.core/android.test.InstrumentationTestRunner
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4178a1c9067fec4664e36df5b0ccbc4e16979fcb35Brett Chabot * This test requires that the "Allow mock locations" setting be enabled.
4278a1c9067fec4664e36df5b0ccbc4e16979fcb35Brett Chabot * To ensure reliable results, all location providers should be disabled.
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
4578a1c9067fec4664e36df5b0ccbc4e16979fcb35Brett Chabot@Suppress
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@MediumTest
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class LocationManagerProximityTest extends AndroidTestCase {
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int UPDATE_LOCATION_WAIT_TIME = 1000;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int PROXIMITY_WAIT_TIME = 2000;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private LocationManager mLocationManager;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PendingIntent mPendingIntent;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private TestIntentReceiver mIntentReceiver;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String LOG_TAG = "LocationProximityTest";
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
587f7840b41e1253b1bb03e40014611a37adec7c6cMike Lockwood    private static final String PROVIDER_NAME = "test";
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void setUp() throws Exception {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.setUp();
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // test that mock locations are allowed so a more descriptive error message can be logged
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Settings.Secure.getInt(getContext().getContentResolver(),
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Settings.Secure.ALLOW_MOCK_LOCATION, 0) == 0) {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fail("Mock locations are currently disabled in Settings - this test requires " +
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 "mock locations");
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLocationManager = (LocationManager) getContext().
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getSystemService(Context.LOCATION_SERVICE);
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mLocationManager.getProvider(PROVIDER_NAME) != null) {
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLocationManager.removeTestProvider(PROVIDER_NAME);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLocationManager.addTestProvider(PROVIDER_NAME, true, //requiresNetwork,
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false, // requiresSatellite,
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true, // requiresCell,
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false, // hasMonetaryCost,
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false, // supportsAltitude,
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false, // supportsSpeed, s
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false, // upportsBearing,
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Criteria.POWER_MEDIUM, // powerRequirement
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Criteria.ACCURACY_FINE); // accuracy
867f7840b41e1253b1bb03e40014611a37adec7c6cMike Lockwood        mLocationManager.setTestProviderEnabled(PROVIDER_NAME, true);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void tearDown() throws Exception {
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLocationManager.removeTestProvider(PROVIDER_NAME);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPendingIntent != null) {
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLocationManager.removeProximityAlert(mPendingIntent);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mIntentReceiver != null) {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            getContext().unregisterReceiver(mIntentReceiver);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Tests basic proximity alert when entering proximity
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testEnterProximity() throws Exception {
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        doTestEnterProximity(10000);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Tests proximity alert when entering proximity, with no expiration
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testEnterProximity_noexpire() throws Exception {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        doTestEnterProximity(-1);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper variant for testing enter proximity scenario
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TODO: add additional parameters as more scenarios are added
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param expiration - expiry of proximity alert
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void doTestEnterProximity(long expiration) throws Exception {
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // update location to outside proximity range
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronousSendLocation(30, 30);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        registerProximityListener(0, 0, 1000, expiration);
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendLocation(0, 0);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        waitForAlert();
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertProximityType(true);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Tests basic proximity alert when exiting proximity
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testExitProximity() throws Exception {
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // first do enter proximity scenario
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        doTestEnterProximity(-1);
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // now update to trigger exit proximity proximity
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIntentReceiver.clearReceivedIntents();
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendLocation(20, 20);
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        waitForAlert();
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertProximityType(false);
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Registers the proximity intent receiver
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void registerProximityListener(double latitude, double longitude,
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float radius, long expiration) {
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String intentKey = "testProximity";
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Intent proximityIntent = new Intent(intentKey);
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPendingIntent = PendingIntent.getBroadcast(getContext(), 0,
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proximityIntent, PendingIntent.FLAG_CANCEL_CURRENT);
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIntentReceiver = new TestIntentReceiver(intentKey);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLocationManager.addProximityAlert(latitude, longitude, radius,
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                expiration, mPendingIntent);
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getContext().registerReceiver(mIntentReceiver,
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mIntentReceiver.getFilter());
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Blocks until proximity intent notification is received
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws InterruptedException
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void waitForAlert() throws InterruptedException {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.d(LOG_TAG, "Waiting for proximity update");
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mIntentReceiver) {
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIntentReceiver.wait(PROXIMITY_WAIT_TIME);
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull("Did not receive proximity alert",
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mIntentReceiver.getLastReceivedIntent());
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Asserts that the received intent had the enter proximity property set as
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * expected
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param expectedEnterProximity - true if enter proximity expected, false if
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   exit expected
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void assertProximityType(boolean expectedEnterProximity)
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws Exception {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean proximityTest = mIntentReceiver.getLastReceivedIntent().
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getBooleanExtra(LocationManager.KEY_PROXIMITY_ENTERING,
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                !expectedEnterProximity);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("proximity alert not set to expected enter proximity value",
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                expectedEnterProximity, proximityTest);
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Synchronous variant of sendLocation
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void synchronousSendLocation(final double latitude,
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final double longitude)
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws InterruptedException {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendLocation(latitude, longitude, this);
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // wait for location to be set
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wait(UPDATE_LOCATION_WAIT_TIME);
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Asynchronously update the mock location provider without notification
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void sendLocation(final double latitude, final double longitude) {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendLocation(latitude, longitude, null);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Asynchronously update the mock location provider with given latitude and
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * longitude
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param latitude - update location
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param longitude - update location
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param observer - optionally, object to notify when update is sent.If
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            null, no update will be sent
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void sendLocation(final double latitude, final double longitude,
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Object observer) {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Thread locationUpdater = new Thread() {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void run() {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Location loc = new Location(PROVIDER_NAME);
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                loc.setLatitude(latitude);
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                loc.setLongitude(longitude);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                loc.setTime(java.lang.System.currentTimeMillis());
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.d(LOG_TAG, "Sending update for " + PROVIDER_NAME);
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLocationManager.setTestProviderLocation(PROVIDER_NAME, loc);
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (observer != null) {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (observer) {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        observer.notify();
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        locationUpdater.start();
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper class that receives a proximity intent and notifies the main class
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when received
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static class TestIntentReceiver extends BroadcastReceiver {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private String mExpectedAction;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Intent mLastReceivedIntent;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public TestIntentReceiver(String expectedAction) {
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mExpectedAction = expectedAction;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastReceivedIntent = null;
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public IntentFilter getFilter() {
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentFilter filter = new IntentFilter(mExpectedAction);
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return filter;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onReceive(Context context, Intent intent) {
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (intent != null && mExpectedAction.equals(intent.getAction())) {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.d(LOG_TAG, "Intent Received: " + intent.toString());
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastReceivedIntent = intent;
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    notify();
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Intent getLastReceivedIntent() {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mLastReceivedIntent;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void clearReceivedIntents() {
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastReceivedIntent = null;
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
283