diff options
| -rw-r--r-- | core/java/android/server/BluetoothA2dpService.java | 20 | ||||
| -rw-r--r-- | core/java/android/server/BluetoothDeviceService.java | 12 | ||||
| -rw-r--r-- | core/java/android/server/BluetoothEventLoop.java | 51 |
3 files changed, 59 insertions, 24 deletions
diff --git a/core/java/android/server/BluetoothA2dpService.java b/core/java/android/server/BluetoothA2dpService.java index fb6ae28..96ce9d6 100644 --- a/core/java/android/server/BluetoothA2dpService.java +++ b/core/java/android/server/BluetoothA2dpService.java @@ -375,6 +375,10 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub { } private synchronized void onSinkPropertyChanged(String path, String []propValues) { + if (!mBluetoothService.isEnabled()) { + return; + } + String name = propValues[0]; String address = mBluetoothService.getAddressFromObjectPath(path); if (address == null) { @@ -382,15 +386,16 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub { return; } - if (mAudioDevices.get(address) == null) { - // Ignore this state change, since it means we have got it after - // bluetooth has been disabled. - return; - } if (name.equals(PROPERTY_STATE)) { int state = convertBluezSinkStringtoState(propValues[1]); - int prevState = mAudioDevices.get(address); - handleSinkStateChange(address, prevState, state); + if (mAudioDevices.get(address) == null) { + // This is for an incoming connection for a device not known to us. + // We have authorized it and bluez state has changed. + addAudioSink(address); + } else { + int prevState = mAudioDevices.get(address); + handleSinkStateChange(address, prevState, state); + } } } @@ -437,7 +442,6 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub { return sinks; } - @Override protected synchronized void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (mAudioDevices.isEmpty()) return; diff --git a/core/java/android/server/BluetoothDeviceService.java b/core/java/android/server/BluetoothDeviceService.java index afe4757..d2b4447 100644 --- a/core/java/android/server/BluetoothDeviceService.java +++ b/core/java/android/server/BluetoothDeviceService.java @@ -804,6 +804,15 @@ public class BluetoothDeviceService extends IBluetoothDevice.Stub { return mBondState.getBondState(address.toUpperCase()); } + /*package*/ boolean isRemoteDeviceInCache(String address) { + return (mRemoteDeviceProperties.get(address) != null); + } + + /*package*/ String[] getRemoteDeviceProperties(String address) { + String objectPath = getObjectPathFromAddress(address); + return (String [])getDevicePropertiesNative(objectPath); + } + /*package*/ synchronized String getRemoteDeviceProperty(String address, String property) { Map<String, String> properties = mRemoteDeviceProperties.get(address); if (properties != null) { @@ -812,8 +821,7 @@ public class BluetoothDeviceService extends IBluetoothDevice.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 objectPath = getObjectPathFromAddress(address); - String propValues[] = (String [])getDevicePropertiesNative(objectPath); + String[] propValues = getRemoteDeviceProperties(address); if (propValues != null) { addRemoteDeviceProperties(address, propValues); return getRemoteDeviceProperty(address, property); diff --git a/core/java/android/server/BluetoothEventLoop.java b/core/java/android/server/BluetoothEventLoop.java index d982777..1704733 100644 --- a/core/java/android/server/BluetoothEventLoop.java +++ b/core/java/android/server/BluetoothEventLoop.java @@ -122,33 +122,41 @@ class BluetoothEventLoop { return isEventLoopRunningNative(); } - private void onDeviceFound(String address, String[] properties) { - if (properties == null) { - Log.e(TAG, "ERROR: Remote device properties are null"); - return; - } + private void addDevice(String address, String[] properties) { mBluetoothService.addRemoteDeviceProperties(address, properties); String rssi = mBluetoothService.getRemoteDeviceProperty(address, "RSSI"); String classValue = mBluetoothService.getRemoteDeviceProperty(address, "Class"); String name = mBluetoothService.getRemoteDeviceProperty(address, "Name"); - - if (rssi != null && classValue != null) { + short rssiValue; + // For incoming connections, we don't get the RSSI value. Use a default of MIN_VALUE. + // If we accept the pairing, we will automatically show it at the top of the list. + if (rssi != null) { + rssiValue = (short)Integer.valueOf(rssi).intValue(); + } else { + rssiValue = Short.MIN_VALUE; + } + if (classValue != null) { Intent intent = new Intent(BluetoothIntent.REMOTE_DEVICE_FOUND_ACTION); intent.putExtra(BluetoothIntent.ADDRESS, address); intent.putExtra(BluetoothIntent.CLASS, Integer.valueOf(classValue)); - intent.putExtra(BluetoothIntent.RSSI, (short)Integer.valueOf(rssi).intValue()); + intent.putExtra(BluetoothIntent.RSSI, rssiValue); intent.putExtra(BluetoothIntent.NAME, name); mContext.sendBroadcast(intent, BLUETOOTH_PERM); } else { - log ("RSSI: " + rssi + " or ClassValue: " + classValue + - " for remote device: " + address + " is null"); + log ("ClassValue: " + classValue + " for remote device: " + address + " is null"); } } - private void onDeviceDisappeared(String address) { - mBluetoothService.removeRemoteDeviceProperties(address); + private void onDeviceFound(String address, String[] properties) { + if (properties == null) { + Log.e(TAG, "ERROR: Remote device properties are null"); + return; + } + addDevice(address, properties); + } + private void onDeviceDisappeared(String address) { Intent intent = new Intent(BluetoothIntent.REMOTE_DEVICE_DISAPPEARED_ACTION); intent.putExtra(BluetoothIntent.ADDRESS, address); mContext.sendBroadcast(intent, BLUETOOTH_PERM); @@ -208,7 +216,14 @@ class BluetoothEventLoop { } private void onDeviceCreated(String deviceObjectPath) { - // do nothing. + String address = mBluetoothService.getAddressFromObjectPath(deviceObjectPath); + if (!mBluetoothService.isRemoteDeviceInCache(address)) { + // Incoming connection, we haven't seen this device, add to cache. + String[] properties = mBluetoothService.getRemoteDeviceProperties(address); + if (properties != null) { + addDevice(address, properties); + } + } return; } @@ -316,6 +331,13 @@ class BluetoothEventLoop { } } mBluetoothService.setRemoteDeviceProperty(address, name, uuid); + } else if (name.equals("Paired")) { + if (propValues[1].equals("true")) { + mBluetoothService.getBondState().setBondState(address, BluetoothDevice.BOND_BONDED); + } else { + mBluetoothService.getBondState().setBondState(address, + BluetoothDevice.BOND_NOT_BONDED); + } } } @@ -403,7 +425,8 @@ class BluetoothEventLoop { boolean authorized = false; UUID uuid = UUID.fromString(deviceUuid); if (mBluetoothService.isEnabled() && - (BluetoothUuid.isAudioSink(uuid) || BluetoothUuid.isAvrcpController(uuid))) { + (BluetoothUuid.isAudioSink(uuid) || BluetoothUuid.isAvrcpController(uuid) + || BluetoothUuid.isAdvAudioDist(uuid))) { BluetoothA2dp a2dp = new BluetoothA2dp(mContext); authorized = a2dp.getSinkPriority(address) > BluetoothA2dp.PRIORITY_OFF; if (authorized) { |
