Loading android/app/src/com/android/bluetooth/gatt/ScanManager.java +18 −2 Original line number Diff line number Diff line Loading @@ -488,15 +488,31 @@ public class ScanManager { } private boolean requiresScreenOn(ScanClient client) { boolean isFiltered = (client.filters != null) && !client.filters.isEmpty(); boolean isFiltered = isFilteredScan(client); return !mScanNative.isOpportunisticScanClient(client) && !isFiltered; } private boolean requiresLocationOn(ScanClient client) { boolean isFiltered = (client.filters != null) && !client.filters.isEmpty(); boolean isFiltered = isFilteredScan(client); 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) void handleStopScan(ScanClient client) { if (client == null) { Loading android/app/tests/unit/src/com/android/bluetooth/gatt/ScanManagerTest.java +56 −6 Original line number Diff line number Diff line Loading @@ -189,9 +189,14 @@ public class ScanManagerTest { TestUtils.waitForLooperToBeIdle(mHandler.getLooper()); } private ScanClient createScanClient(int id, boolean isFiltered, int scanMode, boolean isBatch, boolean isAutoBatch) { List<ScanFilter> scanFilterList = createScanFilterList(isFiltered); private ScanClient createScanClient( int id, boolean isFiltered, boolean isEmptyFilter, int scanMode, boolean isBatch, boolean isAutoBatch) { List<ScanFilter> scanFilterList = createScanFilterList(isFiltered, isEmptyFilter); ScanSettings scanSettings = createScanSettings(scanMode, isBatch, isAutoBatch); ScanClient client = new ScanClient(id, scanSettings, scanFilterList); Loading @@ -201,15 +206,30 @@ public class ScanManagerTest { } 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; if (isFiltered) { scanFilterList = new ArrayList<>(); if (isEmptyFilter) { scanFilterList.add(new ScanFilter.Builder().build()); } else { scanFilterList.add(new ScanFilter.Builder().setDeviceName("TestName").build()); } } return scanFilterList; } Loading Loading @@ -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 public void testScreenOnStartUnfilteredScan() { // Set filtered scan flag Loading Loading
android/app/src/com/android/bluetooth/gatt/ScanManager.java +18 −2 Original line number Diff line number Diff line Loading @@ -488,15 +488,31 @@ public class ScanManager { } private boolean requiresScreenOn(ScanClient client) { boolean isFiltered = (client.filters != null) && !client.filters.isEmpty(); boolean isFiltered = isFilteredScan(client); return !mScanNative.isOpportunisticScanClient(client) && !isFiltered; } private boolean requiresLocationOn(ScanClient client) { boolean isFiltered = (client.filters != null) && !client.filters.isEmpty(); boolean isFiltered = isFilteredScan(client); 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) void handleStopScan(ScanClient client) { if (client == null) { Loading
android/app/tests/unit/src/com/android/bluetooth/gatt/ScanManagerTest.java +56 −6 Original line number Diff line number Diff line Loading @@ -189,9 +189,14 @@ public class ScanManagerTest { TestUtils.waitForLooperToBeIdle(mHandler.getLooper()); } private ScanClient createScanClient(int id, boolean isFiltered, int scanMode, boolean isBatch, boolean isAutoBatch) { List<ScanFilter> scanFilterList = createScanFilterList(isFiltered); private ScanClient createScanClient( int id, boolean isFiltered, boolean isEmptyFilter, int scanMode, boolean isBatch, boolean isAutoBatch) { List<ScanFilter> scanFilterList = createScanFilterList(isFiltered, isEmptyFilter); ScanSettings scanSettings = createScanSettings(scanMode, isBatch, isAutoBatch); ScanClient client = new ScanClient(id, scanSettings, scanFilterList); Loading @@ -201,15 +206,30 @@ public class ScanManagerTest { } 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; if (isFiltered) { scanFilterList = new ArrayList<>(); if (isEmptyFilter) { scanFilterList.add(new ScanFilter.Builder().build()); } else { scanFilterList.add(new ScanFilter.Builder().setDeviceName("TestName").build()); } } return scanFilterList; } Loading Loading @@ -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 public void testScreenOnStartUnfilteredScan() { // Set filtered scan flag Loading