diff options
author | 2025-03-17 09:23:11 -0700 | |
---|---|---|
committer | 2025-03-17 09:23:11 -0700 | |
commit | efdf75f7c8441dba69d8dacedb1001785e2f7fbc (patch) | |
tree | 26c96b6798cfac0eb4d22e7ebfc35c89ec3a9be0 | |
parent | 9b66152977138fdc639da3b60dea8a2b62c82133 (diff) | |
parent | 2888a786b61f755775e849a650b7199a2fc26e3d (diff) |
Merge "SystemServer: race between enableBle and apm" into main
-rw-r--r-- | service/src/com/android/server/bluetooth/BluetoothManagerService.java | 30 | ||||
-rw-r--r-- | service/tests/src/com/android/server/bluetooth/BluetoothManagerServiceTest.java | 29 |
2 files changed, 52 insertions, 7 deletions
diff --git a/service/src/com/android/server/bluetooth/BluetoothManagerService.java b/service/src/com/android/server/bluetooth/BluetoothManagerService.java index 5f13b6266a..b797d6ceac 100644 --- a/service/src/com/android/server/bluetooth/BluetoothManagerService.java +++ b/service/src/com/android/server/bluetooth/BluetoothManagerService.java @@ -1391,15 +1391,31 @@ class BluetoothManagerService { } // If we tried to enable BT while BT was in the process of shutting down, // wait for the BT process to fully tear down and then force a restart - // here. This is a bit of a hack (b/29363429). + // here. This is a bit of a hack (b/29363429). if (prevState == STATE_BLE_TURNING_OFF && newState == STATE_OFF) { - if (mEnable) { - Log.d(TAG, "Entering STATE_OFF but mEnabled is true; restarting."); - if (!Flags.systemServerRemoveExtraThreadJump()) { - waitForState(STATE_OFF); + if (Flags.enableBleWhileDisablingAirplane()) { + if (mHandler.hasMessages(0, ON_AIRPLANE_MODE_CHANGED_TOKEN)) { + mHandler.removeCallbacksAndMessages(ON_AIRPLANE_MODE_CHANGED_TOKEN); + Log.d(TAG, "Handling delayed airplane mode event"); + handleAirplaneModeChanged(AirplaneModeListener.isOnOverrode()); + } + if (mEnable && !isBinding()) { + Log.d(TAG, "Entering STATE_OFF but mEnabled is true; restarting."); + if (!Flags.systemServerRemoveExtraThreadJump()) { + waitForState(STATE_OFF); + } + mHandler.sendEmptyMessageDelayed( + MESSAGE_RESTART_BLUETOOTH_SERVICE, getServiceRestartMs()); + } + } else { + if (mEnable) { + Log.d(TAG, "Entering STATE_OFF but mEnabled is true; restarting."); + if (!Flags.systemServerRemoveExtraThreadJump()) { + waitForState(STATE_OFF); + } + mHandler.sendEmptyMessageDelayed( + MESSAGE_RESTART_BLUETOOTH_SERVICE, getServiceRestartMs()); } - mHandler.sendEmptyMessageDelayed( - MESSAGE_RESTART_BLUETOOTH_SERVICE, getServiceRestartMs()); } } if (newState == STATE_ON || newState == STATE_BLE_ON) { diff --git a/service/tests/src/com/android/server/bluetooth/BluetoothManagerServiceTest.java b/service/tests/src/com/android/server/bluetooth/BluetoothManagerServiceTest.java index 5e2b66ac06..e825940e90 100644 --- a/service/tests/src/com/android/server/bluetooth/BluetoothManagerServiceTest.java +++ b/service/tests/src/com/android/server/bluetooth/BluetoothManagerServiceTest.java @@ -617,6 +617,35 @@ public class BluetoothManagerServiceTest { assertThat(mLooper.nextMessage()).isNull(); // Must not create a MESSAGE_ENABLE } + @Test + @EnableFlags({ + Flags.FLAG_SYSTEM_SERVER_REMOVE_EXTRA_THREAD_JUMP, + Flags.FLAG_ENABLE_BLE_WHILE_DISABLING_AIRPLANE + }) + public void enableBle_whenDisableAirplaneIsDelayed_startBluetooth() throws Exception { + mManagerService.enable("enableBle_whenDisableAirplaneIsDelayed_startBluetooth"); + IBluetoothCallback btCallback = transition_offToOn(); + mManagerService.onAirplaneModeChanged(true); + assertThat(mManagerService.getState()).isEqualTo(STATE_TURNING_OFF); + + // Generate an event that will be delayed due to the TURNING_OFF state + mManagerService.onAirplaneModeChanged(false); + + transition_onToBleOn(btCallback); + mInOrder.verify(mAdapterBinder).bleOnToOff(any()); + assertThat(mManagerService.getState()).isEqualTo(STATE_BLE_TURNING_OFF); + + // As soon as we left BLE_ON, generate a call from 3p app that request to turn on Bluetooth + mManagerService.enableBle("enableBle_whenDisableAirplaneIsDelayed_startBluetooth", mBinder); + + // When all the profile are started, adapterService consider it is ON + btCallback.onBluetoothStateChange(STATE_BLE_TURNING_OFF, STATE_OFF); + syncHandler(MESSAGE_BLUETOOTH_STATE_CHANGE); + + transition_offToOn(); + assertThat(mManagerService.getState()).isEqualTo(STATE_ON); + } + @SafeVarargs private void verifyIntentSent(Matcher<Intent>... matchers) { mInOrder.verify(mContext) |