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

Commit 167dd902 authored by Calvin On's avatar Calvin On Committed by android-build-merger
Browse files

Merge \"Fix race with BT disable in BLE_ON_STATE\" into nyc-dev

am: 1bf8782605

Change-Id: I60d35a8139caf0a1c839654d6c488fede4fa37d7
parents d1c5127c 20f11b34
Loading
Loading
Loading
Loading
+0 −18
Original line number Original line Diff line number Diff line
@@ -897,28 +897,10 @@ public final class BluetoothAdapter {
     */
     */
    @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
    @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
    public boolean enable() {
    public boolean enable() {
        int state = BluetoothAdapter.STATE_OFF;
        if (isEnabled() == true) {
        if (isEnabled() == true) {
            if (DBG) Log.d(TAG, "enable(): BT is already enabled..!");
            if (DBG) Log.d(TAG, "enable(): BT is already enabled..!");
            return true;
            return true;
        }
        }
        // Use service interface to get the exact state
        try {
            mServiceLock.readLock().lock();
            if (mService != null) {
                state = mService.getState();
            }
        } catch (RemoteException e) {
            Log.e(TAG, "", e);
        } finally {
            mServiceLock.readLock().unlock();
        }

        if (state == BluetoothAdapter.STATE_BLE_ON) {
                Log.e(TAG, "BT is in BLE_ON State");
                notifyUserAction(true);
                return true;
        }
        try {
        try {
            return mManagerService.enable();
            return mManagerService.enable();
        } catch (RemoteException e) {Log.e(TAG, "", e);}
        } catch (RemoteException e) {Log.e(TAG, "", e);}
+45 −14
Original line number Original line Diff line number Diff line
@@ -1171,8 +1171,27 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
                    }
                    }
                    mHandler.removeMessages(MESSAGE_RESTART_BLUETOOTH_SERVICE);
                    mHandler.removeMessages(MESSAGE_RESTART_BLUETOOTH_SERVICE);
                    mEnable = true;
                    mEnable = true;

                    // Use service interface to get the exact state
                    try {
                        mBluetoothLock.readLock().lock();
                        if (mBluetooth != null) {
                            int state = mBluetooth.getState();
                            if (state == BluetoothAdapter.STATE_BLE_ON) {
                                Slog.w(TAG, "BT is in BLE_ON State");
                                mBluetooth.onLeServiceUp();
                                break;
                            }
                        }
                    } catch (RemoteException e) {
                        Slog.e(TAG, "", e);
                    } finally {
                        mBluetoothLock.readLock().unlock();
                    }

                    mQuietEnable = (msg.arg1 == 1);
                    if (mBluetooth == null) {
                    if (mBluetooth == null) {
                        handleEnable(msg.arg1 == 1);
                        handleEnable(mQuietEnable);
                    } else {
                    } else {
                        //
                        //
                        // We need to wait until transitioned to STATE_OFF and
                        // We need to wait until transitioned to STATE_OFF and
@@ -1190,7 +1209,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
                        // on the order of (2 * SERVICE_RESTART_TIME_MS).
                        // on the order of (2 * SERVICE_RESTART_TIME_MS).
                        //
                        //
                        waitForOnOff(false, true);
                        waitForOnOff(false, true);
                        mQuietEnable = (msg.arg1 == 1);
                        Message restartMsg = mHandler.obtainMessage(
                        Message restartMsg = mHandler.obtainMessage(
                                MESSAGE_RESTART_BLUETOOTH_SERVICE);
                                MESSAGE_RESTART_BLUETOOTH_SERVICE);
                        mHandler.sendMessageDelayed(restartMsg,
                        mHandler.sendMessageDelayed(restartMsg,
@@ -1362,6 +1380,19 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
                            (mBluetooth != null) && mEnable) {
                            (mBluetooth != null) && mEnable) {
                        recoverBluetoothServiceFromError();
                        recoverBluetoothServiceFromError();
                    }
                    }
                    // 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).
                    if ((prevState == BluetoothAdapter.STATE_BLE_TURNING_OFF) &&
                            (newState == BluetoothAdapter.STATE_OFF)) {
                        if (mEnable) {
                            Slog.d(TAG, "Entering STATE_OFF but mEnabled is true; restarting.");
                            waitForOnOff(false, true);
                            Message restartMsg = mHandler.obtainMessage(
                                    MESSAGE_RESTART_BLUETOOTH_SERVICE);
                            mHandler.sendMessageDelayed(restartMsg, 2 * SERVICE_RESTART_TIME_MS);
                        }
                    }
                    if (newState == BluetoothAdapter.STATE_ON ||
                    if (newState == BluetoothAdapter.STATE_ON ||
                            newState == BluetoothAdapter.STATE_BLE_ON) {
                            newState == BluetoothAdapter.STATE_BLE_ON) {
                        // bluetooth is working, reset the counter
                        // bluetooth is working, reset the counter
@@ -1639,8 +1670,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
        boolean isStandardBroadcast = true;
        boolean isStandardBroadcast = true;
        if (prevState != newState) {
        if (prevState != newState) {
            //Notify all proxy objects first of adapter state change
            //Notify all proxy objects first of adapter state change
            if (newState == BluetoothAdapter.STATE_BLE_ON
            if (newState == BluetoothAdapter.STATE_BLE_ON ||
                   || newState == BluetoothAdapter.STATE_OFF) {
                    newState == BluetoothAdapter.STATE_OFF) {
                boolean intermediate_off = (prevState == BluetoothAdapter.STATE_TURNING_OFF
                boolean intermediate_off = (prevState == BluetoothAdapter.STATE_TURNING_OFF
                   && newState == BluetoothAdapter.STATE_BLE_ON);
                   && newState == BluetoothAdapter.STATE_BLE_ON);


@@ -1685,13 +1716,13 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
                sendBluetoothStateCallback(isUp);
                sendBluetoothStateCallback(isUp);
                sendBleStateChanged(prevState, newState);
                sendBleStateChanged(prevState, newState);


            } else if (newState == BluetoothAdapter.STATE_BLE_TURNING_ON
            } else if (newState == BluetoothAdapter.STATE_BLE_TURNING_ON ||
                || newState == BluetoothAdapter.STATE_BLE_TURNING_OFF ) {
                    newState == BluetoothAdapter.STATE_BLE_TURNING_OFF ) {
                sendBleStateChanged(prevState, newState);
                sendBleStateChanged(prevState, newState);
                isStandardBroadcast = false;
                isStandardBroadcast = false;


            } else if (newState == BluetoothAdapter.STATE_TURNING_ON
            } else if (newState == BluetoothAdapter.STATE_TURNING_ON ||
                || newState == BluetoothAdapter.STATE_TURNING_OFF) {
                    newState == BluetoothAdapter.STATE_TURNING_OFF) {
                sendBleStateChanged(prevState, newState);
                sendBleStateChanged(prevState, newState);
            }
            }