Merge "Cleanup references when turning BT off." into ics-mr1

This commit is contained in:
Jaikumar Ganesh
2011-11-29 10:05:27 -08:00
committed by Android (Google) Code Review
9 changed files with 73 additions and 13 deletions

View File

@@ -129,6 +129,10 @@ public final class BluetoothA2dp implements BluetoothProfile {
} }
} }
/*package*/ void close() {
mServiceListener = null;
}
/** /**
* Initiate connection to a profile of the remote bluetooth device. * Initiate connection to a profile of the remote bluetooth device.
* *

View File

@@ -1180,11 +1180,29 @@ public final class BluetoothAdapter {
* @param proxy Profile proxy object * @param proxy Profile proxy object
*/ */
public void closeProfileProxy(int profile, BluetoothProfile proxy) { public void closeProfileProxy(int profile, BluetoothProfile proxy) {
if (profile == BluetoothProfile.HEADSET) { if (proxy == null) return;
BluetoothHeadset headset = (BluetoothHeadset)proxy;
if (headset != null) { switch (profile) {
case BluetoothProfile.HEADSET:
BluetoothHeadset headset = (BluetoothHeadset)proxy;
headset.close(); headset.close();
} break;
case BluetoothProfile.A2DP:
BluetoothA2dp a2dp = (BluetoothA2dp)proxy;
a2dp.close();
break;
case BluetoothProfile.INPUT_DEVICE:
BluetoothInputDevice iDev = (BluetoothInputDevice)proxy;
iDev.close();
break;
case BluetoothProfile.PAN:
BluetoothPan pan = (BluetoothPan)proxy;
pan.close();
break;
case BluetoothProfile.HEALTH:
BluetoothHealth health = (BluetoothHealth)proxy;
health.close();
break;
} }
} }

View File

@@ -109,6 +109,8 @@ public final class BluetoothDeviceProfileState extends StateMachine {
private BluetoothA2dpService mA2dpService; private BluetoothA2dpService mA2dpService;
private BluetoothHeadset mHeadsetService; private BluetoothHeadset mHeadsetService;
private BluetoothPbap mPbapService; private BluetoothPbap mPbapService;
private PbapServiceListener mPbap;
private BluetoothAdapter mAdapter;
private boolean mPbapServiceConnected; private boolean mPbapServiceConnected;
private boolean mAutoConnectionPending; private boolean mAutoConnectionPending;
private static final String BLUETOOTH_ADMIN_PERM = android.Manifest.permission.BLUETOOTH_ADMIN; private static final String BLUETOOTH_ADMIN_PERM = android.Manifest.permission.BLUETOOTH_ADMIN;
@@ -249,11 +251,11 @@ public final class BluetoothDeviceProfileState extends StateMachine {
mContext.registerReceiver(mBroadcastReceiver, filter); mContext.registerReceiver(mBroadcastReceiver, filter);
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); mAdapter = BluetoothAdapter.getDefaultAdapter();
adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener, mAdapter.getProfileProxy(mContext, mBluetoothProfileServiceListener,
BluetoothProfile.HEADSET); BluetoothProfile.HEADSET);
// TODO(): Convert PBAP to the new Profile APIs. // TODO(): Convert PBAP to the new Profile APIs.
PbapServiceListener p = new PbapServiceListener(); mPbap = new PbapServiceListener();
mIncomingConnections = mService.getIncomingState(address); mIncomingConnections = mService.getIncomingState(address);
mIncomingRejectTimer = readTimerValue(); mIncomingRejectTimer = readTimerValue();
@@ -414,6 +416,26 @@ public final class BluetoothDeviceProfileState extends StateMachine {
case TRANSITION_TO_STABLE: case TRANSITION_TO_STABLE:
// ignore. // ignore.
break; break;
case SM_QUIT_CMD:
mContext.unregisterReceiver(mBroadcastReceiver);
mBroadcastReceiver = null;
mAdapter.closeProfileProxy(BluetoothProfile.HEADSET, mHeadsetService);
mBluetoothProfileServiceListener = null;
mOutgoingHandsfree = null;
mPbap = null;
mPbapService.close();
mPbapService = null;
mIncomingHid = null;
mOutgoingHid = null;
mIncomingHandsfree = null;
mOutgoingHandsfree = null;
mIncomingA2dp = null;
mOutgoingA2dp = null;
mBondedDevice = null;
// There is a problem in the State Machine code
// where things are not cleaned up properly, when quit message
// is handled so return NOT_HANDLED as a workaround.
return NOT_HANDLED;
default: default:
return NOT_HANDLED; return NOT_HANDLED;
} }

View File

@@ -245,6 +245,7 @@ public final class BluetoothHeadset implements BluetoothProfile {
mContext.unbindService(mConnection); mContext.unbindService(mConnection);
mConnection = null; mConnection = null;
} }
mServiceListener = null;
} }
/** /**

View File

@@ -452,6 +452,10 @@ public final class BluetoothHealth implements BluetoothProfile {
} }
} }
/*package*/ void close() {
mServiceListener = null;
}
private boolean isEnabled() { private boolean isEnabled() {
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();

View File

@@ -118,6 +118,10 @@ public final class BluetoothInputDevice implements BluetoothProfile {
} }
} }
/*package*/ void close() {
mServiceListener = null;
}
/** /**
* Initiate connection to a profile of the remote bluetooth device. * Initiate connection to a profile of the remote bluetooth device.
* *

View File

@@ -139,6 +139,10 @@ public final class BluetoothPan implements BluetoothProfile {
} }
} }
/*package*/ void close() {
mServiceListener = null;
}
/** /**
* Initiate connection to a profile of the remote bluetooth device. * Initiate connection to a profile of the remote bluetooth device.
* *

View File

@@ -69,7 +69,7 @@ public class BluetoothPbap {
private IBluetoothPbap mService; private IBluetoothPbap mService;
private final Context mContext; private final Context mContext;
private final ServiceListener mServiceListener; private ServiceListener mServiceListener;
/** There was an error trying to obtain the state */ /** There was an error trying to obtain the state */
public static final int STATE_ERROR = -1; public static final int STATE_ERROR = -1;
@@ -138,6 +138,7 @@ public class BluetoothPbap {
mContext.unbindService(mConnection); mContext.unbindService(mConnection);
mConnection = null; mConnection = null;
} }
mServiceListener = null;
} }
/** /**

View File

@@ -2374,16 +2374,18 @@ public class BluetoothService extends IBluetooth.Stub {
} }
BluetoothDeviceProfileState addProfileState(String address, boolean setTrust) { BluetoothDeviceProfileState addProfileState(String address, boolean setTrust) {
BluetoothDeviceProfileState state = mDeviceProfileState.get(address); BluetoothDeviceProfileState state =
if (state != null) return state; new BluetoothDeviceProfileState(mContext, address, this, mA2dpService, setTrust);
state = new BluetoothDeviceProfileState(mContext, address, this, mA2dpService, setTrust);
mDeviceProfileState.put(address, state); mDeviceProfileState.put(address, state);
state.start(); state.start();
return state; return state;
} }
void removeProfileState(String address) { void removeProfileState(String address) {
BluetoothDeviceProfileState state = mDeviceProfileState.get(address);
if (state == null) return;
state.quit();
mDeviceProfileState.remove(address); mDeviceProfileState.remove(address);
} }