diff options
author | Android (Google) Code Review <android-gerrit@google.com> | 2009-09-21 19:00:40 -0400 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2009-09-21 19:00:40 -0400 |
commit | a7719af31290bea50d822b535b6a886ba7a88097 (patch) | |
tree | 8fc35bf72e0a392cd3601a9f66b55bc67e21879d | |
parent | 5222a9571ea2538c989608d376ac71eabe0f09d4 (diff) | |
parent | 10eac971b3a6e5f34a420dd68ebfa796553ad2b9 (diff) | |
download | frameworks_base-a7719af31290bea50d822b535b6a886ba7a88097.zip frameworks_base-a7719af31290bea50d822b535b6a886ba7a88097.tar.gz frameworks_base-a7719af31290bea50d822b535b6a886ba7a88097.tar.bz2 |
Merge change 26217 into eclair
* changes:
Cache the remote device's service channel.
-rw-r--r-- | core/java/android/bluetooth/BluetoothUuid.java | 6 | ||||
-rw-r--r-- | core/java/android/server/BluetoothEventLoop.java | 7 | ||||
-rw-r--r-- | core/java/android/server/BluetoothService.java | 57 |
3 files changed, 62 insertions, 8 deletions
diff --git a/core/java/android/bluetooth/BluetoothUuid.java b/core/java/android/bluetooth/BluetoothUuid.java index 0596b21..24ad06a 100644 --- a/core/java/android/bluetooth/BluetoothUuid.java +++ b/core/java/android/bluetooth/BluetoothUuid.java @@ -83,6 +83,12 @@ public final class BluetoothUuid { * @param uuid */ public static boolean isUuidPresent(ParcelUuid[] uuidArray, ParcelUuid uuid) { + if ((uuidArray == null || uuidArray.length == 0) && uuid == null) + return true; + + if (uuidArray == null) + return false; + for (ParcelUuid element: uuidArray) { if (element.equals(uuid)) return true; } diff --git a/core/java/android/server/BluetoothEventLoop.java b/core/java/android/server/BluetoothEventLoop.java index 34921f4..f9ab31c 100644 --- a/core/java/android/server/BluetoothEventLoop.java +++ b/core/java/android/server/BluetoothEventLoop.java @@ -369,6 +369,10 @@ class BluetoothEventLoop { uuid = str.toString(); } mBluetoothService.setRemoteDeviceProperty(address, name, uuid); + + // UUIDs have changed, query remote service channel and update cache. + mBluetoothService.updateDeviceServiceChannelCache(address); + mBluetoothService.sendUuidIntent(address); } else if (name.equals("Paired")) { if (propValues[1].equals("true")) { @@ -537,8 +541,7 @@ class BluetoothEventLoop { String address = mBluetoothService.getAddressFromObjectPath(deviceObjectPath); // We don't parse the xml here, instead just query Bluez for the properties. if (result) { - String[] properties = mBluetoothService.getRemoteDeviceProperties(address); - mBluetoothService.addRemoteDeviceProperties(address, properties); + mBluetoothService.updateRemoteDevicePropertiesCache(address); } mBluetoothService.sendUuidIntent(address); } diff --git a/core/java/android/server/BluetoothService.java b/core/java/android/server/BluetoothService.java index 26007c5..253b1ab 100644 --- a/core/java/android/server/BluetoothService.java +++ b/core/java/android/server/BluetoothService.java @@ -28,6 +28,7 @@ import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadset; +import android.bluetooth.BluetoothUuid; import android.bluetooth.IBluetooth; import android.bluetooth.ParcelUuid; import android.content.BroadcastReceiver; @@ -85,6 +86,7 @@ public class BluetoothService extends IBluetooth.Stub { private final Map<String, String> mAdapterProperties; private final HashMap <String, Map<String, String>> mDeviceProperties; + private final HashMap <String, Map<ParcelUuid, Integer>> mDeviceServiceChannelCache; private final ArrayList <String> mUuidIntentTracker; static { @@ -111,6 +113,8 @@ public class BluetoothService extends IBluetooth.Stub { mIsDiscovering = false; mAdapterProperties = new HashMap<String, String>(); mDeviceProperties = new HashMap<String, Map<String,String>>(); + + mDeviceServiceChannelCache = new HashMap<String, Map<ParcelUuid, Integer>>(); mUuidIntentTracker = new ArrayList<String>(); registerForAirplaneMode(); } @@ -880,16 +884,22 @@ public class BluetoothService extends IBluetooth.Stub { // Query for remote device properties, again. // We will need to reload the cache when we switch Bluetooth on / off // or if we crash. - String[] propValues = getRemoteDeviceProperties(address); - if (propValues != null) { - addRemoteDeviceProperties(address, propValues); + if (updateRemoteDevicePropertiesCache(address)) return getRemoteDeviceProperty(address, property); - } } Log.e(TAG, "getRemoteDeviceProperty: " + property + "not present:" + address); return null; } + /* package */ synchronized boolean updateRemoteDevicePropertiesCache(String address) { + String[] propValues = getRemoteDeviceProperties(address); + if (propValues != null) { + addRemoteDeviceProperties(address, propValues); + return true; + } + return false; + } + /* package */ synchronized void addRemoteDeviceProperties(String address, String[] properties) { /* * We get a DeviceFound signal every time RSSI changes or name changes. @@ -924,6 +934,10 @@ public class BluetoothService extends IBluetooth.Stub { propertyValues.put(name, newValue); } mDeviceProperties.put(address, propertyValues); + + // We have added a new remote device or updated its properties. + // Also update the serviceChannel cache. + updateDeviceServiceChannelCache(address); } /* package */ void removeRemoteDeviceProperties(String address) { @@ -1066,14 +1080,23 @@ public class BluetoothService extends IBluetooth.Stub { * @param uuid ParcelUuid of the service attribute * * @return rfcomm channel associated with the service attribute + * -1 on error */ public int getRemoteServiceChannel(String address, ParcelUuid uuid) { mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); if (!BluetoothAdapter.checkBluetoothAddress(address)) { return BluetoothDevice.ERROR; } - return getDeviceServiceChannelNative(getObjectPathFromAddress(address), uuid.toString(), - 0x0004); + // Check if we are recovering from a crash. + if (mDeviceProperties.isEmpty()) { + if (!updateRemoteDevicePropertiesCache(address)) + return -1; + } + + Map<ParcelUuid, Integer> value = mDeviceServiceChannelCache.get(address); + if (value != null && value.containsKey(uuid)) + return value.get(uuid); + return -1; } public synchronized boolean setPin(String address, byte[] pin) { @@ -1152,6 +1175,27 @@ public class BluetoothService extends IBluetooth.Stub { return cancelPairingUserInputNative(address, data.intValue()); } + public void updateDeviceServiceChannelCache(String address) { + ParcelUuid[] deviceUuids = getRemoteUuids(address); + // We are storing the rfcomm channel numbers only for the uuids + // we are interested in. + int channel; + ParcelUuid[] interestedUuids = {BluetoothUuid.Handsfree, + BluetoothUuid.HSP, + BluetoothUuid.ObexObjectPush}; + + Map <ParcelUuid, Integer> value = new HashMap<ParcelUuid, Integer>(); + for (ParcelUuid uuid: interestedUuids) { + if (BluetoothUuid.isUuidPresent(deviceUuids, uuid)) { + channel = + getDeviceServiceChannelNative(getObjectPathFromAddress(address), uuid.toString(), + 0x0004); + value.put(uuid, channel); + } + } + mDeviceServiceChannelCache.put(address, value); + } + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -1366,4 +1410,5 @@ public class BluetoothService extends IBluetooth.Stub { private native boolean setDevicePropertyBooleanNative(String objectPath, String key, int value); private native boolean createDeviceNative(String address); private native boolean discoverServicesNative(String objectPath, String pattern); + } |