Don't disconnect the same device before connecting.
We Pair: Remote device sends incoming connection, we get connected. We get BondingState change and we connect. Settings app disconnects connected profiles and then connects without checking whether we are disconnecting the same device itself. How was it working before ? Settings app used to queue all commands. The disconnect followed by the connect would work but unnecessarily disconnect and then connect. With the queuing moved to framework, the connect fails since the disconnect status has not been broadcasted. Settings app shouldn't be disconnecting connected profiles. That logic should reside in the framework. There is an open bug and when the new APIs get implemented this will get removed. Change-Id: I32a7fa36ff3c3321691c55071498f985dcdcfe8e
This commit is contained in:
@@ -86,10 +86,10 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
|
||||
// See mConnectAttempted
|
||||
private static final long MAX_UUID_DELAY_FOR_AUTO_CONNECT = 5000;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Describes the current device and profile for logging.
|
||||
*
|
||||
*
|
||||
* @param profile Profile to describe
|
||||
* @return Description of the device and profile
|
||||
*/
|
||||
@@ -102,7 +102,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
private String describe(Profile profile) {
|
||||
return describe(this, profile);
|
||||
}
|
||||
@@ -242,7 +242,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
|
||||
.getProfileManager(mLocalManager, profile);
|
||||
if (profileManager.isPreferred(mDevice)) {
|
||||
++preferredProfiles;
|
||||
disconnectConnected(profile);
|
||||
disconnectConnected(this, profile);
|
||||
connectInt(this, profile);
|
||||
}
|
||||
}
|
||||
@@ -265,7 +265,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
|
||||
LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
|
||||
.getProfileManager(mLocalManager, profile);
|
||||
profileManager.setPreferred(mDevice, false);
|
||||
disconnectConnected(profile);
|
||||
disconnectConnected(this, profile);
|
||||
connectInt(this, profile);
|
||||
}
|
||||
}
|
||||
@@ -275,19 +275,20 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
|
||||
mConnectAttempted = SystemClock.elapsedRealtime();
|
||||
// Reset the only-show-one-error-dialog tracking variable
|
||||
mIsConnectingErrorPossible = true;
|
||||
disconnectConnected(profile);
|
||||
disconnectConnected(this, profile);
|
||||
connectInt(this, profile);
|
||||
}
|
||||
|
||||
private void disconnectConnected(Profile profile) {
|
||||
private void disconnectConnected(CachedBluetoothDevice device, Profile profile) {
|
||||
LocalBluetoothProfileManager profileManager =
|
||||
LocalBluetoothProfileManager.getProfileManager(mLocalManager, profile);
|
||||
CachedBluetoothDeviceManager cachedDeviceManager = mLocalManager.getCachedDeviceManager();
|
||||
Set<BluetoothDevice> devices = profileManager.getConnectedDevices();
|
||||
if (devices == null) return;
|
||||
for (BluetoothDevice device : devices) {
|
||||
CachedBluetoothDevice cachedDevice = cachedDeviceManager.findDevice(device);
|
||||
if (cachedDevice != null) {
|
||||
for (BluetoothDevice btDevice : devices) {
|
||||
CachedBluetoothDevice cachedDevice = cachedDeviceManager.findDevice(btDevice);
|
||||
|
||||
if (cachedDevice != null && !cachedDevice.equals(device)) {
|
||||
disconnectInt(cachedDevice, profile);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user