From 372cffc99ef9d9d895a8a60f60269919748d7096 Mon Sep 17 00:00:00 2001 From: Nitin Shivpure Date: Tue, 7 Jun 2022 11:51:25 +0530 Subject: Bluetooth: Fix BT on failure during BT ON/OFF stress test RCA: if MESSAGE_ENABLE is received & there is already a pending MESSAGE_ENABLE or MESSAGE_DISABLE in Handler queue, then isBle flag is not properly handled while requeuing the MESSAGE_ENABLE OR MESSAGE_DISABLE, which is causing BT ON failure during BT ON/OFF stress test Fix: - If MESSAGE_ENABLE is received & there is already a pending MESSAGE_ENABLE or MESSAGE_DISABLE in Handler queue, then Handling isBle flag properly while requeuing the MESSAGE_ENABLE or MESSAGE_DISABLE. - If MESSAGE_DISABLE is received & there is already a pending MESSAGE_ENABLE in Handler queue, then isBle value is set based on mExternalEnable while requeuing the MESSAGE_ENABLE. CRs-Fixed: 3201863 Change-Id: I010b01c106a7dbcb0f194557e719c90c67842b25 --- .../android/server/BluetoothManagerService.java | 26 +++++++++++++--------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index 806ea95424a7..1ed5840c4ab4 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -2031,9 +2031,10 @@ class BluetoothManagerService extends IBluetoothManager.Stub { case MESSAGE_ENABLE: int quietEnable = msg.arg1; int isBle = msg.arg2; + Slog.d(TAG, "MESSAGE_ENABLE: isBle: " + isBle + " msg.obj : " + msg.obj); if (mHandler.hasMessages(MESSAGE_HANDLE_DISABLE_DELAYED) || mHandler.hasMessages(MESSAGE_HANDLE_ENABLE_DELAYED)) { - if (msg.arg2 == 0) { + if (msg.obj == null) { int delay = ENABLE_DISABLE_DELAY_MS; if (mHandler.hasMessages(MESSAGE_DISABLE)) { @@ -2044,11 +2045,11 @@ class BluetoothManagerService extends IBluetoothManager.Stub { mHandler.removeMessages(MESSAGE_ENABLE); // We are handling enable or disable right now, wait for it. mHandler.sendMessageDelayed(mHandler.obtainMessage( - MESSAGE_ENABLE, quietEnable, 1), delay); + MESSAGE_ENABLE, quietEnable, isBle, 1), delay); Slog.d(TAG, "Queue new MESSAGE_ENABLE"); } else { mHandler.sendMessageDelayed(mHandler.obtainMessage( - MESSAGE_ENABLE, quietEnable, 1), ENABLE_DISABLE_DELAY_MS); + MESSAGE_ENABLE, quietEnable, isBle, 1), ENABLE_DISABLE_DELAY_MS); Slog.d(TAG, "Re-Queue previous MESSAGE_ENABLE"); if (mHandler.hasMessages(MESSAGE_DISABLE)) { // Ensure the original order of just entering the queue @@ -2060,10 +2061,10 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } } break; - } else if(msg.arg2 == 0 && mHandler.hasMessages(MESSAGE_DISABLE)) { + } else if(msg.obj == null && mHandler.hasMessages(MESSAGE_DISABLE)) { mHandler.removeMessages(MESSAGE_ENABLE); mHandler.sendMessageDelayed(mHandler.obtainMessage( - MESSAGE_ENABLE, quietEnable, 1), ENABLE_DISABLE_DELAY_MS * 2); + MESSAGE_ENABLE, quietEnable, isBle, 1), ENABLE_DISABLE_DELAY_MS * 2); Slog.d(TAG, "MESSAGE_DISABLE exist. Queue new MESSAGE_ENABLE"); break; } @@ -2088,11 +2089,14 @@ class BluetoothManagerService extends IBluetoothManager.Stub { int state = mBluetooth.getState(); switch (state) { case BluetoothAdapter.STATE_BLE_ON: - if (isBle == 1) { - Slog.i(TAG, "Already at BLE_ON State"); - } else { - Slog.w(TAG, "BT Enable in BLE_ON State, going to ON"); + if (isBluetoothPersistedStateOnBluetooth() || + mEnableExternal) { + Slog.w(TAG, "BLE_ON State:Enable from Settings or" + + "BT on persisted, going to ON"); mBluetooth.onLeServiceUp(mContext.getAttributionSource()); + } else if (isBle == 1) { + Slog.w(TAG, "BLE_ON State:Queued enable from ble app," + + " stay in ble on"); } break; case BluetoothAdapter.STATE_BLE_TURNING_ON: @@ -2165,8 +2169,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub { // if MESSAGE_DISABLE present mHandler.removeMessages(MESSAGE_ENABLE); mHandler.sendMessageDelayed(mHandler.obtainMessage( - MESSAGE_ENABLE, mQuietEnableExternal ? 1: 0, 1), - ENABLE_DISABLE_DELAY_MS * 2); + MESSAGE_ENABLE, mQuietEnableExternal ? 1: 0, + mEnableExternal ? 0:1, 1), ENABLE_DISABLE_DELAY_MS * 2); Slog.d(TAG, "Re-Queue previous MESSAGE_ENABLE"); } } -- cgit v1.2.3