summaryrefslogtreecommitdiffstats
path: root/core/java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/server/BluetoothAdapterStateMachine.java26
-rwxr-xr-xcore/java/android/server/BluetoothService.java17
2 files changed, 25 insertions, 18 deletions
diff --git a/core/java/android/server/BluetoothAdapterStateMachine.java b/core/java/android/server/BluetoothAdapterStateMachine.java
index ac46ee2..d26364e 100644
--- a/core/java/android/server/BluetoothAdapterStateMachine.java
+++ b/core/java/android/server/BluetoothAdapterStateMachine.java
@@ -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();
diff --git a/core/java/android/server/BluetoothService.java b/core/java/android/server/BluetoothService.java
index f0fb4e0..63da926 100755
--- a/core/java/android/server/BluetoothService.java
+++ b/core/java/android/server/BluetoothService.java
@@ -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);