Loading android/app/src/com/android/bluetooth/gatt/ScanManager.java +39 −20 Original line number Diff line number Diff line Loading @@ -143,6 +143,8 @@ public class ScanManager { ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE; private static final boolean DEFAULT_UID_IS_FOREGROUND = true; private static final int SCAN_MODE_APP_IN_BACKGROUND = ScanSettings.SCAN_MODE_LOW_POWER; private static final int SCAN_MODE_FORCE_DOWNGRADED = ScanSettings.SCAN_MODE_LOW_POWER; private static final int SCAN_MODE_MAX_IN_CONCURRENCY = ScanSettings.SCAN_MODE_BALANCED; private final SparseBooleanArray mIsUidForegroundMap = new SparseBooleanArray(); private boolean mScreenOn = false; private boolean mIsConnecting; Loading Loading @@ -734,10 +736,10 @@ public class ScanManager { } private boolean updateScanModeScreenOff(ScanClient client) { if (mScanNative.isForceDowngradedScanClient(client)) { if (mScanNative.isOpportunisticScanClient(client)) { return false; } if (!isAppForeground(client) && !mScanNative.isOpportunisticScanClient(client)) { if (!isAppForeground(client) || mScanNative.isForceDowngradedScanClient(client)) { return client.updateScanMode(ScanSettings.SCAN_MODE_SCREEN_OFF); } Loading Loading @@ -834,22 +836,25 @@ public class ScanManager { } private boolean updateScanModeScreenOn(ScanClient client) { if (mScanNative.isForceDowngradedScanClient(client)) { if (mScanNative.isOpportunisticScanClient(client)) { return false; } int newScanMode = (isAppForeground(client) || mScanNative.isOpportunisticScanClient(client)) ? client.scanModeApp : SCAN_MODE_APP_IN_BACKGROUND; return client.updateScanMode(newScanMode); int scanMode = isAppForeground(client) ? client.scanModeApp : SCAN_MODE_APP_IN_BACKGROUND; int maxScanMode = mScanNative.isForceDowngradedScanClient(client) ? SCAN_MODE_FORCE_DOWNGRADED : scanMode; return client.updateScanMode(getMinScanMode(scanMode, maxScanMode)); } private boolean downgradeScanModeFromMaxDuty(ScanClient client) { if ((client.stats == null) || mAdapterService.getScanDowngradeDurationMillis() == 0) { return false; } if (ScanSettings.SCAN_MODE_LOW_LATENCY == client.settings.getScanMode()) { client.updateScanMode(ScanSettings.SCAN_MODE_BALANCED); int scanMode = client.settings.getScanMode(); int maxScanMode = SCAN_MODE_MAX_IN_CONCURRENCY; if (client.updateScanMode(getMinScanMode(scanMode, maxScanMode))) { client.stats.setScanDowngrade(client.scannerId, true); if (DBG) { Log.d(TAG, "downgradeScanModeFromMaxDuty() for " + client); Loading Loading @@ -1367,10 +1372,14 @@ public class ScanManager { removeScanFilters(client.scannerId); } else { Log.w(TAG, Log.w( TAG, "Moving filtered scan client to downgraded scan (scannerId " + client.scannerId + ")"); client.updateScanMode(ScanSettings.SCAN_MODE_LOW_POWER); + client.scannerId + ")"); int scanMode = client.settings.getScanMode(); int maxScanMode = SCAN_MODE_FORCE_DOWNGRADED; client.updateScanMode(getMinScanMode(scanMode, maxScanMode)); } client.stats.setScanTimeout(client.scannerId); client.stats.recordScanTimeoutCountMetrics(); Loading Loading @@ -2027,19 +2036,23 @@ public class ScanManager { } for (ScanClient client : mRegularScanClients) { if (client.appUid != uid || mScanNative.isForceDowngradedScanClient(client)) { if (client.appUid != uid || mScanNative.isOpportunisticScanClient(client)) { continue; } if (isForeground) { if (client.updateScanMode(client.scanModeApp)) { int scanMode = client.scanModeApp; int maxScanMode = mScanNative.isForceDowngradedScanClient(client) ? SCAN_MODE_FORCE_DOWNGRADED : scanMode; if (client.updateScanMode(getMinScanMode(scanMode, maxScanMode))) { updatedScanParams = true; } } else { // Skip scan mode update in any of following cases // 1. screen is already off which triggers handleScreenOff() // 2. opportunistics scan if (mScreenOn && !mScanNative.isOpportunisticScanClient(client) && client.updateScanMode(SCAN_MODE_APP_IN_BACKGROUND)) { int scanMode = client.settings.getScanMode(); int maxScanMode = mScreenOn ? SCAN_MODE_APP_IN_BACKGROUND : ScanSettings.SCAN_MODE_SCREEN_OFF; if (client.updateScanMode(getMinScanMode(scanMode, maxScanMode))) { updatedScanParams = true; } } Loading @@ -2053,4 +2066,10 @@ public class ScanManager { mScanNative.configureRegularScanParams(); } } private int getMinScanMode(int oldScanMode, int newScanMode) { return mPriorityMap.get(oldScanMode) <= mPriorityMap.get(newScanMode) ? oldScanMode : newScanMode; } } android/app/tests/unit/src/com/android/bluetooth/gatt/ScanManagerTest.java +8 −6 Original line number Diff line number Diff line Loading @@ -611,12 +611,12 @@ public class ScanManagerTest { assertThat(client.stats.isScanTimeout(client.scannerId)).isTrue(); // Turn off screen sendMessageWaitForProcessed(createScreenOnOffMessage(false)); assertThat(client.settings.getScanMode()).isEqualTo(expectedScanMode); // Turn on screen sendMessageWaitForProcessed(createScreenOnOffMessage(true)); assertThat(client.settings.getScanMode()).isEqualTo(expectedScanMode); assertThat(client.settings.getScanMode()).isEqualTo(SCAN_MODE_SCREEN_OFF); // Set as backgournd app sendMessageWaitForProcessed(createImportanceMessage(false)); assertThat(client.settings.getScanMode()).isEqualTo(SCAN_MODE_SCREEN_OFF); // Turn on screen sendMessageWaitForProcessed(createScreenOnOffMessage(true)); assertThat(client.settings.getScanMode()).isEqualTo(expectedScanMode); // Set as foreground app sendMessageWaitForProcessed(createImportanceMessage(true)); Loading Loading @@ -1183,8 +1183,10 @@ public class ScanManagerTest { sendMessageWaitForProcessed(createScreenOnOffMessage(true)); verify(mMetricsLogger, atLeastOnce()).cacheCount( eq(BluetoothProtoEnums.LE_SCAN_RADIO_DURATION_REGULAR), anyLong()); verify(mMetricsLogger, never()).cacheCount( eq(BluetoothProtoEnums.LE_SCAN_RADIO_DURATION_REGULAR_SCREEN_ON), anyLong()); verify(mMetricsLogger, atMost(1)) .cacheCount( eq(BluetoothProtoEnums.LE_SCAN_RADIO_DURATION_REGULAR_SCREEN_ON), anyLong()); verify(mMetricsLogger, atLeastOnce()).cacheCount( eq(BluetoothProtoEnums.LE_SCAN_RADIO_DURATION_REGULAR_SCREEN_OFF), anyLong()); Mockito.clearInvocations(mMetricsLogger); Loading Loading
android/app/src/com/android/bluetooth/gatt/ScanManager.java +39 −20 Original line number Diff line number Diff line Loading @@ -143,6 +143,8 @@ public class ScanManager { ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE; private static final boolean DEFAULT_UID_IS_FOREGROUND = true; private static final int SCAN_MODE_APP_IN_BACKGROUND = ScanSettings.SCAN_MODE_LOW_POWER; private static final int SCAN_MODE_FORCE_DOWNGRADED = ScanSettings.SCAN_MODE_LOW_POWER; private static final int SCAN_MODE_MAX_IN_CONCURRENCY = ScanSettings.SCAN_MODE_BALANCED; private final SparseBooleanArray mIsUidForegroundMap = new SparseBooleanArray(); private boolean mScreenOn = false; private boolean mIsConnecting; Loading Loading @@ -734,10 +736,10 @@ public class ScanManager { } private boolean updateScanModeScreenOff(ScanClient client) { if (mScanNative.isForceDowngradedScanClient(client)) { if (mScanNative.isOpportunisticScanClient(client)) { return false; } if (!isAppForeground(client) && !mScanNative.isOpportunisticScanClient(client)) { if (!isAppForeground(client) || mScanNative.isForceDowngradedScanClient(client)) { return client.updateScanMode(ScanSettings.SCAN_MODE_SCREEN_OFF); } Loading Loading @@ -834,22 +836,25 @@ public class ScanManager { } private boolean updateScanModeScreenOn(ScanClient client) { if (mScanNative.isForceDowngradedScanClient(client)) { if (mScanNative.isOpportunisticScanClient(client)) { return false; } int newScanMode = (isAppForeground(client) || mScanNative.isOpportunisticScanClient(client)) ? client.scanModeApp : SCAN_MODE_APP_IN_BACKGROUND; return client.updateScanMode(newScanMode); int scanMode = isAppForeground(client) ? client.scanModeApp : SCAN_MODE_APP_IN_BACKGROUND; int maxScanMode = mScanNative.isForceDowngradedScanClient(client) ? SCAN_MODE_FORCE_DOWNGRADED : scanMode; return client.updateScanMode(getMinScanMode(scanMode, maxScanMode)); } private boolean downgradeScanModeFromMaxDuty(ScanClient client) { if ((client.stats == null) || mAdapterService.getScanDowngradeDurationMillis() == 0) { return false; } if (ScanSettings.SCAN_MODE_LOW_LATENCY == client.settings.getScanMode()) { client.updateScanMode(ScanSettings.SCAN_MODE_BALANCED); int scanMode = client.settings.getScanMode(); int maxScanMode = SCAN_MODE_MAX_IN_CONCURRENCY; if (client.updateScanMode(getMinScanMode(scanMode, maxScanMode))) { client.stats.setScanDowngrade(client.scannerId, true); if (DBG) { Log.d(TAG, "downgradeScanModeFromMaxDuty() for " + client); Loading Loading @@ -1367,10 +1372,14 @@ public class ScanManager { removeScanFilters(client.scannerId); } else { Log.w(TAG, Log.w( TAG, "Moving filtered scan client to downgraded scan (scannerId " + client.scannerId + ")"); client.updateScanMode(ScanSettings.SCAN_MODE_LOW_POWER); + client.scannerId + ")"); int scanMode = client.settings.getScanMode(); int maxScanMode = SCAN_MODE_FORCE_DOWNGRADED; client.updateScanMode(getMinScanMode(scanMode, maxScanMode)); } client.stats.setScanTimeout(client.scannerId); client.stats.recordScanTimeoutCountMetrics(); Loading Loading @@ -2027,19 +2036,23 @@ public class ScanManager { } for (ScanClient client : mRegularScanClients) { if (client.appUid != uid || mScanNative.isForceDowngradedScanClient(client)) { if (client.appUid != uid || mScanNative.isOpportunisticScanClient(client)) { continue; } if (isForeground) { if (client.updateScanMode(client.scanModeApp)) { int scanMode = client.scanModeApp; int maxScanMode = mScanNative.isForceDowngradedScanClient(client) ? SCAN_MODE_FORCE_DOWNGRADED : scanMode; if (client.updateScanMode(getMinScanMode(scanMode, maxScanMode))) { updatedScanParams = true; } } else { // Skip scan mode update in any of following cases // 1. screen is already off which triggers handleScreenOff() // 2. opportunistics scan if (mScreenOn && !mScanNative.isOpportunisticScanClient(client) && client.updateScanMode(SCAN_MODE_APP_IN_BACKGROUND)) { int scanMode = client.settings.getScanMode(); int maxScanMode = mScreenOn ? SCAN_MODE_APP_IN_BACKGROUND : ScanSettings.SCAN_MODE_SCREEN_OFF; if (client.updateScanMode(getMinScanMode(scanMode, maxScanMode))) { updatedScanParams = true; } } Loading @@ -2053,4 +2066,10 @@ public class ScanManager { mScanNative.configureRegularScanParams(); } } private int getMinScanMode(int oldScanMode, int newScanMode) { return mPriorityMap.get(oldScanMode) <= mPriorityMap.get(newScanMode) ? oldScanMode : newScanMode; } }
android/app/tests/unit/src/com/android/bluetooth/gatt/ScanManagerTest.java +8 −6 Original line number Diff line number Diff line Loading @@ -611,12 +611,12 @@ public class ScanManagerTest { assertThat(client.stats.isScanTimeout(client.scannerId)).isTrue(); // Turn off screen sendMessageWaitForProcessed(createScreenOnOffMessage(false)); assertThat(client.settings.getScanMode()).isEqualTo(expectedScanMode); // Turn on screen sendMessageWaitForProcessed(createScreenOnOffMessage(true)); assertThat(client.settings.getScanMode()).isEqualTo(expectedScanMode); assertThat(client.settings.getScanMode()).isEqualTo(SCAN_MODE_SCREEN_OFF); // Set as backgournd app sendMessageWaitForProcessed(createImportanceMessage(false)); assertThat(client.settings.getScanMode()).isEqualTo(SCAN_MODE_SCREEN_OFF); // Turn on screen sendMessageWaitForProcessed(createScreenOnOffMessage(true)); assertThat(client.settings.getScanMode()).isEqualTo(expectedScanMode); // Set as foreground app sendMessageWaitForProcessed(createImportanceMessage(true)); Loading Loading @@ -1183,8 +1183,10 @@ public class ScanManagerTest { sendMessageWaitForProcessed(createScreenOnOffMessage(true)); verify(mMetricsLogger, atLeastOnce()).cacheCount( eq(BluetoothProtoEnums.LE_SCAN_RADIO_DURATION_REGULAR), anyLong()); verify(mMetricsLogger, never()).cacheCount( eq(BluetoothProtoEnums.LE_SCAN_RADIO_DURATION_REGULAR_SCREEN_ON), anyLong()); verify(mMetricsLogger, atMost(1)) .cacheCount( eq(BluetoothProtoEnums.LE_SCAN_RADIO_DURATION_REGULAR_SCREEN_ON), anyLong()); verify(mMetricsLogger, atLeastOnce()).cacheCount( eq(BluetoothProtoEnums.LE_SCAN_RADIO_DURATION_REGULAR_SCREEN_OFF), anyLong()); Mockito.clearInvocations(mMetricsLogger); Loading