diff --git a/src/com/android/settings/bluetooth/CachedBluetoothDevice.java b/src/com/android/settings/bluetooth/CachedBluetoothDevice.java index bfd2e9927c3..63c3d27f718 100644 --- a/src/com/android/settings/bluetooth/CachedBluetoothDevice.java +++ b/src/com/android/settings/bluetooth/CachedBluetoothDevice.java @@ -25,6 +25,7 @@ import android.app.AlertDialog; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothUuid; import android.content.Context; import android.content.DialogInterface; import android.content.res.Resources; @@ -584,42 +585,12 @@ public class CachedBluetoothDevice implements Comparable if (DEBUG) { Log.e(TAG, "updating profiles for " + mDevice.getName()); - - boolean printUuids = true; BluetoothClass bluetoothClass = mDevice.getBluetoothClass(); - if (bluetoothClass != null) { - if (bluetoothClass.doesClassMatch(BluetoothClass.PROFILE_HEADSET) != - mProfiles.contains(Profile.HEADSET)) { - Log.v(TAG, "headset classbits != uuid"); - printUuids = true; - } - - if (bluetoothClass.doesClassMatch(BluetoothClass.PROFILE_A2DP) != - mProfiles.contains(Profile.A2DP)) { - Log.v(TAG, "a2dp classbits != uuid"); - printUuids = true; - } - - if (bluetoothClass.doesClassMatch(BluetoothClass.PROFILE_OPP) != - mProfiles.contains(Profile.OPP)) { - Log.v(TAG, "opp classbits != uuid"); - printUuids = true; - } - - if (bluetoothClass.doesClassMatch(BluetoothClass.PROFILE_HID) != - mProfiles.contains(Profile.HID)) { - Log.v(TAG, "hid classbits != uuid"); - printUuids = true; - } - } - - if (printUuids) { - if (bluetoothClass != null) Log.v(TAG, "Class: " + bluetoothClass.toString()); - Log.v(TAG, "UUID:"); - for (int i = 0; i < uuids.length; i++) { - Log.v(TAG, " " + uuids[i]); - } + if (bluetoothClass != null) Log.v(TAG, "Class: " + bluetoothClass.toString()); + Log.v(TAG, "UUID:"); + for (int i = 0; i < uuids.length; i++) { + Log.v(TAG, " " + uuids[i]); } } return true; diff --git a/src/com/android/settings/bluetooth/LocalBluetoothManager.java b/src/com/android/settings/bluetooth/LocalBluetoothManager.java index 07d39311e04..88fa87fc4b3 100644 --- a/src/com/android/settings/bluetooth/LocalBluetoothManager.java +++ b/src/com/android/settings/bluetooth/LocalBluetoothManager.java @@ -26,13 +26,13 @@ import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; import android.content.Context; import android.content.SharedPreferences; +import android.os.ParcelUuid; import android.util.Config; import android.util.Log; import android.widget.Toast; import java.util.ArrayList; import java.util.List; -import java.util.Set; // TODO: have some notion of shutting down. Maybe a minute after they leave BT settings? /** @@ -48,7 +48,6 @@ public class LocalBluetoothManager { /** Singleton instance. */ private static LocalBluetoothManager sInstance; - private boolean mInitialized; private Context mContext; /** If a BT-related activity is in the foreground, this will be it. */ @@ -89,22 +88,17 @@ public class LocalBluetoothManager { synchronized (LocalBluetoothManager.class) { if (sInstance == null) { sInstance = new LocalBluetoothManager(); + if (!sInstance.init(context)) { + return null; + } + LocalBluetoothProfileManager.init(sInstance); } - if (!sInstance.init(context)) { - return null; - } - - LocalBluetoothProfileManager.init(sInstance); - return sInstance; } } private boolean init(Context context) { - if (mInitialized) return true; - mInitialized = true; - // This will be around as long as this process is mContext = context.getApplicationContext(); @@ -226,6 +220,12 @@ public class LocalBluetoothManager { void setBluetoothStateInt(int state) { mState = state; + + if (state == BluetoothAdapter.STATE_ON) { + ParcelUuid[] uuids = mAdapter.getUuids(); + LocalBluetoothProfileManager.updateLocalProfiles(getInstance(mContext), uuids); + } + if (state == BluetoothAdapter.STATE_ON || state == BluetoothAdapter.STATE_OFF) { mCachedDeviceManager.onBluetoothStateChanged(state == diff --git a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java index a01fdecd646..aa3bf38b35b 100644 --- a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java +++ b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java @@ -121,6 +121,30 @@ public abstract class LocalBluetoothProfileManager { } } + // TODO(): Combine the init and updateLocalProfiles codes. + // init can get called from various paths, it makes no sense to add and then delete. + public static void updateLocalProfiles(LocalBluetoothManager localManager, ParcelUuid[] uuids) { + if (!BluetoothUuid.containsAnyUuid(uuids, HEADSET_PROFILE_UUIDS)) { + sProfileMap.remove(Profile.HEADSET); + } + + if (BluetoothUuid.containsAnyUuid(uuids, A2DP_PROFILE_UUIDS)) { + sProfileMap.remove(Profile.A2DP); + } + + if (BluetoothUuid.containsAnyUuid(uuids, OPP_PROFILE_UUIDS)) { + sProfileMap.remove(Profile.OPP); + } + + if (BluetoothUuid.containsAnyUuid(uuids, HID_PROFILE_UUIDS)) { + sProfileMap.remove(Profile.HID); + } + + if (BluetoothUuid.containsAnyUuid(uuids, PANU_PROFILE_UUIDS)) { + sProfileMap.remove(Profile.PAN); + } + } + private static LinkedList mServiceListeners = new LinkedList(); @@ -171,23 +195,28 @@ public abstract class LocalBluetoothProfileManager { return; } - if (BluetoothUuid.containsAnyUuid(uuids, HEADSET_PROFILE_UUIDS)) { + if (BluetoothUuid.containsAnyUuid(uuids, HEADSET_PROFILE_UUIDS) && + sProfileMap.containsKey(Profile.HEADSET)) { profiles.add(Profile.HEADSET); } - if (BluetoothUuid.containsAnyUuid(uuids, A2DP_PROFILE_UUIDS)) { + if (BluetoothUuid.containsAnyUuid(uuids, A2DP_PROFILE_UUIDS) && + sProfileMap.containsKey(Profile.A2DP)) { profiles.add(Profile.A2DP); } - if (BluetoothUuid.containsAnyUuid(uuids, OPP_PROFILE_UUIDS)) { + if (BluetoothUuid.containsAnyUuid(uuids, OPP_PROFILE_UUIDS) && + sProfileMap.containsKey(Profile.OPP)) { profiles.add(Profile.OPP); } - if (BluetoothUuid.containsAnyUuid(uuids, HID_PROFILE_UUIDS)) { + if (BluetoothUuid.containsAnyUuid(uuids, HID_PROFILE_UUIDS) && + sProfileMap.containsKey(Profile.HID)) { profiles.add(Profile.HID); } - if (BluetoothUuid.containsAnyUuid(uuids, PANU_PROFILE_UUIDS)) { + if (BluetoothUuid.containsAnyUuid(uuids, PANU_PROFILE_UUIDS) && + sProfileMap.containsKey(Profile.PAN)) { profiles.add(Profile.PAN); } }