am 5c0f3e50: Merge "Cannot enable Bluetooth after using airplane and Bluetooth tethering sequentially" into jb-mr1.1-dev

* commit '5c0f3e5075c8ac8b22bbaeb32bddfada9657577a':
  Cannot enable Bluetooth after using airplane and Bluetooth tethering sequentially
This commit is contained in:
Zhihai Xu
2012-11-28 11:26:08 -08:00
committed by Android Git Automerger

View File

@@ -982,14 +982,9 @@ 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)) {
sendBluetoothServiceDownCallback();
unbindAndFinish();
}
if (!isUp && canUnbindBluetoothService()) {
sendBluetoothServiceDownCallback();
unbindAndFinish();
}
}
@@ -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;
}
}