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

Commit 3d1eeda2 authored by Hansong Zhang's avatar Hansong Zhang
Browse files

Scan manager: Suspend scan when location is off

* Add a broadcast receiver to listen for location on/off event. When
location is off, send SUSPEND_SCAN message; when location is on, send
RESUME_SCAN message
* In handleStartScan(), suspend the scan if location is off, unless it
is a filtered scan or issued by a legacy app
* Both location on/off and display on/off events are handled in
HandlerThread, so there is no collision

Test: manual
Bug: 73485839
Change-Id: Ie7adcd91afbb95e2bd231a11ed557915583f1d6c
parent 07254c04
Loading
Loading
Loading
Loading
+36 −4
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.display.DisplayManager;
import android.location.LocationManager;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
@@ -102,6 +103,7 @@ public class ScanManager {
    private DisplayManager mDm;

    private ActivityManager mActivityManager;
    private LocationManager mLocationManager;
    private static final int FOREGROUND_IMPORTANCE_CUTOFF =
            ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE;

@@ -115,8 +117,6 @@ public class ScanManager {
        }
    }

    ;

    ScanManager(GattService service) {
        mRegularScanClients =
                Collections.newSetFromMap(new ConcurrentHashMap<ScanClient, Boolean>());
@@ -128,6 +128,7 @@ public class ScanManager {
        mCurUsedTrackableAdvertisements = 0;
        mDm = (DisplayManager) mService.getSystemService(Context.DISPLAY_SERVICE);
        mActivityManager = (ActivityManager) mService.getSystemService(Context.ACTIVITY_SERVICE);
        mLocationManager = (LocationManager) mService.getSystemService(Context.LOCATION_SERVICE);
    }

    void start() {
@@ -141,6 +142,8 @@ public class ScanManager {
            mActivityManager.addOnUidImportanceListener(mUidImportanceListener,
                    FOREGROUND_IMPORTANCE_CUTOFF);
        }
        IntentFilter locationIntentFilter = new IntentFilter(LocationManager.MODE_CHANGED_ACTION);
        mService.registerReceiver(mLocationReceiver, locationIntentFilter);
    }

    void cleanup() {
@@ -170,6 +173,8 @@ public class ScanManager {
            }
            mHandler = null;
        }

        mService.unregisterReceiver(mLocationReceiver);
    }

    void registerScanner(UUID uuid) {
@@ -313,6 +318,17 @@ public class ScanManager {
                return;
            }

            final boolean locationEnabled = mLocationManager.isLocationEnabled();
            if (!locationEnabled && !isFiltered && !client.legacyForegroundApp) {
                Log.i(TAG, "Cannot start unfiltered scan in location-off. This scan will be"
                        + " resumed when location is on: " + client.scannerId);
                mSuspendedScanClients.add(client);
                if (client.stats != null) {
                    client.stats.recordScanSuspend(client.scannerId);
                }
                return;
            }

            // Begin scan operations.
            if (isBatchClient(client)) {
                mBatchClients.add(client);
@@ -396,7 +412,7 @@ public class ScanManager {
        void handleSuspendScans() {
            for (ScanClient client : mRegularScanClients) {
                if (!mScanNative.isOpportunisticScanClient(client) && (client.filters == null
                        || client.filters.isEmpty())) {
                        || client.filters.isEmpty()) && !client.legacyForegroundApp) {
                    /*Suspend unfiltered scans*/
                    if (client.stats != null) {
                        client.stats.recordScanSuspend(client.scannerId);
@@ -1303,7 +1319,7 @@ public class ScanManager {

                @Override
                public void onDisplayChanged(int displayId) {
                    if (isScreenOn()) {
                    if (isScreenOn() && mLocationManager.isLocationEnabled()) {
                        sendMessage(MSG_RESUME_SCANS, null);
                    } else {
                        sendMessage(MSG_SUSPEND_SCANS, null);
@@ -1324,6 +1340,22 @@ public class ScanManager {
                }
            };

    private BroadcastReceiver mLocationReceiver =
            new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    String action = intent.getAction();
                    if (LocationManager.MODE_CHANGED_ACTION.equals(action)) {
                        final boolean locationEnabled = mLocationManager.isLocationEnabled();
                        if (locationEnabled && isScreenOn()) {
                            sendMessage(MSG_RESUME_SCANS, null);
                        } else {
                            sendMessage(MSG_SUSPEND_SCANS, null);
                        }
                    }
                }
            };

    private void handleImportanceChange(UidImportance imp) {
        if (imp == null) {
            return;