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