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

Commit 7e80e385 authored by Sanket Agarwal's avatar Sanket Agarwal Committed by Pavlin Radoslavov
Browse files

While turning OFF do not honor ON requests.

Native stack does not handle being put from OFF -> ON state without
doing a complete cleanup. Hence instead of going from start -> ON -> OFF
-> cleanup it goes start -> ON -> OFF ->ON -> ... usually leads to race
conditions down the road in native.

This patch is a workaround so that we can throw away the requests if we
are in currently "turning off" phase. The side-effect would be that user
will need to turn it ON again. The race happens when the turn OFF time
is longer but usually it is found to be close to order of seconds hence
the wait should be bounded.

Bug: b/28318203
Change-Id: I14f6633f31311e5b561e1dcbc8a9d6d2a5dd6fdc
parent 5365ba39
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -649,7 +649,20 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
                                                "Need BLUETOOTH ADMIN permission");
        if (DBG) {
            Log.d(TAG,"enable():  mBluetooth =" + mBluetooth +
                    " mBinding = " + mBinding);
                    " mBinding = " + mBinding + " mState = " + mState);
        }
        // We do not honor ON requests when the adapter is already turned ON or in the process of
        // turning ON.
        // As a protective mechanism to make sure that the native stack gets cleaned up properly
        // before turning it back ON we ignore requests while the bluetooth is turning OFF.
        // Bug: b/28318203
        if (mState == BluetoothAdapter.STATE_BLE_TURNING_OFF ||
            mState == BluetoothAdapter.STATE_TURNING_OFF ||
            mState == BluetoothAdapter.STATE_ON ||
            mState == BluetoothAdapter.STATE_BLE_ON ||
            mState == BluetoothAdapter.STATE_TURNING_ON ||
            mState == BluetoothAdapter.STATE_BLE_TURNING_ON) {
            return false;
        }

        synchronized(mReceiver) {