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
This commit is contained in:
Soonil Nagarkar
2021-09-21 09:43:40 -07:00
parent d9a274cfa2
commit a43b64c83b
2 changed files with 21 additions and 6 deletions

View File

@@ -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);

View File

@@ -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));