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

Commit fa790104 authored by Pavlin Radoslavov's avatar Pavlin Radoslavov Committed by android-build-merger
Browse files

Merge "Delay handleEnable() until Bluetooth state is OFF" into nyc-dev

am: 0bc61eb1

* commit '0bc61eb1':
  Delay handleEnable() until Bluetooth state is OFF

Change-Id: Ia2aed3304039a672961608fc900ab8996f67d716
parents 1a6b6fc2 0bc61eb1
Loading
Loading
Loading
Loading
+31 −41
Original line number Original line Diff line number Diff line
@@ -657,19 +657,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
            Slog.d(TAG,"enable():  mBluetooth =" + mBluetooth +
            Slog.d(TAG,"enable():  mBluetooth =" + mBluetooth +
                    " mBinding = " + mBinding + " mState = " + mState);
                    " 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) {
        synchronized(mReceiver) {
            mQuietEnableExternal = false;
            mQuietEnableExternal = false;
@@ -719,6 +706,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
            mBluetoothLock.writeLock().lock();
            mBluetoothLock.writeLock().lock();
            if (mUnbinding) return;
            if (mUnbinding) return;
            mUnbinding = true;
            mUnbinding = true;
            mHandler.removeMessages(MESSAGE_BLUETOOTH_STATE_CHANGE);
            if (mBluetooth != null) {
            if (mBluetooth != null) {
                //Unregister callback object
                //Unregister callback object
                try {
                try {
@@ -1183,7 +1171,31 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
                    }
                    }
                    mHandler.removeMessages(MESSAGE_RESTART_BLUETOOTH_SERVICE);
                    mHandler.removeMessages(MESSAGE_RESTART_BLUETOOTH_SERVICE);
                    mEnable = true;
                    mEnable = true;
                    if (mBluetooth == null) {
                        handleEnable(msg.arg1 == 1);
                        handleEnable(msg.arg1 == 1);
                    } else {
                        //
                        // We need to wait until transitioned to STATE_OFF and
                        // the previous Bluetooth process has exited. The
                        // waiting period has three components:
                        // (a) Wait until the local state is STATE_OFF. This
                        //     is accomplished by "waitForOnOff(false, true)".
                        // (b) Wait until the STATE_OFF state is updated to
                        //     all components.
                        // (c) Wait until the Bluetooth process exits, and
                        //     ActivityManager detects it.
                        // The waiting for (b) and (c) is accomplished by
                        // delaying the MESSAGE_RESTART_BLUETOOTH_SERVICE
                        // message. On slower devices, that delay needs to be
                        // on the order of (2 * SERVICE_RESTART_TIME_MS).
                        //
                        waitForOnOff(false, true);
                        mQuietEnable = (msg.arg1 == 1);
                        Message restartMsg = mHandler.obtainMessage(
                                MESSAGE_RESTART_BLUETOOTH_SERVICE);
                        mHandler.sendMessageDelayed(restartMsg,
                                2 * SERVICE_RESTART_TIME_MS);
                    }
                    break;
                    break;


                case MESSAGE_DISABLE:
                case MESSAGE_DISABLE:
@@ -1635,14 +1647,11 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
                if (newState == BluetoothAdapter.STATE_OFF) {
                if (newState == BluetoothAdapter.STATE_OFF) {
                    // If Bluetooth is off, send service down event to proxy objects, and unbind
                    // If Bluetooth is off, send service down event to proxy objects, and unbind
                    if (DBG) Slog.d(TAG, "Bluetooth is complete turn off");
                    if (DBG) Slog.d(TAG, "Bluetooth is complete turn off");
                    if (canUnbindBluetoothService()) {
                        if (DBG) Slog.d(TAG, "Good to unbind!");
                    sendBluetoothServiceDownCallback();
                    sendBluetoothServiceDownCallback();
                    unbindAndFinish();
                    unbindAndFinish();
                    sendBleStateChanged(prevState, newState);
                    sendBleStateChanged(prevState, newState);
                    // Don't broadcast as it has already been broadcast before
                    // Don't broadcast as it has already been broadcast before
                    isStandardBroadcast = false;
                    isStandardBroadcast = false;
                    }


                } else if (!intermediate_off) {
                } else if (!intermediate_off) {
                    // connect to GattService
                    // connect to GattService
@@ -1744,25 +1753,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
                             quietMode ? 1 : 0, 0));
                             quietMode ? 1 : 0, 0));
    }
    }


    private boolean canUnbindBluetoothService() {
        try {
            //Only unbind with mEnable flag not set
            //For race condition: disable and enable back-to-back
            //Avoid unbind right after enable due to callback from disable
            //Only unbind with Bluetooth at OFF state
            //Only unbind without any MESSAGE_BLUETOOTH_STATE_CHANGE message
            mBluetoothLock.readLock().lock();
            if (mEnable || (mBluetooth == null)) return false;
            if (mHandler.hasMessages(MESSAGE_BLUETOOTH_STATE_CHANGE)) return false;
            return (mBluetooth.getState() == BluetoothAdapter.STATE_OFF);
        } catch (RemoteException e) {
            Slog.e(TAG, "getState()", e);
        } finally {
            mBluetoothLock.readLock().unlock();
        }
        return false;
    }

    private void recoverBluetoothServiceFromError() {
    private void recoverBluetoothServiceFromError() {
        Slog.e(TAG,"recoverBluetoothServiceFromError");
        Slog.e(TAG,"recoverBluetoothServiceFromError");
        try {
        try {