diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java index ef056654d7efc..68442ea407016 100644 --- a/core/java/android/bluetooth/BluetoothGatt.java +++ b/core/java/android/bluetooth/BluetoothGatt.java @@ -246,11 +246,12 @@ public final class BluetoothGatt implements BluetoothProfile { * Updates the internal value. * @hide */ - public void onCharacteristicRead(String address, int status, int srvcType, - int srvcInstId, ParcelUuid srvcUuid, - int charInstId, ParcelUuid charUuid, byte[] value) { + public void onCharacteristicRead(String address, int status, int handle, byte[] value) { if (VDBG) Log.d(TAG, "onCharacteristicRead() - Device=" + address - + " UUID=" + charUuid + " Status=" + status); + + " handle=" + handle + " Status=" + status); + + Log.w(TAG, "onCharacteristicRead() - Device=" + address + + " handle=" + handle + " Status=" + status); if (!address.equals(mDevice.getAddress())) { return; @@ -265,9 +266,7 @@ public final class BluetoothGatt implements BluetoothProfile { && mAuthRetry == false) { try { mAuthRetry = true; - mService.readCharacteristic(mClientIf, address, - srvcType, srvcInstId, srvcUuid, - charInstId, charUuid, AUTHENTICATION_MITM); + mService.readCharacteristic(mClientIf, address, handle, AUTHENTICATION_MITM); return; } catch (RemoteException e) { Log.e(TAG,"",e); @@ -276,13 +275,11 @@ public final class BluetoothGatt implements BluetoothProfile { mAuthRetry = false; - BluetoothGattService service = getService(mDevice, srvcUuid.getUuid(), - srvcInstId, srvcType); - if (service == null) return; - - BluetoothGattCharacteristic characteristic = service.getCharacteristic( - charUuid.getUuid(), charInstId); - if (characteristic == null) return; + BluetoothGattCharacteristic characteristic = getCharacteristicById(mDevice, handle); + if (characteristic == null) { + Log.w(TAG, "onCharacteristicRead() failed to find characteristic!"); + return; + } if (status == 0) characteristic.setValue(value); @@ -298,11 +295,9 @@ public final class BluetoothGatt implements BluetoothProfile { * Let the app know how we did... * @hide */ - public void onCharacteristicWrite(String address, int status, int srvcType, - int srvcInstId, ParcelUuid srvcUuid, - int charInstId, ParcelUuid charUuid) { + public void onCharacteristicWrite(String address, int status, int handle) { if (VDBG) Log.d(TAG, "onCharacteristicWrite() - Device=" + address - + " UUID=" + charUuid + " Status=" + status); + + " handle=" + handle + " Status=" + status); if (!address.equals(mDevice.getAddress())) { return; @@ -312,12 +307,7 @@ public final class BluetoothGatt implements BluetoothProfile { mDeviceBusy = false; } - BluetoothGattService service = getService(mDevice, srvcUuid.getUuid(), - srvcInstId, srvcType); - if (service == null) return; - - BluetoothGattCharacteristic characteristic = service.getCharacteristic( - charUuid.getUuid(), charInstId); + BluetoothGattCharacteristic characteristic = getCharacteristicById(mDevice, handle); if (characteristic == null) return; if ((status == GATT_INSUFFICIENT_AUTHENTICATION @@ -325,8 +315,7 @@ public final class BluetoothGatt implements BluetoothProfile { && mAuthRetry == false) { try { mAuthRetry = true; - mService.writeCharacteristic(mClientIf, address, - srvcType, srvcInstId, srvcUuid, charInstId, charUuid, + mService.writeCharacteristic(mClientIf, address, handle, characteristic.getWriteType(), AUTHENTICATION_MITM, characteristic.getValue()); return; @@ -349,21 +338,14 @@ public final class BluetoothGatt implements BluetoothProfile { * Updates the internal value. * @hide */ - public void onNotify(String address, int srvcType, - int srvcInstId, ParcelUuid srvcUuid, - int charInstId, ParcelUuid charUuid, - byte[] value) { - if (VDBG) Log.d(TAG, "onNotify() - Device=" + address + " UUID=" + charUuid); + public void onNotify(String address, int handle, byte[] value) { + if (VDBG) Log.d(TAG, "onNotify() - Device=" + address + " handle=" + handle); if (!address.equals(mDevice.getAddress())) { return; } - BluetoothGattService service = getService(mDevice, srvcUuid.getUuid(), - srvcInstId, srvcType); - if (service == null) return; - BluetoothGattCharacteristic characteristic = service.getCharacteristic( - charUuid.getUuid(), charInstId); + BluetoothGattCharacteristic characteristic = getCharacteristicById(mDevice, handle); if (characteristic == null) return; characteristic.setValue(value); @@ -379,12 +361,8 @@ public final class BluetoothGatt implements BluetoothProfile { * Descriptor has been read. * @hide */ - public void onDescriptorRead(String address, int status, int srvcType, - int srvcInstId, ParcelUuid srvcUuid, - int charInstId, ParcelUuid charUuid, - int descrInstId, ParcelUuid descrUuid, - byte[] value) { - if (VDBG) Log.d(TAG, "onDescriptorRead() - Device=" + address + " UUID=" + charUuid); + public void onDescriptorRead(String address, int status, int handle, byte[] value) { + if (VDBG) Log.d(TAG, "onDescriptorRead() - Device=" + address + " handle=" + handle); if (!address.equals(mDevice.getAddress())) { return; @@ -394,16 +372,7 @@ public final class BluetoothGatt implements BluetoothProfile { mDeviceBusy = false; } - BluetoothGattService service = getService(mDevice, srvcUuid.getUuid(), - srvcInstId, srvcType); - if (service == null) return; - - BluetoothGattCharacteristic characteristic = service.getCharacteristic( - charUuid.getUuid(), charInstId); - if (characteristic == null) return; - - BluetoothGattDescriptor descriptor = characteristic.getDescriptor( - descrUuid.getUuid(), descrInstId); + BluetoothGattDescriptor descriptor = getDescriptorById(mDevice, handle); if (descriptor == null) return; if (status == 0) descriptor.setValue(value); @@ -413,9 +382,7 @@ public final class BluetoothGatt implements BluetoothProfile { && mAuthRetry == false) { try { mAuthRetry = true; - mService.readDescriptor(mClientIf, address, - srvcType, srvcInstId, srvcUuid, charInstId, charUuid, - descrInstId, descrUuid, AUTHENTICATION_MITM); + mService.readDescriptor(mClientIf, address, handle, AUTHENTICATION_MITM); return; } catch (RemoteException e) { Log.e(TAG,"",e); @@ -435,11 +402,8 @@ public final class BluetoothGatt implements BluetoothProfile { * Descriptor write operation complete. * @hide */ - public void onDescriptorWrite(String address, int status, int srvcType, - int srvcInstId, ParcelUuid srvcUuid, - int charInstId, ParcelUuid charUuid, - int descrInstId, ParcelUuid descrUuid) { - if (VDBG) Log.d(TAG, "onDescriptorWrite() - Device=" + address + " UUID=" + charUuid); + public void onDescriptorWrite(String address, int status, int handle) { + if (VDBG) Log.d(TAG, "onDescriptorWrite() - Device=" + address + " handle=" + handle); if (!address.equals(mDevice.getAddress())) { return; @@ -449,16 +413,7 @@ public final class BluetoothGatt implements BluetoothProfile { mDeviceBusy = false; } - BluetoothGattService service = getService(mDevice, srvcUuid.getUuid(), - srvcInstId, srvcType); - if (service == null) return; - - BluetoothGattCharacteristic characteristic = service.getCharacteristic( - charUuid.getUuid(), charInstId); - if (characteristic == null) return; - - BluetoothGattDescriptor descriptor = characteristic.getDescriptor( - descrUuid.getUuid(), descrInstId); + BluetoothGattDescriptor descriptor = getDescriptorById(mDevice, handle); if (descriptor == null) return; if ((status == GATT_INSUFFICIENT_AUTHENTICATION @@ -466,9 +421,8 @@ public final class BluetoothGatt implements BluetoothProfile { && mAuthRetry == false) { try { mAuthRetry = true; - mService.writeDescriptor(mClientIf, address, - srvcType, srvcInstId, srvcUuid, charInstId, charUuid, - descrInstId, descrUuid, characteristic.getWriteType(), + mService.writeDescriptor(mClientIf, address, handle, + descriptor.getCharacteristic().getWriteType(), AUTHENTICATION_MITM, descriptor.getValue()); return; } catch (RemoteException e) { @@ -584,6 +538,37 @@ public final class BluetoothGatt implements BluetoothProfile { } + /** + * Returns a characteristic with id equal to instanceId. + * @hide + */ + /*package*/ BluetoothGattCharacteristic getCharacteristicById(BluetoothDevice device, int instanceId) { + for(BluetoothGattService svc : mServices) { + for(BluetoothGattCharacteristic charac : svc.getCharacteristics()) { + Log.w(TAG, "getCharacteristicById() comparing " + charac.getInstanceId() + " and " + instanceId); + if (charac.getInstanceId() == instanceId) + return charac; + } + } + return null; + } + + /** + * Returns a descriptor with id equal to instanceId. + * @hide + */ + /*package*/ BluetoothGattDescriptor getDescriptorById(BluetoothDevice device, int instanceId) { + for(BluetoothGattService svc : mServices) { + for(BluetoothGattCharacteristic charac : svc.getCharacteristics()) { + for(BluetoothGattDescriptor desc : charac.getDescriptors()) { + if (desc.getInstanceId() == instanceId) + return desc; + } + } + } + return null; + } + /** * Register an application callback to start using GATT. * @@ -832,9 +817,7 @@ public final class BluetoothGatt implements BluetoothProfile { try { mService.readCharacteristic(mClientIf, device.getAddress(), - service.getType(), service.getInstanceId(), - new ParcelUuid(service.getUuid()), characteristic.getInstanceId(), - new ParcelUuid(characteristic.getUuid()), AUTHENTICATION_NONE); + characteristic.getInstanceId(), AUTHENTICATION_NONE); } catch (RemoteException e) { Log.e(TAG,"",e); mDeviceBusy = false; @@ -877,11 +860,8 @@ public final class BluetoothGatt implements BluetoothProfile { try { mService.writeCharacteristic(mClientIf, device.getAddress(), - service.getType(), service.getInstanceId(), - new ParcelUuid(service.getUuid()), characteristic.getInstanceId(), - new ParcelUuid(characteristic.getUuid()), - characteristic.getWriteType(), AUTHENTICATION_NONE, - characteristic.getValue()); + characteristic.getInstanceId(), characteristic.getWriteType(), + AUTHENTICATION_NONE, characteristic.getValue()); } catch (RemoteException e) { Log.e(TAG,"",e); mDeviceBusy = false; @@ -922,11 +902,8 @@ public final class BluetoothGatt implements BluetoothProfile { } try { - mService.readDescriptor(mClientIf, device.getAddress(), service.getType(), - service.getInstanceId(), new ParcelUuid(service.getUuid()), - characteristic.getInstanceId(), new ParcelUuid(characteristic.getUuid()), - descriptor.getInstanceId(), new ParcelUuid(descriptor.getUuid()), - AUTHENTICATION_NONE); + mService.readDescriptor(mClientIf, device.getAddress(), + descriptor.getInstanceId(), AUTHENTICATION_NONE); } catch (RemoteException e) { Log.e(TAG,"",e); mDeviceBusy = false; @@ -966,12 +943,8 @@ public final class BluetoothGatt implements BluetoothProfile { } try { - mService.writeDescriptor(mClientIf, device.getAddress(), service.getType(), - service.getInstanceId(), new ParcelUuid(service.getUuid()), - characteristic.getInstanceId(), new ParcelUuid(characteristic.getUuid()), - descriptor.getInstanceId(), new ParcelUuid(descriptor.getUuid()), - characteristic.getWriteType(), AUTHENTICATION_NONE, - descriptor.getValue()); + mService.writeDescriptor(mClientIf, device.getAddress(), descriptor.getInstanceId(), + characteristic.getWriteType(), AUTHENTICATION_NONE, descriptor.getValue()); } catch (RemoteException e) { Log.e(TAG,"",e); mDeviceBusy = false; @@ -1102,10 +1075,7 @@ public final class BluetoothGatt implements BluetoothProfile { try { mService.registerForNotification(mClientIf, device.getAddress(), - service.getType(), service.getInstanceId(), - new ParcelUuid(service.getUuid()), characteristic.getInstanceId(), - new ParcelUuid(characteristic.getUuid()), - enable); + characteristic.getInstanceId(), enable); } catch (RemoteException e) { Log.e(TAG,"",e); return false; diff --git a/core/java/android/bluetooth/BluetoothGattCallbackWrapper.java b/core/java/android/bluetooth/BluetoothGattCallbackWrapper.java index 64ead54e3d5c5..17e533a5b32fb 100644 --- a/core/java/android/bluetooth/BluetoothGattCallbackWrapper.java +++ b/core/java/android/bluetooth/BluetoothGattCallbackWrapper.java @@ -54,14 +54,12 @@ public class BluetoothGattCallbackWrapper extends IBluetoothGattCallback.Stub { } @Override - public void onCharacteristicRead(String address, int status, int srvcType, int srvcInstId, - ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid, byte[] value) + public void onCharacteristicRead(String address, int status, int handle, byte[] value) throws RemoteException { } @Override - public void onCharacteristicWrite(String address, int status, int srvcType, int srvcInstId, - ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid) throws RemoteException { + public void onCharacteristicWrite(String address, int status, int handle) throws RemoteException { } @Override @@ -69,20 +67,15 @@ public class BluetoothGattCallbackWrapper extends IBluetoothGattCallback.Stub { } @Override - public void onDescriptorRead(String address, int status, int srvcType, int srvcInstId, - ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid, int descrInstId, - ParcelUuid descrUuid, byte[] value) throws RemoteException { + public void onDescriptorRead(String address, int status, int handle, byte[] value) throws RemoteException { } @Override - public void onDescriptorWrite(String address, int status, int srvcType, int srvcInstId, - ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid, int descrInstId, - ParcelUuid descrUuid) throws RemoteException { + public void onDescriptorWrite(String address, int status, int handle) throws RemoteException { } @Override - public void onNotify(String address, int srvcType, int srvcInstId, ParcelUuid srvcUuid, - int charInstId, ParcelUuid charUuid, byte[] value) throws RemoteException { + public void onNotify(String address, int handle, byte[] value) throws RemoteException { } @Override diff --git a/core/java/android/bluetooth/IBluetoothGatt.aidl b/core/java/android/bluetooth/IBluetoothGatt.aidl index 3660be7c8eb51..45b512298e6ef 100644 --- a/core/java/android/bluetooth/IBluetoothGatt.aidl +++ b/core/java/android/bluetooth/IBluetoothGatt.aidl @@ -50,28 +50,13 @@ interface IBluetoothGatt { void clientDisconnect(in int clientIf, in String address); void refreshDevice(in int clientIf, in String address); void discoverServices(in int clientIf, in String address); - void readCharacteristic(in int clientIf, in String address, in int srvcType, - in int srvcInstanceId, in ParcelUuid srvcId, - in int charInstanceId, in ParcelUuid charId, - in int authReq); - void writeCharacteristic(in int clientIf, in String address, in int srvcType, - in int srvcInstanceId, in ParcelUuid srvcId, - in int charInstanceId, in ParcelUuid charId, + void readCharacteristic(in int clientIf, in String address, in int handle, in int authReq); + void writeCharacteristic(in int clientIf, in String address, in int handle, in int writeType, in int authReq, in byte[] value); - void readDescriptor(in int clientIf, in String address, in int srvcType, - in int srvcInstanceId, in ParcelUuid srvcId, - in int charInstanceId, in ParcelUuid charId, - in int descrInstanceId, in ParcelUuid descrUuid, - in int authReq); - void writeDescriptor(in int clientIf, in String address, in int srvcType, - in int srvcInstanceId, in ParcelUuid srvcId, - in int charInstanceId, in ParcelUuid charId, - in int descrInstanceId, in ParcelUuid descrId, + void readDescriptor(in int clientIf, in String address, in int handle, in int authReq); + void writeDescriptor(in int clientIf, in String address, in int handle, in int writeType, in int authReq, in byte[] value); - void registerForNotification(in int clientIf, in String address, in int srvcType, - in int srvcInstanceId, in ParcelUuid srvcId, - in int charInstanceId, in ParcelUuid charId, - in boolean enable); + void registerForNotification(in int clientIf, in String address, in int handle, in boolean enable); void beginReliableWrite(in int clientIf, in String address); void endReliableWrite(in int clientIf, in String address, in boolean execute); void readRemoteRssi(in int clientIf, in String address); diff --git a/core/java/android/bluetooth/IBluetoothGattCallback.aidl b/core/java/android/bluetooth/IBluetoothGattCallback.aidl index f177244561238..7163c370694cd 100644 --- a/core/java/android/bluetooth/IBluetoothGattCallback.aidl +++ b/core/java/android/bluetooth/IBluetoothGattCallback.aidl @@ -31,27 +31,12 @@ oneway interface IBluetoothGattCallback { void onScanResult(in ScanResult scanResult); void onBatchScanResults(in List batchResults); void onSearchComplete(in String address, in List services, in int status); - void onCharacteristicRead(in String address, in int status, in int srvcType, - in int srvcInstId, in ParcelUuid srvcUuid, - in int charInstId, in ParcelUuid charUuid, - in byte[] value); - void onCharacteristicWrite(in String address, in int status, in int srvcType, - in int srvcInstId, in ParcelUuid srvcUuid, - in int charInstId, in ParcelUuid charUuid); + void onCharacteristicRead(in String address, in int status, in int handle, in byte[] value); + void onCharacteristicWrite(in String address, in int status, in int handle); void onExecuteWrite(in String address, in int status); - void onDescriptorRead(in String address, in int status, in int srvcType, - in int srvcInstId, in ParcelUuid srvcUuid, - in int charInstId, in ParcelUuid charUuid, - in int descrInstId, in ParcelUuid descrUuid, - in byte[] value); - void onDescriptorWrite(in String address, in int status, in int srvcType, - in int srvcInstId, in ParcelUuid srvcUuid, - in int charInstId, in ParcelUuid charUuid, - in int descrInstId, in ParcelUuid descrUuid); - void onNotify(in String address, in int srvcType, - in int srvcInstId, in ParcelUuid srvcUuid, - in int charInstId, in ParcelUuid charUuid, - in byte[] value); + void onDescriptorRead(in String address, in int status, in int handle, in byte[] value); + void onDescriptorWrite(in String address, in int status, in int handle); + void onNotify(in String address, in int handle, in byte[] value); void onReadRemoteRssi(in String address, in int rssi, in int status); void onMultiAdvertiseCallback(in int status, boolean isStart, in AdvertiseSettings advertiseSettings);