Avoid Bluetooth gets turned on by enableBle

BluetoothHandler was not able to tell whether the MESSAGE_ENABLE was
from enable() or enableBle(), which sometimes lead to Bluetooth gets
turned to STATE_ON by an enableBle() call.

Fix this problem by adding a BLE specific argument in the message to
differ the calls.

Bug: 191404687
Test: Manual
Change-Id: Ic9df612ec0e396932df2fb3bf3a5874bd4e7443c
(cherry picked from commit e74d4835a1)
This commit is contained in:
Ugo Yu
2021-09-02 18:40:07 +08:00
parent cf13a4b17c
commit cc89e936cf

View File

@@ -186,8 +186,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
private final ReentrantReadWriteLock mBluetoothLock = new ReentrantReadWriteLock(); private final ReentrantReadWriteLock mBluetoothLock = new ReentrantReadWriteLock();
private boolean mBinding; private boolean mBinding;
private boolean mUnbinding; private boolean mUnbinding;
private int mWaitForEnableRetry;
private int mWaitForDisableRetry;
private BluetoothModeChangeHelper mBluetoothModeChangeHelper; private BluetoothModeChangeHelper mBluetoothModeChangeHelper;
@@ -956,14 +954,15 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
if (mState == BluetoothAdapter.STATE_ON if (mState == BluetoothAdapter.STATE_ON
|| mState == BluetoothAdapter.STATE_BLE_ON || mState == BluetoothAdapter.STATE_BLE_ON
|| mState == BluetoothAdapter.STATE_TURNING_ON || mState == BluetoothAdapter.STATE_TURNING_ON
|| mState == BluetoothAdapter.STATE_TURNING_OFF) { || mState == BluetoothAdapter.STATE_TURNING_OFF
Log.d(TAG, "enableBLE(): Bluetooth already enabled"); || mState == BluetoothAdapter.STATE_BLE_TURNING_ON) {
Log.d(TAG, "enableBLE(): Bluetooth is already enabled or is turning on");
return true; return true;
} }
synchronized (mReceiver) { synchronized (mReceiver) {
// waive WRITE_SECURE_SETTINGS permission check // waive WRITE_SECURE_SETTINGS permission check
sendEnableMsg(false, sendEnableMsg(false, BluetoothProtoEnums.ENABLE_DISABLE_REASON_APPLICATION_REQUEST,
BluetoothProtoEnums.ENABLE_DISABLE_REASON_APPLICATION_REQUEST, packageName); packageName, true);
} }
return true; return true;
} }
@@ -1776,6 +1775,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
private class BluetoothHandler extends Handler { private class BluetoothHandler extends Handler {
boolean mGetNameAddressOnly = false; boolean mGetNameAddressOnly = false;
private int mWaitForEnableRetry;
private int mWaitForDisableRetry;
BluetoothHandler(Looper looper) { BluetoothHandler(Looper looper) {
super(looper); super(looper);
@@ -1826,11 +1827,12 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
case MESSAGE_ENABLE: case MESSAGE_ENABLE:
int quietEnable = msg.arg1; int quietEnable = msg.arg1;
int isBle = msg.arg2;
if (mHandler.hasMessages(MESSAGE_HANDLE_DISABLE_DELAYED) if (mHandler.hasMessages(MESSAGE_HANDLE_DISABLE_DELAYED)
|| mHandler.hasMessages(MESSAGE_HANDLE_ENABLE_DELAYED)) { || mHandler.hasMessages(MESSAGE_HANDLE_ENABLE_DELAYED)) {
// We are handling enable or disable right now, wait for it. // We are handling enable or disable right now, wait for it.
mHandler.sendMessageDelayed(mHandler.obtainMessage(MESSAGE_ENABLE, mHandler.sendMessageDelayed(mHandler.obtainMessage(MESSAGE_ENABLE,
quietEnable, 0), ENABLE_DISABLE_DELAY_MS); quietEnable, isBle), ENABLE_DISABLE_DELAY_MS);
break; break;
} }
@@ -1845,13 +1847,28 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
try { try {
mBluetoothLock.readLock().lock(); mBluetoothLock.readLock().lock();
if (mBluetooth != null) { if (mBluetooth != null) {
boolean isHandled = true;
int state = mBluetooth.getState(); int state = mBluetooth.getState();
if (state == BluetoothAdapter.STATE_BLE_ON) { switch (state) {
Slog.w(TAG, "BT Enable in BLE_ON State, going to ON"); case BluetoothAdapter.STATE_BLE_ON:
mBluetooth.onLeServiceUp(mContext.getAttributionSource()); if (isBle == 1) {
persistBluetoothSetting(BLUETOOTH_ON_BLUETOOTH); Slog.i(TAG, "Already at BLE_ON State");
break; } else {
Slog.w(TAG, "BT Enable in BLE_ON State, going to ON");
mBluetooth.onLeServiceUp(mContext.getAttributionSource());
persistBluetoothSetting(BLUETOOTH_ON_BLUETOOTH);
}
break;
case BluetoothAdapter.STATE_BLE_TURNING_ON:
case BluetoothAdapter.STATE_TURNING_ON:
case BluetoothAdapter.STATE_ON:
Slog.i(TAG, "MESSAGE_ENABLE: already enabled");
break;
default:
isHandled = false;
break;
} }
if (isHandled) break;
} }
} catch (RemoteException e) { } catch (RemoteException e) {
Slog.e(TAG, "", e); Slog.e(TAG, "", e);
@@ -2617,7 +2634,12 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
} }
private void sendEnableMsg(boolean quietMode, int reason, String packageName) { private void sendEnableMsg(boolean quietMode, int reason, String packageName) {
mHandler.sendMessage(mHandler.obtainMessage(MESSAGE_ENABLE, quietMode ? 1 : 0, 0)); sendEnableMsg(quietMode, reason, packageName, false);
}
private void sendEnableMsg(boolean quietMode, int reason, String packageName, boolean isBle) {
mHandler.sendMessage(mHandler.obtainMessage(MESSAGE_ENABLE, quietMode ? 1 : 0,
isBle ? 1 : 0));
addActiveLog(reason, packageName, true); addActiveLog(reason, packageName, true);
mLastEnabledTime = SystemClock.elapsedRealtime(); mLastEnabledTime = SystemClock.elapsedRealtime();
} }