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

Commit 91e630c4 authored by Maggie's avatar Maggie
Browse files

Fix location QuickSettings bug

Problem: LocationManager.getAllProviders() is only returning "network" for Quick Settings. The root cause is getAllProviders() method is filtering results by permission when it shouldn't.

1. Remove permission check logic in getAllProviders.
2. Exclude PASSIVE_PROVIDER from setLocationEnabled and
getLocationEnabled.

Bug: 72495506
Test: Robo
Test: Manual
Change-Id: I37a2238d094ffbdff788e90b71d1e70b81fca79a
parent 877553e3
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -119,7 +119,8 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio
        // for the current foreground user.
        LocationManager locationManager =
                (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
        return locationManager.isLocationEnabledForUser(Process.myUserHandle());
        return locationManager.isLocationEnabledForUser(
                UserHandle.of(ActivityManager.getCurrentUser()));
    }

    @Override
+39 −8
Original line number Diff line number Diff line
@@ -1577,13 +1577,22 @@ public class LocationManagerService extends ILocationManager.Stub {
    }

    /**
     * Returns all providers by name, including passive, but excluding
     * fused, also including ones that are not permitted to
     * be accessed by the calling activity or are currently disabled.
     * Returns all providers by name, including passive and the ones that are not permitted to
     * be accessed by the calling activity or are currently disabled, but excluding fused.
     */
    @Override
    public List<String> getAllProviders() {
        List<String> out = getProviders(null /*criteria*/, false /*enabledOnly*/);
        ArrayList<String> out;
        synchronized (mLock) {
            out = new ArrayList<>(mProviders.size());
            for (LocationProviderInterface provider : mProviders) {
                String name = provider.getName();
                if (LocationManager.FUSED_PROVIDER.equals(name)) {
                    continue;
                }
                out.add(name);
            }
        }
        if (D) Log.d(TAG, "getAllProviders()=" + out);
        return out;
    }
@@ -2586,9 +2595,10 @@ public class LocationManagerService extends ILocationManager.Stub {
        // Check INTERACT_ACROSS_USERS permission if userId is not current user id.
        checkInteractAcrossUsersPermission(userId);

        // Enable or disable all location providers
        // Enable or disable all location providers. Fused provider and passive provider are
        // excluded.
        synchronized (mLock) {
            for(String provider : getAllProviders()) {
            for(String provider : getAllProvidersForLocationSettings()) {
                setProviderEnabledForUser(provider, enabled, userId);
            }
        }
@@ -2605,9 +2615,10 @@ public class LocationManagerService extends ILocationManager.Stub {
        // Check INTERACT_ACROSS_USERS permission if userId is not current user id.
        checkInteractAcrossUsersPermission(userId);

        // If at least one location provider is enabled, return true
        // If at least one location provider is enabled, return true. Fused provider and passive
        // provider are excluded.
        synchronized (mLock) {
            for (String provider : getAllProviders()) {
            for (String provider : getAllProvidersForLocationSettings()) {
                if (isProviderEnabledForUser(provider, userId)) {
                    return true;
                }
@@ -2690,6 +2701,26 @@ public class LocationManagerService extends ILocationManager.Stub {
        }
    }

    /**
     * Return all location providers except fused provider and passive provider. These two
     * providers are not generating location by themselves, but only echo locations from other
     * providers.
     *
     * @return All location providers except fused provider and passive provider, including
     *          providers that are not permitted to be accessed by the calling activity or are
     *          currently disabled.
     */
    private List<String> getAllProvidersForLocationSettings() {
        List<String> providersForSettings = new ArrayList<>(mProviders.size());
        for (String provider : getAllProviders()) {
            if (provider.equals(LocationManager.PASSIVE_PROVIDER)) {
                continue;
            }
            providersForSettings.add(provider);
        }
        return providersForSettings;
    }

    /**
     * Read location provider status from Settings.Secure
     *