From a43b64c83be319e015e0882baf4e5c594de013c5 Mon Sep 17 00:00:00 2001 From: Soonil Nagarkar Date: Tue, 21 Sep 2021 09:43:40 -0700 Subject: [PATCH] Fix unregister after delayed register Ensure that location requests which are unregistered after they have a pending delayed register correctly cancel the delayed registration so that it does not interefe in the future. Bug: 199009393 Test: atest LocationProviderManagerTest Change-Id: I09281ce9aa78399aa5da19891bbde75b73bd6791 --- .../provider/LocationProviderManager.java | 12 ++++++------ .../provider/LocationProviderManagerTest.java | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/location/provider/LocationProviderManager.java b/services/core/java/com/android/server/location/provider/LocationProviderManager.java index 62d8c320a13ca..05999ae13b8d6 100644 --- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java +++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java @@ -1960,11 +1960,6 @@ public class LocationProviderManager extends Preconditions.checkState(Thread.holdsLock(mLock)); } - if (mDelayedRegister != null) { - mAlarmHelper.cancel(mDelayedRegister); - mDelayedRegister = null; - } - // calculate how long the new request should be delayed before sending it off to the // provider, under the assumption that once we send the request off, the provider will // immediately attempt to deliver a new location satisfying that request. @@ -1997,8 +1992,8 @@ public class LocationProviderManager extends public void onAlarm() { synchronized (mLock) { if (mDelayedRegister == this) { - setProviderRequest(newRequest); mDelayedRegister = null; + setProviderRequest(newRequest); } } } @@ -2025,6 +2020,11 @@ public class LocationProviderManager extends @GuardedBy("mLock") void setProviderRequest(ProviderRequest request) { + if (mDelayedRegister != null) { + mAlarmHelper.cancel(mDelayedRegister); + mDelayedRegister = null; + } + EVENT_LOG.logProviderUpdateRequest(mName, request); mProvider.getController().setRequest(request); diff --git a/services/tests/mockingservicestests/src/com/android/server/location/provider/LocationProviderManagerTest.java b/services/tests/mockingservicestests/src/com/android/server/location/provider/LocationProviderManagerTest.java index f703e2e591814..d0b2edadc7141 100644 --- a/services/tests/mockingservicestests/src/com/android/server/location/provider/LocationProviderManagerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/location/provider/LocationProviderManagerTest.java @@ -905,6 +905,21 @@ public class LocationProviderManagerTest { assertThat(mProvider.getRequest().getIntervalMillis()).isEqualTo(60000); } + @Test + public void testProviderRequest_DelayedRequest_Remove() { + mProvider.setProviderLocation(createLocation(NAME, mRandom)); + + ILocationListener listener1 = createMockLocationListener(); + LocationRequest request1 = new LocationRequest.Builder(60000) + .setWorkSource(WORK_SOURCE) + .build(); + mManager.registerLocationRequest(request1, IDENTITY, PERMISSION_FINE, listener1); + mManager.unregisterLocationRequest(listener1); + + mInjector.getAlarmHelper().incrementAlarmTime(60000); + assertThat(mProvider.getRequest().isActive()).isFalse(); + } + @Test public void testProviderRequest_SpamRequesting() { mProvider.setProviderLocation(createLocation(NAME, mRandom));