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

Commit 5c0f3e50 authored by Zhihai Xu's avatar Zhihai Xu Committed by Android (Google) Code Review
Browse files

Merge "Cannot enable Bluetooth after using airplane and Bluetooth tethering...

Merge "Cannot enable Bluetooth after using airplane and Bluetooth tethering sequentially" into jb-mr1.1-dev
parents 7538ff09 681ae7fc
Loading
Loading
Loading
Loading
+21 −8
Original line number Diff line number Diff line
@@ -982,16 +982,11 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
                sendBluetoothStateCallback(isUp);

                //If Bluetooth is off, send service down event to proxy objects, and unbind
                if (!isUp) {
                    //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
                    if ((!mEnable) && (mBluetooth != null)) {
                if (!isUp && canUnbindBluetoothService()) {
                    sendBluetoothServiceDownCallback();
                    unbindAndFinish();
                }
            }
            }

            //Send broadcast message to everyone else
            Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED);
@@ -1037,4 +1032,22 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
        Log.e(TAG,"waitForOnOff time out");
        return false;
    }

    private boolean canUnbindBluetoothService() {
        synchronized(mConnection) {
            //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
            try {
                if (mEnable || (mBluetooth == null)) return false;
                if (mHandler.hasMessages(MESSAGE_BLUETOOTH_STATE_CHANGE)) return false;
                return (mBluetooth.getState() == BluetoothAdapter.STATE_OFF);
            } catch (RemoteException e) {
                Log.e(TAG, "getState()", e);
            }
        }
        return false;
    }
}