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

Commit 03da687d authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Disable GNSS HAL when location is off"

parents b5c226b1 35c3b917
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -2069,9 +2069,13 @@ public class LocationManagerService extends ILocationManager.Stub {
                        record.mReceiver.mAllowedResolutionLevel)) {
                    continue;
                }
                if (!provider.isUseableLocked() && !isSettingsExemptLocked(record)) {
                if (!provider.isUseableLocked()) {
                    if (isSettingsExemptLocked(record)) {
                        providerRequest.forceLocation = true;
                    } else {
                        continue;
                    }
                }

                LocationRequest locationRequest = record.mRealRequest;
                long interval = locationRequest.getInterval();
+56 −35
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.hardware.location.GeofenceHardware;
import android.hardware.location.GeofenceHardwareImpl;
import android.location.Criteria;
@@ -168,21 +169,13 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
    private static final int AGPS_SUPL_MODE_MSA = 0x02;
    private static final int AGPS_SUPL_MODE_MSB = 0x01;

    // Handler messages
    private static final int CHECK_LOCATION = 1;
    private static final int ENABLE = 2;
    private static final int SET_REQUEST = 3;
    private static final int UPDATE_NETWORK_STATE = 4;
    private static final int INJECT_NTP_TIME = 5;
    private static final int DOWNLOAD_XTRA_DATA = 6;
    private static final int UPDATE_LOCATION = 7;  // Handle external location from network listener
    private static final int ADD_LISTENER = 8;
    private static final int REMOVE_LISTENER = 9;
    private static final int DOWNLOAD_XTRA_DATA_FINISHED = 11;
    private static final int SUBSCRIPTION_OR_CARRIER_CONFIG_CHANGED = 12;
    private static final int INITIALIZE_HANDLER = 13;
    private static final int REQUEST_SUPL_CONNECTION = 14;
    private static final int RELEASE_SUPL_CONNECTION = 15;
    private static final int REQUEST_LOCATION = 16;
    private static final int REPORT_LOCATION = 17; // HAL reports location
    private static final int REPORT_SV_STATUS = 18; // HAL reports SV status
@@ -311,6 +304,8 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
    // true if we are enabled, protected by this
    private boolean mEnabled = true;

    private boolean mShutdown;

    // states for injecting ntp and downloading xtra data
    private static final int STATE_PENDING_NETWORK = 0;
    private static final int STATE_DOWNLOADING = 1;
@@ -349,7 +344,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
    private GnssPositionMode mLastPositionMode;

    // Current request from underlying location clients.
    private ProviderRequest mProviderRequest = null;
    private ProviderRequest mProviderRequest;
    // The WorkSource associated with the most recent client request (i.e, most recent call to
    // setRequest).
    private WorkSource mWorkSource = null;
@@ -371,7 +366,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
    private final Looper mLooper;
    private final LocationExtras mLocationExtras = new LocationExtras();
    private final GnssStatusListenerHelper mGnssStatusListenerHelper;
    private final GnssSatelliteBlacklistHelper mGnssSatelliteBlacklistHelper;
    private final GnssMeasurementsProvider mGnssMeasurementsProvider;
    private final GnssNavigationMessageProvider mGnssNavigationMessageProvider;
    private final LocationChangeListener mNetworkLocationListener = new NetworkLocationListener();
@@ -538,6 +532,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
        }
        if (disableGps != mDisableGps) {
            mDisableGps = disableGps;
            updateEnabled();
            updateRequirements();
        }
    }
@@ -635,23 +630,32 @@ public class GnssLocationProvider extends AbstractLocationProvider implements

        mGnssMetrics = new GnssMetrics(mBatteryStats);
        mNtpTimeHelper = new NtpTimeHelper(mContext, looper, this);
        mGnssSatelliteBlacklistHelper = new GnssSatelliteBlacklistHelper(mContext,
        GnssSatelliteBlacklistHelper gnssSatelliteBlacklistHelper =
                new GnssSatelliteBlacklistHelper(mContext,
                        looper, this);
        mHandler.post(mGnssSatelliteBlacklistHelper::updateSatelliteBlacklist);
        mHandler.post(gnssSatelliteBlacklistHelper::updateSatelliteBlacklist);
        mGnssBatchingProvider = new GnssBatchingProvider();
        mGnssGeofenceProvider = new GnssGeofenceProvider();

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_SHUTDOWN);
        mContext.registerReceiverAsUser(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (getSendingUserId() == UserHandle.USER_ALL) {
                    mEnabled = false;
                    handleDisable();
                    mShutdown = true;
                    updateEnabled();
                }
            }
        }, UserHandle.ALL, intentFilter, null, mHandler);
        }, UserHandle.ALL, new IntentFilter(Intent.ACTION_SHUTDOWN), null, mHandler);

        mContext.getContentResolver().registerContentObserver(
                Settings.Secure.getUriFor(Settings.Secure.LOCATION_MODE),
                true,
                new ContentObserver(mHandler) {
                    @Override
                    public void onChange(boolean selfChange) {
                        updateEnabled();
                    }
                }, UserHandle.USER_ALL);

        setProperties(PROPERTIES);
        setEnabled(true);
@@ -865,12 +869,12 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
        return GPS_POSITION_MODE_STANDALONE;
    }

    private void handleEnable() {
    private boolean handleEnable() {
        if (DEBUG) Log.d(TAG, "handleEnable");

        boolean enabled = native_init();
        boolean inited = native_init();

        if (enabled) {
        if (inited) {
            mSupportsXtra = native_supports_xtra();

            // TODO: remove the following native calls if we can make sure they are redundant.
@@ -887,11 +891,10 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
            mGnssNavigationMessageProvider.onGpsEnabledChanged();
            mGnssBatchingProvider.enable();
        } else {
            synchronized (mLock) {
                mEnabled = false;
            }
            Log.w(TAG, "Failed to enable location provider");
        }

        return inited;
    }

    private void handleDisable() {
@@ -910,6 +913,26 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
        mGnssNavigationMessageProvider.onGpsEnabledChanged();
    }

    private void updateEnabled() {
        synchronized (mLock) {
            boolean enabled =
                    ((mProviderRequest != null && mProviderRequest.reportLocation
                            && mProviderRequest.forceLocation) || (
                            mContext.getSystemService(LocationManager.class).isLocationEnabled()
                                    && !mDisableGps)) && !mShutdown;
            if (enabled == mEnabled) {
                return;
            }

            if (enabled) {
                mEnabled = handleEnable();
            } else {
                mEnabled = false;
                handleDisable();
            }
        }
    }

    public boolean isEnabled() {
        synchronized (mLock) {
            return mEnabled;
@@ -942,6 +965,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
    private void handleSetRequest(ProviderRequest request, WorkSource source) {
        mProviderRequest = request;
        mWorkSource = source;
        updateEnabled();
        updateRequirements();
    }

@@ -1490,8 +1514,11 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
            class_init_native();
            native_init_once();
            if (isEnabled()) {
                // re-calls native_init() and other setup.
                handleEnable();
                synchronized (mLock) {
                    mEnabled = false;
                }
                updateEnabled();

                // resend configuration into the restarted HAL service.
                reloadGpsProperties();
            }
@@ -1690,7 +1717,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
                    /* requestorIdEncoding= */ 0,
                    /* textEncoding= */ 0,
                    mSuplEsEnabled,
                    mEnabled,
                    isEnabled(),
                    userResponse);

            return true;
@@ -1756,7 +1783,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
                notification.requestorIdEncoding,
                notification.textEncoding,
                mSuplEsEnabled,
                mEnabled,
                isEnabled(),
                /* userResponse= */ 0);
    }

@@ -1881,9 +1908,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
        public void handleMessage(Message msg) {
            int message = msg.what;
            switch (message) {
                case ENABLE:
                    handleEnable();
                    break;
                case SET_REQUEST:
                    GpsRequest gpsRequest = (GpsRequest) msg.obj;
                    handleSetRequest(gpsRequest.request, gpsRequest.source);
@@ -1998,8 +2022,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
                    new NetworkLocationListener(),
                    getLooper());

            // enable gps provider, it will never be disabled (legacy behavior)
            sendEmptyMessage(ENABLE);
            updateEnabled();
        }
    }

@@ -2043,8 +2066,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
     */
    private String messageIdAsString(int message) {
        switch (message) {
            case ENABLE:
                return "ENABLE";
            case SET_REQUEST:
                return "SET_REQUEST";
            case INJECT_NTP_TIME: