From 5dfcc21c6f92d454bfd1a46c3943689f62cedd57 Mon Sep 17 00:00:00 2001 From: Soonil Nagarkar Date: Thu, 29 Oct 2020 09:59:36 -0700 Subject: [PATCH] Fix passive+coarse location bug Passive requests require the min update interval to be set, so we should not be clearing the min update interval altogether when adjusting passive requests. Bug: 171949953 Test: Added new CTS/unit tests Change-Id: If50bee91aa18d8c3817d342b82d35478075a64cb --- .../location/LocationProviderManager.java | 2 +- .../location/LocationProviderManagerTest.java | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/location/LocationProviderManager.java b/services/core/java/com/android/server/location/LocationProviderManager.java index b4a172393ba65..a20ecb4c6dfbd 100644 --- a/services/core/java/com/android/server/location/LocationProviderManager.java +++ b/services/core/java/com/android/server/location/LocationProviderManager.java @@ -491,7 +491,7 @@ class LocationProviderManager extends builder.setIntervalMillis(MIN_COARSE_INTERVAL_MS); } if (baseRequest.getMinUpdateIntervalMillis() < MIN_COARSE_INTERVAL_MS) { - builder.clearMinUpdateIntervalMillis(); + builder.setMinUpdateIntervalMillis(MIN_COARSE_INTERVAL_MS); } } diff --git a/services/tests/mockingservicestests/src/com/android/server/location/LocationProviderManagerTest.java b/services/tests/mockingservicestests/src/com/android/server/location/LocationProviderManagerTest.java index 3aedd3c7d753a..d260e4dce79af 100644 --- a/services/tests/mockingservicestests/src/com/android/server/location/LocationProviderManagerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/location/LocationProviderManagerTest.java @@ -22,6 +22,7 @@ import static android.app.AppOpsManager.OP_MONITOR_LOCATION; import static android.location.Criteria.ACCURACY_COARSE; import static android.location.Criteria.ACCURACY_FINE; import static android.location.Criteria.POWER_HIGH; +import static android.location.LocationRequest.PASSIVE_INTERVAL; import static android.os.PowerManager.LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF; import static androidx.test.ext.truth.location.LocationSubject.assertThat; @@ -597,6 +598,38 @@ public class LocationProviderManagerTest { verify(mWakeLock, timeout(TIMEOUT_MS)).release(); } + @Test + public void testRegisterListener_Coarse() throws Exception { + ILocationListener listener = createMockLocationListener(); + mManager.registerLocationRequest( + new LocationRequest.Builder(0).setWorkSource(WORK_SOURCE).build(), + IDENTITY, + PERMISSION_COARSE, + listener); + + mProvider.setProviderLocation(createLocation(NAME, mRandom)); + mProvider.setProviderLocation(createLocation(NAME, mRandom)); + verify(listener, times(1)) + .onLocationChanged(any(Location.class), nullable(IRemoteCallback.class)); + } + + @Test + public void testRegisterListener_Coarse_Passive() throws Exception { + ILocationListener listener = createMockLocationListener(); + mManager.registerLocationRequest( + new LocationRequest.Builder(PASSIVE_INTERVAL) + .setMinUpdateIntervalMillis(0) + .setWorkSource(WORK_SOURCE).build(), + IDENTITY, + PERMISSION_COARSE, + listener); + + mProvider.setProviderLocation(createLocation(NAME, mRandom)); + mProvider.setProviderLocation(createLocation(NAME, mRandom)); + verify(listener, times(1)) + .onLocationChanged(any(Location.class), nullable(IRemoteCallback.class)); + } + @Test public void testGetCurrentLocation() throws Exception { ArgumentCaptor locationCaptor = ArgumentCaptor.forClass(Location.class);