Merge "Check null of pidPair to skip the case the service record has been removed" into ics-factoryrom

This commit is contained in:
Matthew Xie
2011-09-20 13:55:48 -07:00
committed by Android (Google) Code Review
2 changed files with 25 additions and 18 deletions

View File

@@ -434,6 +434,10 @@ final class BluetoothAdapterStateMachine extends StateMachine {
if (mPublicState == BluetoothAdapter.STATE_TURNING_OFF) {
transitionTo(mHotOff);
finishSwitchingOff();
if (!mContext.getResources().getBoolean
(com.android.internal.R.bool.config_bluetooth_adapter_quick_switch)) {
deferMessage(obtainMessage(TURN_COLD));
}
}
} else {
if (mPublicState != BluetoothAdapter.STATE_TURNING_ON) {
@@ -486,16 +490,6 @@ final class BluetoothAdapterStateMachine extends StateMachine {
}
return retValue;
}
private void finishSwitchingOff() {
mBluetoothService.finishDisable();
if (mContext.getResources().getBoolean
(com.android.internal.R.bool.config_bluetooth_adapter_quick_switch)) {
broadcastState(BluetoothAdapter.STATE_OFF);
} else {
deferMessage(obtainMessage(TURN_COLD));
}
}
}
private class BluetoothOn extends State {
@@ -656,12 +650,10 @@ final class BluetoothAdapterStateMachine extends StateMachine {
//$FALL-THROUGH$ all devices are already disconnected
case ALL_DEVICES_DISCONNECTED:
removeMessages(DEVICES_DISCONNECT_TIMEOUT);
mBluetoothService.finishDisable();
broadcastState(BluetoothAdapter.STATE_OFF);
finishSwitchingOff();
break;
case DEVICES_DISCONNECT_TIMEOUT:
mBluetoothService.finishDisable();
broadcastState(BluetoothAdapter.STATE_OFF);
finishSwitchingOff();
Log.e(TAG, "Devices fail to disconnect, reseting...");
transitionTo(mHotOff);
deferMessage(obtainMessage(TURN_COLD));
@@ -695,6 +687,12 @@ final class BluetoothAdapterStateMachine extends StateMachine {
}
}
private void finishSwitchingOff() {
mBluetoothService.finishDisable();
broadcastState(BluetoothAdapter.STATE_OFF);
mBluetoothService.cleanupAfterFinishDisable();
}
private void shutoffBluetooth() {
mBluetoothService.shutoffBluetooth();
mEventLoop.stop();

View File

@@ -390,8 +390,7 @@ public class BluetoothService extends IBluetooth.Stub {
}
/**
* The Bluetooth has been turned off, but hot. Do bonding, profile,
* and internal cleanup
* The Bluetooth has been turned off, but hot. Do bonding, profile cleanup
*/
synchronized void finishDisable() {
// mark in progress bondings as cancelled
@@ -409,8 +408,17 @@ public class BluetoothService extends IBluetooth.Stub {
Intent intent = new Intent(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
intent.putExtra(BluetoothAdapter.EXTRA_SCAN_MODE, BluetoothAdapter.SCAN_MODE_NONE);
mContext.sendBroadcast(intent, BLUETOOTH_PERM);
}
/**
* Local clean up after broadcasting STATE_OFF intent
*/
synchronized void cleanupAfterFinishDisable() {
mAdapterProperties.clear();
for (Integer srHandle : mServiceRecordToPid.keySet()) {
removeServiceRecordNative(srHandle);
}
mServiceRecordToPid.clear();
mProfilesConnected = 0;
@@ -1526,6 +1534,8 @@ public class BluetoothService extends IBluetooth.Stub {
public void removeServiceRecord(int handle) {
mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM,
"Need BLUETOOTH permission");
// Since this is a binder call check if Bluetooth is off
if (getBluetoothStateInternal() == BluetoothAdapter.STATE_OFF) return;
Message message = mHandler.obtainMessage(MESSAGE_REMOVE_SERVICE_RECORD);
message.obj = new Pair<Integer, Integer>(handle, Binder.getCallingPid());
mHandler.sendMessage(message);
@@ -1533,8 +1543,7 @@ public class BluetoothService extends IBluetooth.Stub {
private synchronized void checkAndRemoveRecord(int handle, int pid) {
Pair<Integer, IBinder> pidPair = mServiceRecordToPid.get(handle);
Integer owner = pidPair.first;
if (owner != null && pid == owner.intValue()) {
if (pidPair != null && pid == pidPair.first) {
if (DBG) Log.d(TAG, "Removing service record " +
Integer.toHexString(handle) + " for pid " + pid);
mServiceRecordToPid.remove(handle);