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

Commit 2be67fd0 authored by Jayden Kim's avatar Jayden Kim
Browse files

Allow the forced scan mode to be lower one during screen off

- After scan timeout, scan mode is set to low power scan mode
- The forced mode is alowed up to low power scan mode
- The forced scan mode could also be screen off scan mode

Bug: 289580163
Bug: 296909825
Test: atest BluetoothInstrumentationTests and device test
Change-Id: I762f0be9f8597b6835671abe2c346481b314932c
parent 5dcdae78
Loading
Loading
Loading
Loading
+39 −20
Original line number Diff line number Diff line
@@ -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;
@@ -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);
            }

@@ -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);
@@ -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();
@@ -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;
                }
            }
@@ -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;
    }
}
+8 −6
Original line number Diff line number Diff line
@@ -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));
@@ -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);