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

Commit 7f707ac3 authored by Yinchu Chen's avatar Yinchu Chen
Browse files

fix BLE scan could be started even screen is off



AOSP logic only allow APP to start BLE scan when screen on if
APP doesn't set any filters.

But if an APP set a filter with all fields empty, AOSP logic still
think it's a filtered scan, it's a bug.

The logic should check whether client's filters are empty and
whether each filter's fields are empty.

Bug: 290856528
Test: atest testScreenOffStartEmptyFilterScan
Change-Id: Ia9471cb7cfea684cd90ddd4626dc3c3932793af8
Signed-off-by: default avataryinzl1 <yinzl1@lenovo.com>
parent 4f3c7a98
Loading
Loading
Loading
Loading
+18 −2
Original line number Original line Diff line number Diff line
@@ -488,15 +488,31 @@ public class ScanManager {
        }
        }


        private boolean requiresScreenOn(ScanClient client) {
        private boolean requiresScreenOn(ScanClient client) {
            boolean isFiltered = (client.filters != null) && !client.filters.isEmpty();
            boolean isFiltered = isFilteredScan(client);
            return !mScanNative.isOpportunisticScanClient(client) && !isFiltered;
            return !mScanNative.isOpportunisticScanClient(client) && !isFiltered;
        }
        }


        private boolean requiresLocationOn(ScanClient client) {
        private boolean requiresLocationOn(ScanClient client) {
            boolean isFiltered = (client.filters != null) && !client.filters.isEmpty();
            boolean isFiltered = isFilteredScan(client);
            return !client.hasDisavowedLocation && !isFiltered;
            return !client.hasDisavowedLocation && !isFiltered;
        }
        }


        private boolean isFilteredScan(ScanClient client) {
            if ((client.filters == null) || client.filters.isEmpty()) {
                return false;
            }

            boolean atLeastOneValidFilter = false;
            for (ScanFilter filter : client.filters) {
                // A valid filter need at least one field not empty
                if (!filter.isAllFieldsEmpty()) {
                    atLeastOneValidFilter = true;
                    break;
                }
            }
            return atLeastOneValidFilter;
        }

        @RequiresPermission(android.Manifest.permission.BLUETOOTH_SCAN)
        @RequiresPermission(android.Manifest.permission.BLUETOOTH_SCAN)
        void handleStopScan(ScanClient client) {
        void handleStopScan(ScanClient client) {
            if (client == null) {
            if (client == null) {
+56 −6
Original line number Original line Diff line number Diff line
@@ -189,9 +189,14 @@ public class ScanManagerTest {
        TestUtils.waitForLooperToBeIdle(mHandler.getLooper());
        TestUtils.waitForLooperToBeIdle(mHandler.getLooper());
    }
    }


    private ScanClient createScanClient(int id, boolean isFiltered, int scanMode,
    private ScanClient createScanClient(
            boolean isBatch, boolean isAutoBatch) {
            int id,
        List<ScanFilter> scanFilterList = createScanFilterList(isFiltered);
            boolean isFiltered,
            boolean isEmptyFilter,
            int scanMode,
            boolean isBatch,
            boolean isAutoBatch) {
        List<ScanFilter> scanFilterList = createScanFilterList(isFiltered, isEmptyFilter);
        ScanSettings scanSettings = createScanSettings(scanMode, isBatch, isAutoBatch);
        ScanSettings scanSettings = createScanSettings(scanMode, isBatch, isAutoBatch);


        ScanClient client = new ScanClient(id, scanSettings, scanFilterList);
        ScanClient client = new ScanClient(id, scanSettings, scanFilterList);
@@ -201,15 +206,30 @@ public class ScanManagerTest {
    }
    }


    private ScanClient createScanClient(int id, boolean isFiltered, int scanMode) {
    private ScanClient createScanClient(int id, boolean isFiltered, int scanMode) {
        return createScanClient(id, isFiltered, scanMode, false, false);
        return createScanClient(id, isFiltered, false, scanMode, false, false);
    }
    }


    private List<ScanFilter> createScanFilterList(boolean isFiltered) {
    private ScanClient createScanClient(
            int id, boolean isFiltered, int scanMode,
            boolean isBatch, boolean isAutoBatch) {
        return createScanClient(id, isFiltered, false, scanMode, isBatch, isAutoBatch);
    }

    private ScanClient createScanClient(
            int id, boolean isFiltered, boolean isEmptyFilter, int scanMode) {
        return createScanClient(id, isFiltered, isEmptyFilter, scanMode, false, false);
    }

    private List<ScanFilter> createScanFilterList(boolean isFiltered, boolean isEmptyFilter) {
        List<ScanFilter> scanFilterList = null;
        List<ScanFilter> scanFilterList = null;
        if (isFiltered) {
        if (isFiltered) {
            scanFilterList = new ArrayList<>();
            scanFilterList = new ArrayList<>();
            if (isEmptyFilter) {
                scanFilterList.add(new ScanFilter.Builder().build());
            } else {
                scanFilterList.add(new ScanFilter.Builder().setDeviceName("TestName").build());
                scanFilterList.add(new ScanFilter.Builder().setDeviceName("TestName").build());
            }
            }
        }
        return scanFilterList;
        return scanFilterList;
    }
    }


@@ -328,6 +348,36 @@ public class ScanManagerTest {
        }
        }
    }
    }


    @Test
    public void testScreenOffStartEmptyFilterScan() {
        // Set filtered scan flag
        final boolean isFiltered = true;
        final boolean isEmptyFilter = true;
        // Set scan mode map {original scan mode (ScanMode) : expected scan mode (expectedScanMode)}
        SparseIntArray scanModeMap = new SparseIntArray();
        scanModeMap.put(SCAN_MODE_LOW_POWER, SCAN_MODE_LOW_POWER);
        scanModeMap.put(SCAN_MODE_BALANCED, SCAN_MODE_BALANCED);
        scanModeMap.put(SCAN_MODE_LOW_LATENCY, SCAN_MODE_LOW_LATENCY);
        scanModeMap.put(SCAN_MODE_AMBIENT_DISCOVERY, SCAN_MODE_AMBIENT_DISCOVERY);

        for (int i = 0; i < scanModeMap.size(); i++) {
            int ScanMode = scanModeMap.keyAt(i);
            int expectedScanMode = scanModeMap.get(ScanMode);
            Log.d(TAG, "ScanMode: " + String.valueOf(ScanMode)
                    + " expectedScanMode: " + String.valueOf(expectedScanMode));

            // Turn off screen
            sendMessageWaitForProcessed(createScreenOnOffMessage(false));
            // Create scan client
            ScanClient client = createScanClient(i, isFiltered, isEmptyFilter, ScanMode);
            // Start scan
            sendMessageWaitForProcessed(createStartStopScanMessage(true, client));
            assertThat(mScanManager.getRegularScanQueue().contains(client)).isFalse();
            assertThat(mScanManager.getSuspendedScanQueue().contains(client)).isTrue();
            assertThat(client.settings.getScanMode()).isEqualTo(expectedScanMode);
        }
    }

    @Test
    @Test
    public void testScreenOnStartUnfilteredScan() {
    public void testScreenOnStartUnfilteredScan() {
        // Set filtered scan flag
        // Set filtered scan flag