summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2025-03-17 09:23:11 -0700
committer Android (Google) Code Review <android-gerrit@google.com> 2025-03-17 09:23:11 -0700
commitefdf75f7c8441dba69d8dacedb1001785e2f7fbc (patch)
tree26c96b6798cfac0eb4d22e7ebfc35c89ec3a9be0
parent9b66152977138fdc639da3b60dea8a2b62c82133 (diff)
parent2888a786b61f755775e849a650b7199a2fc26e3d (diff)
Merge "SystemServer: race between enableBle and apm" into main
-rw-r--r--service/src/com/android/server/bluetooth/BluetoothManagerService.java30
-rw-r--r--service/tests/src/com/android/server/bluetooth/BluetoothManagerServiceTest.java29
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)