BT settings wait for HS service before connect. DO NOT MERGE

Bluetooth connections from Settings app can sometimes fail if the
connection to BluetoothHeadsetService isn't ready. Changed code to
delay any headset connect or disconnect attempt when the service isn't
connected until onServiceConnected() is called.

Tested by adding a call to Thread.sleep(5000) before the return
statement in BluetoothHeadsetService.onBind(). This makes it easier to
kill the phone process and then attempt to connect in the settings app
before the service restarts.

Bug: 3048839
Change-Id: I2114ff8ad67c8c672fcf6ce0bf3de61fca7a49b3
This commit is contained in:
Jake Hamby
2010-10-12 16:12:06 -07:00
parent 792d43560b
commit 8021537ffe

View File

@@ -309,6 +309,8 @@ public abstract class LocalBluetoothProfileManager {
private BluetoothHeadset mService;
private Handler mUiHandler = new Handler();
private boolean profileReady = false;
private BluetoothDevice mDelayedConnectDevice = null;
private BluetoothDevice mDelayedDisconnectDevice = null;
public HeadsetProfileManager(LocalBluetoothManager localManager) {
super(localManager);
@@ -318,19 +320,43 @@ public abstract class LocalBluetoothProfileManager {
public void onServiceConnected() {
profileReady = true;
// This could be called on a non-UI thread, funnel to UI thread.
mUiHandler.post(new Runnable() {
// Delay for a few seconds to allow other proxies to connect.
mUiHandler.postDelayed(new Runnable() {
public void run() {
/*
* We just bound to the service, so refresh the UI of the
* headset device.
*/
BluetoothDevice device = mService.getCurrentHeadset();
if (device == null) return;
mLocalManager.getCachedDeviceManager()
if (mDelayedConnectDevice != null) {
Log.i(TAG, "service ready: connecting...");
BluetoothDevice newDevice = mDelayedConnectDevice;
mDelayedConnectDevice = null;
if (!newDevice.equals(device)) {
if (device != null) {
Log.i(TAG, "disconnecting old headset");
mService.disconnectHeadset(device);
}
Log.i(TAG, "connecting to pending headset");
mService.connectHeadset(newDevice);
}
} else if (mDelayedDisconnectDevice != null) {
Log.i(TAG, "service ready: disconnecting...");
if (mDelayedDisconnectDevice.equals(device)) {
Log.i(TAG, "disconnecting headset");
mService.disconnectHeadset(device);
}
mDelayedDisconnectDevice = null;
} else {
/*
* We just bound to the service, so refresh the UI of the
* headset device.
*/
if (device == null) return;
mLocalManager.getCachedDeviceManager()
.onProfileStateChanged(device, Profile.HEADSET,
BluetoothHeadset.STATE_CONNECTED);
}
}
});
}, 2000); // wait 2 seconds for other proxies to connect
if (mServiceListeners.size() > 0) {
Iterator<ServiceListener> it = mServiceListeners.iterator();
@@ -368,6 +394,16 @@ public abstract class LocalBluetoothProfileManager {
@Override
public boolean connect(BluetoothDevice device) {
// Delay connection until onServiceConnected() if the
// manager isn't ready
if (!isManagerReady()) {
Log.w(TAG, "HeadsetProfileManager delaying connect, "
+ "manager not ready");
mDelayedConnectDevice = device;
mDelayedDisconnectDevice = null;
return true; // hopefully it will succeed
}
// Since connectHeadset fails if already connected to a headset, we
// disconnect from any headset first
BluetoothDevice currDevice = mService.getCurrentHeadset();
@@ -379,6 +415,16 @@ public abstract class LocalBluetoothProfileManager {
@Override
public boolean disconnect(BluetoothDevice device) {
// Delay connection until onServiceConnected() if the
// manager isn't ready
if (!isManagerReady()) {
Log.w(TAG, "HeadsetProfileManager delaying disconnect, "
+ "manager not ready");
mDelayedConnectDevice = null;
mDelayedDisconnectDevice = device;
return true; // hopefully it will succeed
}
BluetoothDevice currDevice = mService.getCurrentHeadset();
if (currDevice != null && currDevice.equals(device)) {
// Downgrade prority as user is disconnecting the headset.