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.
*

View File

@@ -1180,11 +1180,29 @@ public final class BluetoothAdapter {
* @param proxy Profile proxy object
*/
public void closeProfileProxy(int profile, BluetoothProfile proxy) {
if (profile == BluetoothProfile.HEADSET) {
BluetoothHeadset headset = (BluetoothHeadset)proxy;
if (headset != null) {
if (proxy == null) return;
switch (profile) {
case BluetoothProfile.HEADSET:
BluetoothHeadset headset = (BluetoothHeadset)proxy;
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 BluetoothHeadset mHeadsetService;
private BluetoothPbap mPbapService;
private PbapServiceListener mPbap;
private BluetoothAdapter mAdapter;
private boolean mPbapServiceConnected;
private boolean mAutoConnectionPending;
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);
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener,
mAdapter = BluetoothAdapter.getDefaultAdapter();
mAdapter.getProfileProxy(mContext, mBluetoothProfileServiceListener,
BluetoothProfile.HEADSET);
// TODO(): Convert PBAP to the new Profile APIs.
PbapServiceListener p = new PbapServiceListener();
mPbap = new PbapServiceListener();
mIncomingConnections = mService.getIncomingState(address);
mIncomingRejectTimer = readTimerValue();
@@ -414,6 +416,26 @@ public final class BluetoothDeviceProfileState extends StateMachine {
case TRANSITION_TO_STABLE:
// ignore.
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:
return NOT_HANDLED;
}

View File

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

View File

@@ -452,6 +452,10 @@ public final class BluetoothHealth implements BluetoothProfile {
}
}
/*package*/ void close() {
mServiceListener = null;
}
private boolean isEnabled() {
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.
*

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.
*
@@ -299,4 +303,4 @@ public final class BluetoothPan implements BluetoothProfile {
private static void log(String msg) {
Log.d(TAG, msg);
}
}
}

View File

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

View File

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