From 3327f7887328c55ef2d837a8e2a07cea2070c744 Mon Sep 17 00:00:00 2001 From: Michael Chan Date: Thu, 3 Dec 2009 00:25:29 -0800 Subject: [PATCH] b/2293042 Fixed the problem where A2DP connections may fail if there's an existing connection to another device. Change-Id: I1b4963a167b633c0905e2719ab3f651ff8be9f2c --- .../bluetooth/CachedBluetoothDevice.java | 18 +++++++++++ .../LocalBluetoothProfileManager.java | 30 +++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/bluetooth/CachedBluetoothDevice.java b/src/com/android/settings/bluetooth/CachedBluetoothDevice.java index 03328b5fb31..f749cf7cb43 100644 --- a/src/com/android/settings/bluetooth/CachedBluetoothDevice.java +++ b/src/com/android/settings/bluetooth/CachedBluetoothDevice.java @@ -41,6 +41,7 @@ import java.util.Date; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Set; /** * CachedBluetoothDevice represents a remote Bluetooth device. It contains @@ -401,6 +402,7 @@ public class CachedBluetoothDevice implements Comparable .getProfileManager(mLocalManager, profile); if (profileManager.isPreferred(mDevice)) { ++preferredProfiles; + disconnectConnected(profile); queueCommand(new BluetoothJob(BluetoothCommand.CONNECT, this, profile)); } } @@ -423,6 +425,7 @@ public class CachedBluetoothDevice implements Comparable LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager .getProfileManager(mLocalManager, profile); profileManager.setPreferred(mDevice, false); + disconnectConnected(profile); queueCommand(new BluetoothJob(BluetoothCommand.CONNECT, this, profile)); } } @@ -432,9 +435,24 @@ public class CachedBluetoothDevice implements Comparable mConnectAttempted = SystemClock.elapsedRealtime(); // Reset the only-show-one-error-dialog tracking variable mIsConnectingErrorPossible = true; + disconnectConnected(profile); queueCommand(new BluetoothJob(BluetoothCommand.CONNECT, this, profile)); } + private void disconnectConnected(Profile profile) { + LocalBluetoothProfileManager profileManager = + LocalBluetoothProfileManager.getProfileManager(mLocalManager, profile); + CachedBluetoothDeviceManager cachedDeviceManager = mLocalManager.getCachedDeviceManager(); + Set devices = profileManager.getConnectedDevices(); + if (devices == null) return; + for (BluetoothDevice device : devices) { + CachedBluetoothDevice cachedDevice = cachedDeviceManager.findDevice(device); + if (cachedDevice != null) { + queueCommand(new BluetoothJob(BluetoothCommand.DISCONNECT, cachedDevice, profile)); + } + } + } + private boolean connectInt(CachedBluetoothDevice cachedDevice, Profile profile) { if (!cachedDevice.ensurePaired()) return false; diff --git a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java index 44e2be34728..da3c69ff9c1 100644 --- a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java +++ b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java @@ -16,17 +16,18 @@ package com.android.settings.bluetooth; +import com.android.settings.R; + import android.bluetooth.BluetoothA2dp; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadset; import android.bluetooth.BluetoothUuid; -import android.os.ParcelUuid; import android.os.Handler; +import android.os.ParcelUuid; import android.util.Log; -import com.android.settings.R; - import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -121,6 +122,8 @@ public abstract class LocalBluetoothProfileManager { mLocalManager = localManager; } + public abstract Set getConnectedDevices(); + public abstract boolean connect(BluetoothDevice device); public abstract boolean disconnect(BluetoothDevice device); @@ -163,6 +166,11 @@ public abstract class LocalBluetoothProfileManager { mService = new BluetoothA2dp(localManager.getContext()); } + @Override + public Set getConnectedDevices() { + return mService.getConnectedSinks(); + } + @Override public boolean connect(BluetoothDevice device) { Set sinks = mService.getConnectedSinks(); @@ -260,6 +268,17 @@ public abstract class LocalBluetoothProfileManager { public void onServiceDisconnected() { } + @Override + public Set getConnectedDevices() { + Set devices = null; + BluetoothDevice device = mService.getCurrentHeadset(); + if (device != null) { + devices = new HashSet(); + devices.add(device); + } + return devices; + } + @Override public boolean connect(BluetoothDevice device) { // Since connectHeadset fails if already connected to a headset, we @@ -333,6 +352,11 @@ public abstract class LocalBluetoothProfileManager { super(localManager); } + @Override + public Set getConnectedDevices() { + return null; + } + @Override public boolean connect(BluetoothDevice device) { return false;