Fix bug in getLastLocation()
getLastLocation() was not properly respecting ADAS settings or the ignore settings allowlist. Bug: 219835125 Test: manual Change-Id: I6d927e7bed44b475e8326eea0baf5afb8fc9c249
This commit is contained in:
@@ -1607,6 +1607,8 @@ public class LocationProviderManager extends
|
||||
|
||||
public @Nullable Location getLastLocation(LastLocationRequest request,
|
||||
CallerIdentity identity, @PermissionLevel int permissionLevel) {
|
||||
request = calculateLastLocationRequest(request);
|
||||
|
||||
if (!isActive(request.isBypass(), identity)) {
|
||||
return null;
|
||||
}
|
||||
@@ -1634,6 +1636,38 @@ public class LocationProviderManager extends
|
||||
return location;
|
||||
}
|
||||
|
||||
private LastLocationRequest calculateLastLocationRequest(LastLocationRequest baseRequest) {
|
||||
LastLocationRequest.Builder builder = new LastLocationRequest.Builder(baseRequest);
|
||||
|
||||
boolean locationSettingsIgnored = baseRequest.isLocationSettingsIgnored();
|
||||
if (locationSettingsIgnored) {
|
||||
// if we are not currently allowed use location settings ignored, disable it
|
||||
if (!mSettingsHelper.getIgnoreSettingsAllowlist().contains(
|
||||
getIdentity().getPackageName(), getIdentity().getAttributionTag())
|
||||
&& !mLocationManagerInternal.isProvider(null, getIdentity())) {
|
||||
locationSettingsIgnored = false;
|
||||
}
|
||||
|
||||
builder.setLocationSettingsIgnored(locationSettingsIgnored);
|
||||
}
|
||||
|
||||
boolean adasGnssBypass = baseRequest.isAdasGnssBypass();
|
||||
if (adasGnssBypass) {
|
||||
// if we are not currently allowed use adas gnss bypass, disable it
|
||||
if (!GPS_PROVIDER.equals(mName)) {
|
||||
Log.e(TAG, "adas gnss bypass request received in non-gps provider");
|
||||
adasGnssBypass = false;
|
||||
} else if (!mLocationSettings.getUserSettings(
|
||||
getIdentity().getUserId()).isAdasGnssLocationEnabled()) {
|
||||
adasGnssBypass = false;
|
||||
}
|
||||
|
||||
builder.setAdasGnssBypass(adasGnssBypass);
|
||||
}
|
||||
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* This function does not perform any permissions or safety checks, by calling it you are
|
||||
* committing to performing all applicable checks yourself. This always returns a "fine"
|
||||
|
||||
@@ -333,6 +333,10 @@ public class LocationProviderManagerTest {
|
||||
|
||||
@Test
|
||||
public void testGetLastLocation_Bypass() {
|
||||
mInjector.getSettingsHelper().setIgnoreSettingsAllowlist(
|
||||
new PackageTagsList.Builder().add(
|
||||
IDENTITY.getPackageName()).build());
|
||||
|
||||
assertThat(mManager.getLastLocation(new LastLocationRequest.Builder().build(), IDENTITY,
|
||||
PERMISSION_FINE)).isNull();
|
||||
assertThat(mManager.getLastLocation(
|
||||
@@ -381,6 +385,14 @@ public class LocationProviderManagerTest {
|
||||
new LastLocationRequest.Builder().setLocationSettingsIgnored(true).build(),
|
||||
IDENTITY, PERMISSION_FINE)).isEqualTo(
|
||||
loc);
|
||||
|
||||
mInjector.getSettingsHelper().setIgnoreSettingsAllowlist(
|
||||
new PackageTagsList.Builder().build());
|
||||
mProvider.setProviderAllowed(false);
|
||||
|
||||
assertThat(mManager.getLastLocation(
|
||||
new LastLocationRequest.Builder().setLocationSettingsIgnored(true).build(),
|
||||
IDENTITY, PERMISSION_FINE)).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user