Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d12bd01a authored by Soonil Nagarkar's avatar Soonil Nagarkar Committed by Grace Cheng
Browse files

Fix bug in getLastLocation()

getLastLocation() was not properly respecting ADAS settings or the
ignore settings allowlist.

Bug: 219835125
Test: manual
Change-Id: I6d927e7bed44b475e8326eea0baf5afb8fc9c249
(cherry picked from commit a38d028a)
parent dd111c15
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
@@ -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"
+12 −0
Original line number Diff line number Diff line
@@ -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