From 409cee69b2b09bcd11f1273752c016116436f247 Mon Sep 17 00:00:00 2001 From: Jakub Pawlowski Date: Thu, 2 Feb 2017 08:07:12 -0800 Subject: [PATCH] Bluetooth 5 PHY selection API Bug: 30622771 Test: manual Change-Id: I50262a56a70466439f9700549c3c0e7bd49e2e8d (cherry picked from commit db5a87d50db9d4b3d642603f6c329b83ee5851f6) --- Android.mk | 4 +- api/current.txt | 30 ++- api/system-current.txt | 30 ++- api/test-current.txt | 30 ++- .../android/bluetooth/BluetoothDevice.java | 99 +++++++++- .../java/android/bluetooth/BluetoothGatt.java | 125 +++++++++--- .../bluetooth/BluetoothGattCallback.java | 132 +------------ .../bluetooth/BluetoothGattCallbackExt.java | 182 +++++++++++++++++ .../bluetooth/BluetoothGattServer.java | 96 ++++++++- .../BluetoothGattServerCallback.java | 138 +------------ .../BluetoothGattServerCallbackExt.java | 187 ++++++++++++++++++ .../android/bluetooth/IBluetoothGatt.aidl | 14 +- ...ck.aidl => IBluetoothGattCallbackExt.aidl} | 4 +- ...l => IBluetoothGattServerCallbackExt.aidl} | 6 +- 14 files changed, 775 insertions(+), 302 deletions(-) create mode 100644 core/java/android/bluetooth/BluetoothGattCallbackExt.java create mode 100644 core/java/android/bluetooth/BluetoothGattServerCallbackExt.java rename core/java/android/bluetooth/{IBluetoothGattCallback.aidl => IBluetoothGattCallbackExt.aidl} (89%) rename core/java/android/bluetooth/{IBluetoothGattServerCallback.aidl => IBluetoothGattServerCallbackExt.aidl} (88%) diff --git a/Android.mk b/Android.mk index a49a587586d91..f7e8310fc0fa6 100644 --- a/Android.mk +++ b/Android.mk @@ -128,8 +128,8 @@ LOCAL_SRC_FILES += \ core/java/android/bluetooth/IBluetoothInputHost.aidl \ core/java/android/bluetooth/IBluetoothHidDeviceCallback.aidl \ core/java/android/bluetooth/IBluetoothGatt.aidl \ - core/java/android/bluetooth/IBluetoothGattCallback.aidl \ - core/java/android/bluetooth/IBluetoothGattServerCallback.aidl \ + core/java/android/bluetooth/IBluetoothGattCallbackExt.aidl \ + core/java/android/bluetooth/IBluetoothGattServerCallbackExt.aidl \ core/java/android/bluetooth/le/IAdvertiserCallback.aidl \ core/java/android/bluetooth/le/IPeriodicAdvertisingCallback.aidl \ core/java/android/bluetooth/le/IScannerCallback.aidl \ diff --git a/api/current.txt b/api/current.txt index f6250bfb48075..c8917ae2376e0 100644 --- a/api/current.txt +++ b/api/current.txt @@ -7076,6 +7076,9 @@ package android.bluetooth { public final class BluetoothDevice implements android.os.Parcelable { method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback); method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback, int); + method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallbackExt); + method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallbackExt, int); + method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallbackExt, int, int); method public boolean createBond(); method public android.bluetooth.BluetoothSocket createInsecureRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException; method public android.bluetooth.BluetoothSocket createRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException; @@ -7119,6 +7122,13 @@ package android.bluetooth { field public static final java.lang.String EXTRA_UUID = "android.bluetooth.device.extra.UUID"; field public static final int PAIRING_VARIANT_PASSKEY_CONFIRMATION = 2; // 0x2 field public static final int PAIRING_VARIANT_PIN = 0; // 0x0 + field public static final int PHY_LE_1M = 1; // 0x1 + field public static final int PHY_LE_2M = 2; // 0x2 + field public static final int PHY_LE_ANY = 7; // 0x7 + field public static final int PHY_LE_CODED = 4; // 0x4 + field public static final int PHY_OPTION_NO_PREFERRED = 0; // 0x0 + field public static final int PHY_OPTION_S2 = 1; // 0x1 + field public static final int PHY_OPTION_S8 = 2; // 0x2 field public static final int TRANSPORT_AUTO = 0; // 0x0 field public static final int TRANSPORT_BREDR = 1; // 0x1 field public static final int TRANSPORT_LE = 2; // 0x2 @@ -7141,10 +7151,12 @@ package android.bluetooth { method public java.util.List getServices(); method public boolean readCharacteristic(android.bluetooth.BluetoothGattCharacteristic); method public boolean readDescriptor(android.bluetooth.BluetoothGattDescriptor); + method public void readPhy(); method public boolean readRemoteRssi(); method public boolean requestConnectionPriority(int); method public boolean requestMtu(int); method public boolean setCharacteristicNotification(android.bluetooth.BluetoothGattCharacteristic, boolean); + method public void setPreferredPhy(int, int, int); method public boolean writeCharacteristic(android.bluetooth.BluetoothGattCharacteristic); method public boolean writeDescriptor(android.bluetooth.BluetoothGattDescriptor); field public static final int CONNECTION_PRIORITY_BALANCED = 0; // 0x0 @@ -7162,8 +7174,12 @@ package android.bluetooth { field public static final int GATT_WRITE_NOT_PERMITTED = 3; // 0x3 } - public abstract class BluetoothGattCallback { + public abstract deprecated class BluetoothGattCallback extends android.bluetooth.BluetoothGattCallbackExt { ctor public BluetoothGattCallback(); + } + + public abstract class BluetoothGattCallbackExt { + ctor public BluetoothGattCallbackExt(); method public void onCharacteristicChanged(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic); method public void onCharacteristicRead(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic, int); method public void onCharacteristicWrite(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic, int); @@ -7171,6 +7187,8 @@ package android.bluetooth { method public void onDescriptorRead(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattDescriptor, int); method public void onDescriptorWrite(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattDescriptor, int); method public void onMtuChanged(android.bluetooth.BluetoothGatt, int, int); + method public void onPhyRead(android.bluetooth.BluetoothGatt, int, int, int); + method public void onPhyUpdate(android.bluetooth.BluetoothGatt, int, int, int); method public void onReadRemoteRssi(android.bluetooth.BluetoothGatt, int, int); method public void onReliableWriteCompleted(android.bluetooth.BluetoothGatt, int); method public void onServicesDiscovered(android.bluetooth.BluetoothGatt, int); @@ -7264,12 +7282,18 @@ package android.bluetooth { method public android.bluetooth.BluetoothGattService getService(java.util.UUID); method public java.util.List getServices(); method public boolean notifyCharacteristicChanged(android.bluetooth.BluetoothDevice, android.bluetooth.BluetoothGattCharacteristic, boolean); + method public void readPhy(android.bluetooth.BluetoothDevice); method public boolean removeService(android.bluetooth.BluetoothGattService); method public boolean sendResponse(android.bluetooth.BluetoothDevice, int, int, int, byte[]); + method public void setPreferredPhy(android.bluetooth.BluetoothDevice, int, int, int); } - public abstract class BluetoothGattServerCallback { + public abstract deprecated class BluetoothGattServerCallback extends android.bluetooth.BluetoothGattServerCallbackExt { ctor public BluetoothGattServerCallback(); + } + + public abstract class BluetoothGattServerCallbackExt { + ctor public BluetoothGattServerCallbackExt(); method public void onCharacteristicReadRequest(android.bluetooth.BluetoothDevice, int, int, android.bluetooth.BluetoothGattCharacteristic); method public void onCharacteristicWriteRequest(android.bluetooth.BluetoothDevice, int, android.bluetooth.BluetoothGattCharacteristic, boolean, boolean, int, byte[]); method public void onConnectionStateChange(android.bluetooth.BluetoothDevice, int, int); @@ -7278,6 +7302,8 @@ package android.bluetooth { method public void onExecuteWrite(android.bluetooth.BluetoothDevice, int, boolean); method public void onMtuChanged(android.bluetooth.BluetoothDevice, int); method public void onNotificationSent(android.bluetooth.BluetoothDevice, int); + method public void onPhyRead(android.bluetooth.BluetoothDevice, int, int, int); + method public void onPhyUpdate(android.bluetooth.BluetoothDevice, int, int, int); method public void onServiceAdded(int, android.bluetooth.BluetoothGattService); } diff --git a/api/system-current.txt b/api/system-current.txt index 36b16f387d849..28dfbe8a109d2 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -7378,6 +7378,9 @@ package android.bluetooth { public final class BluetoothDevice implements android.os.Parcelable { method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback); method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback, int); + method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallbackExt); + method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallbackExt, int); + method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallbackExt, int, int); method public boolean createBond(); method public android.bluetooth.BluetoothSocket createInsecureRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException; method public android.bluetooth.BluetoothSocket createRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException; @@ -7423,6 +7426,13 @@ package android.bluetooth { field public static final java.lang.String EXTRA_UUID = "android.bluetooth.device.extra.UUID"; field public static final int PAIRING_VARIANT_PASSKEY_CONFIRMATION = 2; // 0x2 field public static final int PAIRING_VARIANT_PIN = 0; // 0x0 + field public static final int PHY_LE_1M = 1; // 0x1 + field public static final int PHY_LE_2M = 2; // 0x2 + field public static final int PHY_LE_ANY = 7; // 0x7 + field public static final int PHY_LE_CODED = 4; // 0x4 + field public static final int PHY_OPTION_NO_PREFERRED = 0; // 0x0 + field public static final int PHY_OPTION_S2 = 1; // 0x1 + field public static final int PHY_OPTION_S8 = 2; // 0x2 field public static final int TRANSPORT_AUTO = 0; // 0x0 field public static final int TRANSPORT_BREDR = 1; // 0x1 field public static final int TRANSPORT_LE = 2; // 0x2 @@ -7445,10 +7455,12 @@ package android.bluetooth { method public java.util.List getServices(); method public boolean readCharacteristic(android.bluetooth.BluetoothGattCharacteristic); method public boolean readDescriptor(android.bluetooth.BluetoothGattDescriptor); + method public void readPhy(); method public boolean readRemoteRssi(); method public boolean requestConnectionPriority(int); method public boolean requestMtu(int); method public boolean setCharacteristicNotification(android.bluetooth.BluetoothGattCharacteristic, boolean); + method public void setPreferredPhy(int, int, int); method public boolean writeCharacteristic(android.bluetooth.BluetoothGattCharacteristic); method public boolean writeDescriptor(android.bluetooth.BluetoothGattDescriptor); field public static final int CONNECTION_PRIORITY_BALANCED = 0; // 0x0 @@ -7466,8 +7478,12 @@ package android.bluetooth { field public static final int GATT_WRITE_NOT_PERMITTED = 3; // 0x3 } - public abstract class BluetoothGattCallback { + public abstract deprecated class BluetoothGattCallback extends android.bluetooth.BluetoothGattCallbackExt { ctor public BluetoothGattCallback(); + } + + public abstract class BluetoothGattCallbackExt { + ctor public BluetoothGattCallbackExt(); method public void onCharacteristicChanged(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic); method public void onCharacteristicRead(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic, int); method public void onCharacteristicWrite(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic, int); @@ -7475,6 +7491,8 @@ package android.bluetooth { method public void onDescriptorRead(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattDescriptor, int); method public void onDescriptorWrite(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattDescriptor, int); method public void onMtuChanged(android.bluetooth.BluetoothGatt, int, int); + method public void onPhyRead(android.bluetooth.BluetoothGatt, int, int, int); + method public void onPhyUpdate(android.bluetooth.BluetoothGatt, int, int, int); method public void onReadRemoteRssi(android.bluetooth.BluetoothGatt, int, int); method public void onReliableWriteCompleted(android.bluetooth.BluetoothGatt, int); method public void onServicesDiscovered(android.bluetooth.BluetoothGatt, int); @@ -7568,12 +7586,18 @@ package android.bluetooth { method public android.bluetooth.BluetoothGattService getService(java.util.UUID); method public java.util.List getServices(); method public boolean notifyCharacteristicChanged(android.bluetooth.BluetoothDevice, android.bluetooth.BluetoothGattCharacteristic, boolean); + method public void readPhy(android.bluetooth.BluetoothDevice); method public boolean removeService(android.bluetooth.BluetoothGattService); method public boolean sendResponse(android.bluetooth.BluetoothDevice, int, int, int, byte[]); + method public void setPreferredPhy(android.bluetooth.BluetoothDevice, int, int, int); } - public abstract class BluetoothGattServerCallback { + public abstract deprecated class BluetoothGattServerCallback extends android.bluetooth.BluetoothGattServerCallbackExt { ctor public BluetoothGattServerCallback(); + } + + public abstract class BluetoothGattServerCallbackExt { + ctor public BluetoothGattServerCallbackExt(); method public void onCharacteristicReadRequest(android.bluetooth.BluetoothDevice, int, int, android.bluetooth.BluetoothGattCharacteristic); method public void onCharacteristicWriteRequest(android.bluetooth.BluetoothDevice, int, android.bluetooth.BluetoothGattCharacteristic, boolean, boolean, int, byte[]); method public void onConnectionStateChange(android.bluetooth.BluetoothDevice, int, int); @@ -7582,6 +7606,8 @@ package android.bluetooth { method public void onExecuteWrite(android.bluetooth.BluetoothDevice, int, boolean); method public void onMtuChanged(android.bluetooth.BluetoothDevice, int); method public void onNotificationSent(android.bluetooth.BluetoothDevice, int); + method public void onPhyRead(android.bluetooth.BluetoothDevice, int, int, int); + method public void onPhyUpdate(android.bluetooth.BluetoothDevice, int, int, int); method public void onServiceAdded(int, android.bluetooth.BluetoothGattService); } diff --git a/api/test-current.txt b/api/test-current.txt index 95372a49e0c47..cfdbf370de4da 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -7085,6 +7085,9 @@ package android.bluetooth { public final class BluetoothDevice implements android.os.Parcelable { method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback); method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback, int); + method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallbackExt); + method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallbackExt, int); + method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallbackExt, int, int); method public boolean createBond(); method public android.bluetooth.BluetoothSocket createInsecureRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException; method public android.bluetooth.BluetoothSocket createRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException; @@ -7128,6 +7131,13 @@ package android.bluetooth { field public static final java.lang.String EXTRA_UUID = "android.bluetooth.device.extra.UUID"; field public static final int PAIRING_VARIANT_PASSKEY_CONFIRMATION = 2; // 0x2 field public static final int PAIRING_VARIANT_PIN = 0; // 0x0 + field public static final int PHY_LE_1M = 1; // 0x1 + field public static final int PHY_LE_2M = 2; // 0x2 + field public static final int PHY_LE_ANY = 7; // 0x7 + field public static final int PHY_LE_CODED = 4; // 0x4 + field public static final int PHY_OPTION_NO_PREFERRED = 0; // 0x0 + field public static final int PHY_OPTION_S2 = 1; // 0x1 + field public static final int PHY_OPTION_S8 = 2; // 0x2 field public static final int TRANSPORT_AUTO = 0; // 0x0 field public static final int TRANSPORT_BREDR = 1; // 0x1 field public static final int TRANSPORT_LE = 2; // 0x2 @@ -7150,10 +7160,12 @@ package android.bluetooth { method public java.util.List getServices(); method public boolean readCharacteristic(android.bluetooth.BluetoothGattCharacteristic); method public boolean readDescriptor(android.bluetooth.BluetoothGattDescriptor); + method public void readPhy(); method public boolean readRemoteRssi(); method public boolean requestConnectionPriority(int); method public boolean requestMtu(int); method public boolean setCharacteristicNotification(android.bluetooth.BluetoothGattCharacteristic, boolean); + method public void setPreferredPhy(int, int, int); method public boolean writeCharacteristic(android.bluetooth.BluetoothGattCharacteristic); method public boolean writeDescriptor(android.bluetooth.BluetoothGattDescriptor); field public static final int CONNECTION_PRIORITY_BALANCED = 0; // 0x0 @@ -7171,8 +7183,12 @@ package android.bluetooth { field public static final int GATT_WRITE_NOT_PERMITTED = 3; // 0x3 } - public abstract class BluetoothGattCallback { + public abstract deprecated class BluetoothGattCallback extends android.bluetooth.BluetoothGattCallbackExt { ctor public BluetoothGattCallback(); + } + + public abstract class BluetoothGattCallbackExt { + ctor public BluetoothGattCallbackExt(); method public void onCharacteristicChanged(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic); method public void onCharacteristicRead(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic, int); method public void onCharacteristicWrite(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic, int); @@ -7180,6 +7196,8 @@ package android.bluetooth { method public void onDescriptorRead(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattDescriptor, int); method public void onDescriptorWrite(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattDescriptor, int); method public void onMtuChanged(android.bluetooth.BluetoothGatt, int, int); + method public void onPhyRead(android.bluetooth.BluetoothGatt, int, int, int); + method public void onPhyUpdate(android.bluetooth.BluetoothGatt, int, int, int); method public void onReadRemoteRssi(android.bluetooth.BluetoothGatt, int, int); method public void onReliableWriteCompleted(android.bluetooth.BluetoothGatt, int); method public void onServicesDiscovered(android.bluetooth.BluetoothGatt, int); @@ -7273,12 +7291,18 @@ package android.bluetooth { method public android.bluetooth.BluetoothGattService getService(java.util.UUID); method public java.util.List getServices(); method public boolean notifyCharacteristicChanged(android.bluetooth.BluetoothDevice, android.bluetooth.BluetoothGattCharacteristic, boolean); + method public void readPhy(android.bluetooth.BluetoothDevice); method public boolean removeService(android.bluetooth.BluetoothGattService); method public boolean sendResponse(android.bluetooth.BluetoothDevice, int, int, int, byte[]); + method public void setPreferredPhy(android.bluetooth.BluetoothDevice, int, int, int); } - public abstract class BluetoothGattServerCallback { + public abstract deprecated class BluetoothGattServerCallback extends android.bluetooth.BluetoothGattServerCallbackExt { ctor public BluetoothGattServerCallback(); + } + + public abstract class BluetoothGattServerCallbackExt { + ctor public BluetoothGattServerCallbackExt(); method public void onCharacteristicReadRequest(android.bluetooth.BluetoothDevice, int, int, android.bluetooth.BluetoothGattCharacteristic); method public void onCharacteristicWriteRequest(android.bluetooth.BluetoothDevice, int, android.bluetooth.BluetoothGattCharacteristic, boolean, boolean, int, byte[]); method public void onConnectionStateChange(android.bluetooth.BluetoothDevice, int, int); @@ -7287,6 +7311,8 @@ package android.bluetooth { method public void onExecuteWrite(android.bluetooth.BluetoothDevice, int, boolean); method public void onMtuChanged(android.bluetooth.BluetoothDevice, int); method public void onNotificationSent(android.bluetooth.BluetoothDevice, int); + method public void onPhyRead(android.bluetooth.BluetoothDevice, int, int, int); + method public void onPhyUpdate(android.bluetooth.BluetoothDevice, int, int, int); method public void onServiceAdded(int, android.bluetooth.BluetoothGattService); } diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java index 7b1e687f6865b..31fc294e31816 100644 --- a/core/java/android/bluetooth/BluetoothDevice.java +++ b/core/java/android/bluetooth/BluetoothDevice.java @@ -592,6 +592,42 @@ public final class BluetoothDevice implements Parcelable { */ public static final int TRANSPORT_LE = 2; + /** + * 1M initiating PHY. + */ + public static final int PHY_LE_1M = 1; + + /** + * 2M initiating PHY. + */ + public static final int PHY_LE_2M = 2; + + /** + * LE Coded initiating PHY. + */ + public static final int PHY_LE_CODED = 4; + + /** + * Any LE PHY. + */ + public static final int PHY_LE_ANY = PHY_LE_1M | PHY_LE_2M | PHY_LE_CODED; + + /** + * No preferred coding when transmitting on the LE Coded PHY. + */ + public static final int PHY_OPTION_NO_PREFERRED = 0; + + /** + * Prefer the S=2 coding to be used when transmitting on the LE Coded PHY. + */ + public static final int PHY_OPTION_S2 = 1; + + /** + * Prefer the S=8 coding to be used when transmitting on the LE Coded PHY. + */ + public static final int PHY_OPTION_S8 = 2; + + /** @hide */ public static final String EXTRA_MAS_INSTANCE = "android.bluetooth.device.extra.MAS_INSTANCE"; @@ -1615,6 +1651,67 @@ public final class BluetoothDevice implements Parcelable { */ public BluetoothGatt connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback, int transport) { + return (connectGatt(context, autoConnect,callback, TRANSPORT_AUTO, PHY_LE_1M)); + } + + /** + * Connect to GATT Server hosted by this device. Caller acts as GATT client. + * The callback is used to deliver results to Caller, such as connection status as well + * as any further GATT client operations. + * The method returns a BluetoothGatt instance. You can use BluetoothGatt to conduct + * GATT client operations. + * @param callback GATT callback handler that will receive asynchronous callbacks. + * @param autoConnect Whether to directly connect to the remote device (false) + * or to automatically connect as soon as the remote + * device becomes available (true). + * @throws IllegalArgumentException if callback is null + */ + public BluetoothGatt connectGatt(Context context, boolean autoConnect, + BluetoothGattCallbackExt callback) { + return (connectGatt(context, autoConnect,callback, TRANSPORT_AUTO)); + } + + /** + * Connect to GATT Server hosted by this device. Caller acts as GATT client. + * The callback is used to deliver results to Caller, such as connection status as well + * as any further GATT client operations. + * The method returns a BluetoothGatt instance. You can use BluetoothGatt to conduct + * GATT client operations. + * @param callback GATT callback handler that will receive asynchronous callbacks. + * @param autoConnect Whether to directly connect to the remote device (false) + * or to automatically connect as soon as the remote + * device becomes available (true). + * @param transport preferred transport for GATT connections to remote dual-mode devices + * {@link BluetoothDevice#TRANSPORT_AUTO} or + * {@link BluetoothDevice#TRANSPORT_BREDR} or {@link BluetoothDevice#TRANSPORT_LE} + * @throws IllegalArgumentException if callback is null + */ + public BluetoothGatt connectGatt(Context context, boolean autoConnect, + BluetoothGattCallbackExt callback, int transport) { + return (connectGatt(context, autoConnect,callback, TRANSPORT_AUTO, PHY_LE_1M)); + } + + /** + * Connect to GATT Server hosted by this device. Caller acts as GATT client. + * The callback is used to deliver results to Caller, such as connection status as well + * as any further GATT client operations. + * The method returns a BluetoothGatt instance. You can use BluetoothGatt to conduct + * GATT client operations. + * @param callback GATT callback handler that will receive asynchronous callbacks. + * @param autoConnect Whether to directly connect to the remote device (false) + * or to automatically connect as soon as the remote + * device becomes available (true). + * @param transport preferred transport for GATT connections to remote dual-mode devices + * {@link BluetoothDevice#TRANSPORT_AUTO} or + * {@link BluetoothDevice#TRANSPORT_BREDR} or {@link BluetoothDevice#TRANSPORT_LE} + * @param phy preferred PHY for connections to remote LE device. Bitwise OR of any of + * {@link BluetoothDevice#PHY_LE_1M}, {@link BluetoothDevice#PHY_LE_2M}, + * and {@link BluetoothDevice#PHY_LE_CODED}. This option does not take effect if + * {@code autoConnect} is set to true. + * @throws IllegalArgumentException if callback is null + */ + public BluetoothGatt connectGatt(Context context, boolean autoConnect, + BluetoothGattCallbackExt callback, int transport, int phy) { // TODO(Bluetooth) check whether platform support BLE // Do the check here or in GattServer? BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); @@ -1625,7 +1722,7 @@ public final class BluetoothDevice implements Parcelable { // BLE is not supported return null; } - BluetoothGatt gatt = new BluetoothGatt(iGatt, this, transport); + BluetoothGatt gatt = new BluetoothGatt(iGatt, this, transport, phy); gatt.connect(autoConnect, callback); return gatt; } catch (RemoteException e) {Log.e(TAG, "", e);} diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java index 97a32974d2ab4..0cb69ae519f16 100644 --- a/core/java/android/bluetooth/BluetoothGatt.java +++ b/core/java/android/bluetooth/BluetoothGatt.java @@ -31,7 +31,7 @@ import java.util.UUID; *

This class provides Bluetooth GATT functionality to enable communication * with Bluetooth Smart or Smart Ready devices. * - *

To connect to a remote peripheral device, create a {@link BluetoothGattCallback} + *

To connect to a remote peripheral device, create a {@link BluetoothGattCallbackExt} * and call {@link BluetoothDevice#connectGatt} to get a instance of this class. * GATT capable devices can be discovered using the Bluetooth device discovery or BLE * scan process. @@ -42,7 +42,7 @@ public final class BluetoothGatt implements BluetoothProfile { private static final boolean VDBG = false; private IBluetoothGatt mService; - private BluetoothGattCallback mCallback; + private BluetoothGattCallbackExt mCallback; private int mClientIf; private BluetoothDevice mDevice; private boolean mAutoConnect; @@ -51,6 +51,7 @@ public final class BluetoothGatt implements BluetoothProfile { private final Object mStateLock = new Object(); private Boolean mDeviceBusy = false; private int mTransport; + private int mPhy; private static final int AUTH_RETRY_STATE_IDLE = 0; private static final int AUTH_RETRY_STATE_NO_MITM = 1; @@ -132,10 +133,10 @@ public final class BluetoothGatt implements BluetoothProfile { /*package*/ static final int AUTHENTICATION_MITM = 2; /** - * Bluetooth GATT callbacks. Overrides the default BluetoothGattCallback implementation. + * Bluetooth GATT callbacks. Overrides the default BluetoothGattCallbackExt implementation. */ - private final IBluetoothGattCallback mBluetoothGattCallback = - new IBluetoothGattCallback.Stub() { + private final IBluetoothGattCallbackExt mBluetoothGattCallbackExt = + new IBluetoothGattCallbackExt.Stub() { /** * Application interface registered - app is ready to go * @hide @@ -161,12 +162,50 @@ public final class BluetoothGatt implements BluetoothProfile { } try { mService.clientConnect(mClientIf, mDevice.getAddress(), - !mAutoConnect, mTransport); // autoConnect is inverse of "isDirect" + !mAutoConnect, mTransport, mPhy); // autoConnect is inverse of "isDirect" } catch (RemoteException e) { Log.e(TAG,"",e); } } + /** + * Phy update callback + * @hide + */ + @Override + public void onPhyUpdate(String address, int txPhy, int rxPhy, int status) { + if (DBG) Log.d(TAG, "onPhyUpdate() - status=" + status + + " address=" + address + " txPhy=" + txPhy + " rxPhy=" + rxPhy); + if (!address.equals(mDevice.getAddress())) { + return; + } + + try { + mCallback.onPhyUpdate(BluetoothGatt.this, txPhy, rxPhy, status); + } catch (Exception ex) { + Log.w(TAG, "Unhandled exception in callback", ex); + } + } + + /** + * Phy read callback + * @hide + */ + @Override + public void onPhyRead(String address, int txPhy, int rxPhy, int status) { + if (DBG) Log.d(TAG, "onPhyRead() - status=" + status + + " address=" + address + " txPhy=" + txPhy + " rxPhy=" + rxPhy); + if (!address.equals(mDevice.getAddress())) { + return; + } + + try { + mCallback.onPhyRead(BluetoothGatt.this, txPhy, rxPhy, status); + } catch (Exception ex) { + Log.w(TAG, "Unhandled exception in callback", ex); + } + } + /** * Client connection state changed * @hide @@ -503,10 +542,11 @@ public final class BluetoothGatt implements BluetoothProfile { }; /*package*/ BluetoothGatt(IBluetoothGatt iGatt, BluetoothDevice device, - int transport) { + int transport, int phy) { mService = iGatt; mDevice = device; mTransport = transport; + mPhy = phy; mServices = new ArrayList(); mConnState = CONN_STATE_IDLE; @@ -578,7 +618,7 @@ public final class BluetoothGatt implements BluetoothProfile { /** * Register an application callback to start using GATT. * - *

This is an asynchronous call. The callback {@link BluetoothGattCallback#onAppRegistered} + *

This is an asynchronous call. The callback {@link BluetoothGattCallbackExt#onAppRegistered} * is used to notify success or failure if the function returns true. * *

Requires {@link android.Manifest.permission#BLUETOOTH} permission. @@ -587,7 +627,7 @@ public final class BluetoothGatt implements BluetoothProfile { * @return If true, the callback will be called to notify success or failure, * false on immediate error */ - private boolean registerApp(BluetoothGattCallback callback) { + private boolean registerApp(BluetoothGattCallbackExt callback) { if (DBG) Log.d(TAG, "registerApp()"); if (mService == null) return false; @@ -596,7 +636,7 @@ public final class BluetoothGatt implements BluetoothProfile { if (DBG) Log.d(TAG, "registerApp() - UUID=" + uuid); try { - mService.registerClient(new ParcelUuid(uuid), mBluetoothGattCallback); + mService.registerClient(new ParcelUuid(uuid), mBluetoothGattCallbackExt); } catch (RemoteException e) { Log.e(TAG,"",e); return false; @@ -626,7 +666,7 @@ public final class BluetoothGatt implements BluetoothProfile { * *

The connection may not be established right away, but will be * completed when the remote device is available. A - * {@link BluetoothGattCallback#onConnectionStateChange} callback will be + * {@link BluetoothGattCallbackExt#onConnectionStateChange} callback will be * invoked when the connection state changes as a result of this function. * *

The autoConnect parameter determines whether to actively connect to @@ -644,7 +684,7 @@ public final class BluetoothGatt implements BluetoothProfile { * device becomes available (true). * @return true, if the connection attempt was initiated successfully */ - /*package*/ boolean connect(Boolean autoConnect, BluetoothGattCallback callback) { + /*package*/ boolean connect(Boolean autoConnect, BluetoothGattCallbackExt callback) { if (DBG) Log.d(TAG, "connect() - device: " + mDevice.getAddress() + ", auto: " + autoConnect); synchronized(mStateLock) { if (mConnState != CONN_STATE_IDLE) { @@ -696,7 +736,7 @@ public final class BluetoothGatt implements BluetoothProfile { public boolean connect() { try { mService.clientConnect(mClientIf, mDevice.getAddress(), - false, mTransport); // autoConnect is inverse of "isDirect" + false, mTransport, mPhy); // autoConnect is inverse of "isDirect" return true; } catch (RemoteException e) { Log.e(TAG,"",e); @@ -704,6 +744,45 @@ public final class BluetoothGatt implements BluetoothProfile { } } + /** + * Set the preferred connection PHY for this app. Please note that this is just a + * recommendation, wether the PHY change will happen depends on other applications peferences, + * local and remote controller capabilities. Controller can override these settings. + *

+ * {@link BluetoothGattCallbackExt#onPhyUpdate} will be triggered as a result of this call, even + * if no PHY change happens. It is also triggered when remote device updates the PHY. + * + * @param txPhy preferred transmitter PHY. Bitwise OR of any of + * {@link BluetoothDevice#PHY_LE_1M}, {@link BluetoothDevice#PHY_LE_2M}, and + * {@link BluetoothDevice#PHY_LE_CODED}. + * @param rxPhy preferred receiver PHY. Bitwise OR of any of + * {@link BluetoothDevice#PHY_LE_1M}, {@link BluetoothDevice#PHY_LE_2M}, and + * {@link BluetoothDevice#PHY_LE_CODED}. + * @param phyOptions preferred coding to use when transmitting on the LE Coded PHY. Can be one + * of {@link BluetoothDevice#PHY_OPTION_NO_PREFERRED}, + * {@link BluetoothDevice#PHY_OPTION_S2} or {@link BluetoothDevice#PHY_OPTION_S8} + */ + public void setPreferredPhy(int txPhy, int rxPhy, int phyOptions) { + try { + mService.clientSetPreferredPhy(mClientIf, mDevice.getAddress(), txPhy, rxPhy, + phyOptions); + } catch (RemoteException e) { + Log.e(TAG,"",e); + } + } + + /** + * Read the current transmitter PHY and receiver PHY of the connection. The values are returned + * in {@link BluetoothGattCallbackExt#onPhyRead} + */ + public void readPhy() { + try { + mService.clientReadPhy(mClientIf, mDevice.getAddress()); + } catch (RemoteException e) { + Log.e(TAG,"",e); + } + } + /** * Return the remote bluetooth device this GATT client targets to * @@ -718,7 +797,7 @@ public final class BluetoothGatt implements BluetoothProfile { * characteristics and descriptors. * *

This is an asynchronous operation. Once service discovery is completed, - * the {@link BluetoothGattCallback#onServicesDiscovered} callback is + * the {@link BluetoothGattCallbackExt#onServicesDiscovered} callback is * triggered. If the discovery was successful, the remote services can be * retrieved using the {@link #getServices} function. * @@ -797,7 +876,7 @@ public final class BluetoothGatt implements BluetoothProfile { * Reads the requested characteristic from the associated remote device. * *

This is an asynchronous operation. The result of the read operation - * is reported by the {@link BluetoothGattCallback#onCharacteristicRead} + * is reported by the {@link BluetoothGattCallbackExt#onCharacteristicRead} * callback. * *

Requires {@link android.Manifest.permission#BLUETOOTH} permission. @@ -839,7 +918,7 @@ public final class BluetoothGatt implements BluetoothProfile { * Writes a given characteristic and its values to the associated remote device. * *

Once the write operation has been completed, the - * {@link BluetoothGattCallback#onCharacteristicWrite} callback is invoked, + * {@link BluetoothGattCallbackExt#onCharacteristicWrite} callback is invoked, * reporting the result of the operation. * *

Requires {@link android.Manifest.permission#BLUETOOTH} permission. @@ -883,7 +962,7 @@ public final class BluetoothGatt implements BluetoothProfile { * Reads the value for a given descriptor from the associated remote device. * *

Once the read operation has been completed, the - * {@link BluetoothGattCallback#onDescriptorRead} callback is + * {@link BluetoothGattCallbackExt#onDescriptorRead} callback is * triggered, signaling the result of the operation. * *

Requires {@link android.Manifest.permission#BLUETOOTH} permission. @@ -924,7 +1003,7 @@ public final class BluetoothGatt implements BluetoothProfile { /** * Write the value of a given descriptor to the associated remote device. * - *

A {@link BluetoothGattCallback#onDescriptorWrite} callback is + *

A {@link BluetoothGattCallbackExt#onDescriptorWrite} callback is * triggered to report the result of the write operation. * *

Requires {@link android.Manifest.permission#BLUETOOTH} permission. @@ -968,7 +1047,7 @@ public final class BluetoothGatt implements BluetoothProfile { *

Once a reliable write transaction has been initiated, all calls * to {@link #writeCharacteristic} are sent to the remote device for * verification and queued up for atomic execution. The application will - * receive an {@link BluetoothGattCallback#onCharacteristicWrite} callback + * receive an {@link BluetoothGattCallbackExt#onCharacteristicWrite} callback * in response to every {@link #writeCharacteristic} call and is responsible * for verifying if the value has been transmitted accurately. * @@ -1002,7 +1081,7 @@ public final class BluetoothGatt implements BluetoothProfile { *

This function will commit all queued up characteristic write * operations for a given remote device. * - *

A {@link BluetoothGattCallback#onReliableWriteCompleted} callback is + *

A {@link BluetoothGattCallbackExt#onReliableWriteCompleted} callback is * invoked to indicate whether the transaction has been executed correctly. * *

Requires {@link android.Manifest.permission#BLUETOOTH} permission. @@ -1059,7 +1138,7 @@ public final class BluetoothGatt implements BluetoothProfile { * Enable or disable notifications/indications for a given characteristic. * *

Once notifications are enabled for a characteristic, a - * {@link BluetoothGattCallback#onCharacteristicChanged} callback will be + * {@link BluetoothGattCallbackExt#onCharacteristicChanged} callback will be * triggered if the remote device indicates that the given characteristic * has changed. * @@ -1114,7 +1193,7 @@ public final class BluetoothGatt implements BluetoothProfile { /** * Read the RSSI for a connected remote device. * - *

The {@link BluetoothGattCallback#onReadRemoteRssi} callback will be + *

The {@link BluetoothGattCallbackExt#onReadRemoteRssi} callback will be * invoked when the RSSI value has been read. * *

Requires {@link android.Manifest.permission#BLUETOOTH} permission. @@ -1142,7 +1221,7 @@ public final class BluetoothGatt implements BluetoothProfile { * the data sent is truncated to the MTU size. This function may be used * to request a larger MTU size to be able to send more data at once. * - *

A {@link BluetoothGattCallback#onMtuChanged} callback will indicate + *

A {@link BluetoothGattCallbackExt#onMtuChanged} callback will indicate * whether this operation was successful. * *

Requires {@link android.Manifest.permission#BLUETOOTH} permission. diff --git a/core/java/android/bluetooth/BluetoothGattCallback.java b/core/java/android/bluetooth/BluetoothGattCallback.java index a9156205afcaa..4da106df610c0 100644 --- a/core/java/android/bluetooth/BluetoothGattCallback.java +++ b/core/java/android/bluetooth/BluetoothGattCallback.java @@ -18,138 +18,22 @@ package android.bluetooth; /** * This abstract class is used to implement {@link BluetoothGatt} callbacks. + * @deprecated use {@link BluetoothGattCallbackExt} */ -public abstract class BluetoothGattCallback { +public abstract class BluetoothGattCallback extends BluetoothGattCallbackExt { /** - * Callback indicating when GATT client has connected/disconnected to/from a remote - * GATT server. - * - * @param gatt GATT client - * @param status Status of the connect or disconnect operation. - * {@link BluetoothGatt#GATT_SUCCESS} if the operation succeeds. - * @param newState Returns the new connection state. Can be one of - * {@link BluetoothProfile#STATE_DISCONNECTED} or - * {@link BluetoothProfile#STATE_CONNECTED} + * @hide */ - public void onConnectionStateChange(BluetoothGatt gatt, int status, - int newState) { + @Override + public void onPhyUpdate(BluetoothGatt gatt, int txPhy, int rxPhy, int status) { } /** - * Callback invoked when the list of remote services, characteristics and descriptors - * for the remote device have been updated, ie new services have been discovered. - * - * @param gatt GATT client invoked {@link BluetoothGatt#discoverServices} - * @param status {@link BluetoothGatt#GATT_SUCCESS} if the remote device - * has been explored successfully. + * @hide */ - public void onServicesDiscovered(BluetoothGatt gatt, int status) { + @Override + public void onPhyRead(BluetoothGatt gatt, int txPhy, int rxPhy, int status) { } - /** - * Callback reporting the result of a characteristic read operation. - * - * @param gatt GATT client invoked {@link BluetoothGatt#readCharacteristic} - * @param characteristic Characteristic that was read from the associated - * remote device. - * @param status {@link BluetoothGatt#GATT_SUCCESS} if the read operation - * was completed successfully. - */ - public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, - int status) { - } - - /** - * Callback indicating the result of a characteristic write operation. - * - *

If this callback is invoked while a reliable write transaction is - * in progress, the value of the characteristic represents the value - * reported by the remote device. An application should compare this - * value to the desired value to be written. If the values don't match, - * the application must abort the reliable write transaction. - * - * @param gatt GATT client invoked {@link BluetoothGatt#writeCharacteristic} - * @param characteristic Characteristic that was written to the associated - * remote device. - * @param status The result of the write operation - * {@link BluetoothGatt#GATT_SUCCESS} if the operation succeeds. - */ - public void onCharacteristicWrite(BluetoothGatt gatt, - BluetoothGattCharacteristic characteristic, int status) { - } - - /** - * Callback triggered as a result of a remote characteristic notification. - * - * @param gatt GATT client the characteristic is associated with - * @param characteristic Characteristic that has been updated as a result - * of a remote notification event. - */ - public void onCharacteristicChanged(BluetoothGatt gatt, - BluetoothGattCharacteristic characteristic) { - } - - /** - * Callback reporting the result of a descriptor read operation. - * - * @param gatt GATT client invoked {@link BluetoothGatt#readDescriptor} - * @param descriptor Descriptor that was read from the associated - * remote device. - * @param status {@link BluetoothGatt#GATT_SUCCESS} if the read operation - * was completed successfully - */ - public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, - int status) { - } - - /** - * Callback indicating the result of a descriptor write operation. - * - * @param gatt GATT client invoked {@link BluetoothGatt#writeDescriptor} - * @param descriptor Descriptor that was writte to the associated - * remote device. - * @param status The result of the write operation - * {@link BluetoothGatt#GATT_SUCCESS} if the operation succeeds. - */ - public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, - int status) { - } - - /** - * Callback invoked when a reliable write transaction has been completed. - * - * @param gatt GATT client invoked {@link BluetoothGatt#executeReliableWrite} - * @param status {@link BluetoothGatt#GATT_SUCCESS} if the reliable write - * transaction was executed successfully - */ - public void onReliableWriteCompleted(BluetoothGatt gatt, int status) { - } - - /** - * Callback reporting the RSSI for a remote device connection. - * - * This callback is triggered in response to the - * {@link BluetoothGatt#readRemoteRssi} function. - * - * @param gatt GATT client invoked {@link BluetoothGatt#readRemoteRssi} - * @param rssi The RSSI value for the remote device - * @param status {@link BluetoothGatt#GATT_SUCCESS} if the RSSI was read successfully - */ - public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) { - } - - /** - * Callback indicating the MTU for a given device connection has changed. - * - * This callback is triggered in response to the - * {@link BluetoothGatt#requestMtu} function, or in response to a connection - * event. - * - * @param gatt GATT client invoked {@link BluetoothGatt#requestMtu} - * @param mtu The new MTU size - * @param status {@link BluetoothGatt#GATT_SUCCESS} if the MTU has been changed successfully - */ - public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) { - } } diff --git a/core/java/android/bluetooth/BluetoothGattCallbackExt.java b/core/java/android/bluetooth/BluetoothGattCallbackExt.java new file mode 100644 index 0000000000000..63774c8fbb658 --- /dev/null +++ b/core/java/android/bluetooth/BluetoothGattCallbackExt.java @@ -0,0 +1,182 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.bluetooth; + +/** + * This abstract class is used to implement {@link BluetoothGatt} callbacks. + */ +public abstract class BluetoothGattCallbackExt { + + /** + * Callback triggered as result of {@link BluetoothGatt#setPreferredPhy}, or as a result of + * remote device changing the PHY. + * + * @param gatt GATT client + * @param txPhy the transmitter PHY in use. One of {@link BluetoothDevice#PHY_LE_1M}, + * {@link BluetoothDevice#PHY_LE_2M}, and {@link BluetoothDevice#PHY_LE_CODED}. + * @param rxPhy the receiver PHY in use. One of {@link BluetoothDevice#PHY_LE_1M}, + * {@link BluetoothDevice#PHY_LE_2M}, and {@link BluetoothDevice#PHY_LE_CODED}. + * @param status status of the operation + */ + public void onPhyUpdate(BluetoothGatt gatt, int txPhy, int rxPhy, int status) { + } + + /** + * Callback triggered as result of {@link BluetoothGatt#readPhy} + * + * @param gatt GATT client + * @param txPhy the transmitter PHY in use. One of {@link BluetoothDevice#PHY_LE_1M}, + * {@link BluetoothDevice#PHY_LE_2M}, and {@link BluetoothDevice#PHY_LE_CODED}. + * @param rxPhy the receiver PHY in use. One of {@link BluetoothDevice#PHY_LE_1M}, + * {@link BluetoothDevice#PHY_LE_2M}, and {@link BluetoothDevice#PHY_LE_CODED}. + * @param status status of the operation + */ + public void onPhyRead(BluetoothGatt gatt, int txPhy, int rxPhy, int status) { + } + + /** + * Callback indicating when GATT client has connected/disconnected to/from a remote + * GATT server. + * + * @param gatt GATT client + * @param status Status of the connect or disconnect operation. + * {@link BluetoothGatt#GATT_SUCCESS} if the operation succeeds. + * @param newState Returns the new connection state. Can be one of + * {@link BluetoothProfile#STATE_DISCONNECTED} or + * {@link BluetoothProfile#STATE_CONNECTED} + */ + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + } + + /** + * Callback invoked when the list of remote services, characteristics and descriptors + * for the remote device have been updated, ie new services have been discovered. + * + * @param gatt GATT client invoked {@link BluetoothGatt#discoverServices} + * @param status {@link BluetoothGatt#GATT_SUCCESS} if the remote device + * has been explored successfully. + */ + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + } + + /** + * Callback reporting the result of a characteristic read operation. + * + * @param gatt GATT client invoked {@link BluetoothGatt#readCharacteristic} + * @param characteristic Characteristic that was read from the associated + * remote device. + * @param status {@link BluetoothGatt#GATT_SUCCESS} if the read operation + * was completed successfully. + */ + public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, + int status) { + } + + /** + * Callback indicating the result of a characteristic write operation. + * + *

If this callback is invoked while a reliable write transaction is + * in progress, the value of the characteristic represents the value + * reported by the remote device. An application should compare this + * value to the desired value to be written. If the values don't match, + * the application must abort the reliable write transaction. + * + * @param gatt GATT client invoked {@link BluetoothGatt#writeCharacteristic} + * @param characteristic Characteristic that was written to the associated + * remote device. + * @param status The result of the write operation + * {@link BluetoothGatt#GATT_SUCCESS} if the operation succeeds. + */ + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + /** + * Callback triggered as a result of a remote characteristic notification. + * + * @param gatt GATT client the characteristic is associated with + * @param characteristic Characteristic that has been updated as a result + * of a remote notification event. + */ + public void onCharacteristicChanged(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic) { + } + + /** + * Callback reporting the result of a descriptor read operation. + * + * @param gatt GATT client invoked {@link BluetoothGatt#readDescriptor} + * @param descriptor Descriptor that was read from the associated + * remote device. + * @param status {@link BluetoothGatt#GATT_SUCCESS} if the read operation + * was completed successfully + */ + public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, + int status) { + } + + /** + * Callback indicating the result of a descriptor write operation. + * + * @param gatt GATT client invoked {@link BluetoothGatt#writeDescriptor} + * @param descriptor Descriptor that was writte to the associated + * remote device. + * @param status The result of the write operation + * {@link BluetoothGatt#GATT_SUCCESS} if the operation succeeds. + */ + public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, + int status) { + } + + /** + * Callback invoked when a reliable write transaction has been completed. + * + * @param gatt GATT client invoked {@link BluetoothGatt#executeReliableWrite} + * @param status {@link BluetoothGatt#GATT_SUCCESS} if the reliable write + * transaction was executed successfully + */ + public void onReliableWriteCompleted(BluetoothGatt gatt, int status) { + } + + /** + * Callback reporting the RSSI for a remote device connection. + * + * This callback is triggered in response to the + * {@link BluetoothGatt#readRemoteRssi} function. + * + * @param gatt GATT client invoked {@link BluetoothGatt#readRemoteRssi} + * @param rssi The RSSI value for the remote device + * @param status {@link BluetoothGatt#GATT_SUCCESS} if the RSSI was read successfully + */ + public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) { + } + + /** + * Callback indicating the MTU for a given device connection has changed. + * + * This callback is triggered in response to the + * {@link BluetoothGatt#requestMtu} function, or in response to a connection + * event. + * + * @param gatt GATT client invoked {@link BluetoothGatt#requestMtu} + * @param mtu The new MTU size + * @param status {@link BluetoothGatt#GATT_SUCCESS} if the MTU has been changed successfully + */ + public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) { + } +} diff --git a/core/java/android/bluetooth/BluetoothGattServer.java b/core/java/android/bluetooth/BluetoothGattServer.java index 5ffceba5e11d7..9ee739f04bf83 100644 --- a/core/java/android/bluetooth/BluetoothGattServer.java +++ b/core/java/android/bluetooth/BluetoothGattServer.java @@ -46,7 +46,7 @@ public final class BluetoothGattServer implements BluetoothProfile { private BluetoothAdapter mAdapter; private IBluetoothGatt mService; - private BluetoothGattServerCallback mCallback; + private BluetoothGattServerCallbackExt mCallback; private Object mServerIfLock = new Object(); private int mServerIf; @@ -59,8 +59,8 @@ public final class BluetoothGattServer implements BluetoothProfile { /** * Bluetooth GATT interface callbacks */ - private final IBluetoothGattServerCallback mBluetoothGattServerCallback = - new IBluetoothGattServerCallback.Stub() { + private final IBluetoothGattServerCallbackExt mBluetoothGattServerCallback = + new IBluetoothGattServerCallbackExt.Stub() { /** * Application interface registered - app is ready to go * @hide @@ -292,6 +292,42 @@ public final class BluetoothGattServer implements BluetoothProfile { Log.w(TAG, "Unhandled exception: " + ex); } } + + /** + * The PHY for a connection was updated + * @hide + */ + public void onPhyUpdate(String address, int txPhy, int rxPhy, int status) { + if (DBG) Log.d(TAG, "onPhyUpdate() - " + "device=" + address + ", txPHy=" + txPhy + + ", rxPHy=" + rxPhy); + + BluetoothDevice device = mAdapter.getRemoteDevice(address); + if (device == null) return; + + try { + mCallback.onPhyUpdate(device, txPhy, rxPhy, status); + } catch (Exception ex) { + Log.w(TAG, "Unhandled exception: " + ex); + } + } + + /** + * The PHY for a connection was read + * @hide + */ + public void onPhyRead(String address, int txPhy, int rxPhy, int status) { + if (DBG) Log.d(TAG, "onPhyUpdate() - " + "device=" + address + ", txPHy=" + txPhy + + ", rxPHy=" + rxPhy); + + BluetoothDevice device = mAdapter.getRemoteDevice(address); + if (device == null) return; + + try { + mCallback.onPhyRead(device, txPhy, rxPhy, status); + } catch (Exception ex) { + Log.w(TAG, "Unhandled exception: " + ex); + } + } }; /** @@ -360,7 +396,7 @@ public final class BluetoothGattServer implements BluetoothProfile { * @return true, the callback will be called to notify success or failure, * false on immediate error */ - /*package*/ boolean registerCallback(BluetoothGattServerCallback callback) { + /*package*/ boolean registerCallback(BluetoothGattServerCallbackExt callback) { if (DBG) Log.d(TAG, "registerCallback()"); if (mService == null) { Log.e(TAG, "GATT service not available"); @@ -436,7 +472,7 @@ public final class BluetoothGattServer implements BluetoothProfile { * *

The connection may not be established right away, but will be * completed when the remote device is available. A - * {@link BluetoothGattServerCallback#onConnectionStateChange} callback will be + * {@link BluetoothGattServerCallbackExt#onConnectionStateChange} callback will be * invoked when the connection state changes as a result of this function. * *

The autoConnect paramter determines whether to actively connect to @@ -487,6 +523,48 @@ public final class BluetoothGattServer implements BluetoothProfile { } } + /** + * Set the preferred connection PHY for this app. Please note that this is just a + * recommendation, wether the PHY change will happen depends on other applications peferences, + * local and remote controller capabilities. Controller can override these settings. + *

+ * {@link BluetoothGattServerCallbackExt#onPhyUpdate} will be triggered as a result of this call, even + * if no PHY change happens. It is also triggered when remote device updates the PHY. + * + * @param device The remote device to send this response to + * @param txPhy preferred transmitter PHY. Bitwise OR of any of + * {@link BluetoothDevice#PHY_LE_1M}, {@link BluetoothDevice#PHY_LE_2M}, and + * {@link BluetoothDevice#PHY_LE_CODED}. + * @param rxPhy preferred receiver PHY. Bitwise OR of any of + * {@link BluetoothDevice#PHY_LE_1M}, {@link BluetoothDevice#PHY_LE_2M}, and + * {@link BluetoothDevice#PHY_LE_CODED}. + * @param phyOptions preferred coding to use when transmitting on the LE Coded PHY. Can be one + * of {@link BluetoothDevice#PHY_OPTION_NO_PREFERRED}, + * {@link BluetoothDevice#PHY_OPTION_S2} or {@link BluetoothDevice#PHY_OPTION_S8} + */ + public void setPreferredPhy(BluetoothDevice device, int txPhy, int rxPhy, int phyOptions) { + try { + mService.serverSetPreferredPhy(mServerIf, device.getAddress(), txPhy, rxPhy, + phyOptions); + } catch (RemoteException e) { + Log.e(TAG,"",e); + } + } + + /** + * Read the current transmitter PHY and receiver PHY of the connection. The values are returned + * in {@link BluetoothGattServerCallbackExt#onPhyRead} + * + * @param device The remote device to send this response to + */ + public void readPhy(BluetoothDevice device) { + try { + mService.serverReadPhy(mServerIf, device.getAddress()); + } catch (RemoteException e) { + Log.e(TAG,"",e); + } + } + /** * Send a response to a read or write request to a remote device. * @@ -494,10 +572,10 @@ public final class BluetoothGattServer implements BluetoothProfile { * is received by one of these callback methods: * *

    - *
  • {@link BluetoothGattServerCallback#onCharacteristicReadRequest} - *
  • {@link BluetoothGattServerCallback#onCharacteristicWriteRequest} - *
  • {@link BluetoothGattServerCallback#onDescriptorReadRequest} - *
  • {@link BluetoothGattServerCallback#onDescriptorWriteRequest} + *
  • {@link BluetoothGattServerCallbackExt#onCharacteristicReadRequest} + *
  • {@link BluetoothGattServerCallbackExt#onCharacteristicWriteRequest} + *
  • {@link BluetoothGattServerCallbackExt#onDescriptorReadRequest} + *
  • {@link BluetoothGattServerCallbackExt#onDescriptorWriteRequest} *
* *

Requires {@link android.Manifest.permission#BLUETOOTH} permission. diff --git a/core/java/android/bluetooth/BluetoothGattServerCallback.java b/core/java/android/bluetooth/BluetoothGattServerCallback.java index 2afcf9a322bbf..75ceb52c2d50c 100644 --- a/core/java/android/bluetooth/BluetoothGattServerCallback.java +++ b/core/java/android/bluetooth/BluetoothGattServerCallback.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,141 +20,21 @@ import android.bluetooth.BluetoothDevice; /** * This abstract class is used to implement {@link BluetoothGattServer} callbacks. + * @deprecated please use {@link BluetoothGattServerCallbackExt} */ -public abstract class BluetoothGattServerCallback { +public abstract class BluetoothGattServerCallback extends BluetoothGattServerCallbackExt { /** - * Callback indicating when a remote device has been connected or disconnected. - * - * @param device Remote device that has been connected or disconnected. - * @param status Status of the connect or disconnect operation. - * @param newState Returns the new connection state. Can be one of - * {@link BluetoothProfile#STATE_DISCONNECTED} or - * {@link BluetoothProfile#STATE_CONNECTED} + * @hide */ - public void onConnectionStateChange(BluetoothDevice device, int status, - int newState) { + @Override + public void onPhyUpdate(BluetoothDevice device, int txPhy, int rxPhy, int status) { } /** - * Indicates whether a local service has been added successfully. - * - * @param status Returns {@link BluetoothGatt#GATT_SUCCESS} if the service - * was added successfully. - * @param service The service that has been added + * @hide */ - public void onServiceAdded(int status, BluetoothGattService service) { - } - - /** - * A remote client has requested to read a local characteristic. - * - *

An application must call {@link BluetoothGattServer#sendResponse} - * to complete the request. - * - * @param device The remote device that has requested the read operation - * @param requestId The Id of the request - * @param offset Offset into the value of the characteristic - * @param characteristic Characteristic to be read - */ - public void onCharacteristicReadRequest(BluetoothDevice device, int requestId, - int offset, BluetoothGattCharacteristic characteristic) { - } - - /** - * A remote client has requested to write to a local characteristic. - * - *

An application must call {@link BluetoothGattServer#sendResponse} - * to complete the request. - * - * @param device The remote device that has requested the write operation - * @param requestId The Id of the request - * @param characteristic Characteristic to be written to. - * @param preparedWrite true, if this write operation should be queued for - * later execution. - * @param responseNeeded true, if the remote device requires a response - * @param offset The offset given for the value - * @param value The value the client wants to assign to the characteristic - */ - public void onCharacteristicWriteRequest(BluetoothDevice device, int requestId, - BluetoothGattCharacteristic characteristic, - boolean preparedWrite, boolean responseNeeded, - int offset, byte[] value) { - } - - /** - * A remote client has requested to read a local descriptor. - * - *

An application must call {@link BluetoothGattServer#sendResponse} - * to complete the request. - * - * @param device The remote device that has requested the read operation - * @param requestId The Id of the request - * @param offset Offset into the value of the characteristic - * @param descriptor Descriptor to be read - */ - public void onDescriptorReadRequest(BluetoothDevice device, int requestId, - int offset, BluetoothGattDescriptor descriptor) { - } - - /** - * A remote client has requested to write to a local descriptor. - * - *

An application must call {@link BluetoothGattServer#sendResponse} - * to complete the request. - * - * @param device The remote device that has requested the write operation - * @param requestId The Id of the request - * @param descriptor Descriptor to be written to. - * @param preparedWrite true, if this write operation should be queued for - * later execution. - * @param responseNeeded true, if the remote device requires a response - * @param offset The offset given for the value - * @param value The value the client wants to assign to the descriptor - */ - public void onDescriptorWriteRequest(BluetoothDevice device, int requestId, - BluetoothGattDescriptor descriptor, - boolean preparedWrite, boolean responseNeeded, - int offset, byte[] value) { - } - - /** - * Execute all pending write operations for this device. - * - *

An application must call {@link BluetoothGattServer#sendResponse} - * to complete the request. - * - * @param device The remote device that has requested the write operations - * @param requestId The Id of the request - * @param execute Whether the pending writes should be executed (true) or - * cancelled (false) - */ - public void onExecuteWrite(BluetoothDevice device, int requestId, boolean execute) { - } - - /** - * Callback invoked when a notification or indication has been sent to - * a remote device. - * - *

When multiple notifications are to be sent, an application must - * wait for this callback to be received before sending additional - * notifications. - * - * @param device The remote device the notification has been sent to - * @param status {@link BluetoothGatt#GATT_SUCCESS} if the operation was successful - */ - public void onNotificationSent(BluetoothDevice device, int status) { - } - - /** - * Callback indicating the MTU for a given device connection has changed. - * - *

This callback will be invoked if a remote client has requested to change - * the MTU for a given connection. - * - * @param device The remote device that requested the MTU change - * @param mtu The new MTU size - */ - public void onMtuChanged(BluetoothDevice device, int mtu) { + @Override + public void onPhyRead(BluetoothDevice device, int txPhy, int rxPhy, int status) { } } diff --git a/core/java/android/bluetooth/BluetoothGattServerCallbackExt.java b/core/java/android/bluetooth/BluetoothGattServerCallbackExt.java new file mode 100644 index 0000000000000..455cce04c58c6 --- /dev/null +++ b/core/java/android/bluetooth/BluetoothGattServerCallbackExt.java @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.bluetooth; + +import android.bluetooth.BluetoothDevice; + +/** + * This abstract class is used to implement {@link BluetoothGattServer} callbacks. + */ +public abstract class BluetoothGattServerCallbackExt { + + /** + * Callback indicating when a remote device has been connected or disconnected. + * + * @param device Remote device that has been connected or disconnected. + * @param status Status of the connect or disconnect operation. + * @param newState Returns the new connection state. Can be one of + * {@link BluetoothProfile#STATE_DISCONNECTED} or + * {@link BluetoothProfile#STATE_CONNECTED} + */ + public void onConnectionStateChange(BluetoothDevice device, int status, + int newState) { + } + + /** + * Indicates whether a local service has been added successfully. + * + * @param status Returns {@link BluetoothGatt#GATT_SUCCESS} if the service + * was added successfully. + * @param service The service that has been added + */ + public void onServiceAdded(int status, BluetoothGattService service) { + } + + /** + * A remote client has requested to read a local characteristic. + * + *

An application must call {@link BluetoothGattServer#sendResponse} + * to complete the request. + * + * @param device The remote device that has requested the read operation + * @param requestId The Id of the request + * @param offset Offset into the value of the characteristic + * @param characteristic Characteristic to be read + */ + public void onCharacteristicReadRequest(BluetoothDevice device, int requestId, + int offset, BluetoothGattCharacteristic characteristic) { + } + + /** + * A remote client has requested to write to a local characteristic. + * + *

An application must call {@link BluetoothGattServer#sendResponse} + * to complete the request. + * + * @param device The remote device that has requested the write operation + * @param requestId The Id of the request + * @param characteristic Characteristic to be written to. + * @param preparedWrite true, if this write operation should be queued for + * later execution. + * @param responseNeeded true, if the remote device requires a response + * @param offset The offset given for the value + * @param value The value the client wants to assign to the characteristic + */ + public void onCharacteristicWriteRequest(BluetoothDevice device, int requestId, + BluetoothGattCharacteristic characteristic, + boolean preparedWrite, boolean responseNeeded, + int offset, byte[] value) { + } + + /** + * A remote client has requested to read a local descriptor. + * + *

An application must call {@link BluetoothGattServer#sendResponse} + * to complete the request. + * + * @param device The remote device that has requested the read operation + * @param requestId The Id of the request + * @param offset Offset into the value of the characteristic + * @param descriptor Descriptor to be read + */ + public void onDescriptorReadRequest(BluetoothDevice device, int requestId, + int offset, BluetoothGattDescriptor descriptor) { + } + + /** + * A remote client has requested to write to a local descriptor. + * + *

An application must call {@link BluetoothGattServer#sendResponse} + * to complete the request. + * + * @param device The remote device that has requested the write operation + * @param requestId The Id of the request + * @param descriptor Descriptor to be written to. + * @param preparedWrite true, if this write operation should be queued for + * later execution. + * @param responseNeeded true, if the remote device requires a response + * @param offset The offset given for the value + * @param value The value the client wants to assign to the descriptor + */ + public void onDescriptorWriteRequest(BluetoothDevice device, int requestId, + BluetoothGattDescriptor descriptor, + boolean preparedWrite, boolean responseNeeded, + int offset, byte[] value) { + } + + /** + * Execute all pending write operations for this device. + * + *

An application must call {@link BluetoothGattServer#sendResponse} + * to complete the request. + * + * @param device The remote device that has requested the write operations + * @param requestId The Id of the request + * @param execute Whether the pending writes should be executed (true) or + * cancelled (false) + */ + public void onExecuteWrite(BluetoothDevice device, int requestId, boolean execute) { + } + + /** + * Callback invoked when a notification or indication has been sent to + * a remote device. + * + *

When multiple notifications are to be sent, an application must + * wait for this callback to be received before sending additional + * notifications. + * + * @param device The remote device the notification has been sent to + * @param status {@link BluetoothGatt#GATT_SUCCESS} if the operation was successful + */ + public void onNotificationSent(BluetoothDevice device, int status) { + } + + /** + * Callback indicating the MTU for a given device connection has changed. + * + *

This callback will be invoked if a remote client has requested to change + * the MTU for a given connection. + * + * @param device The remote device that requested the MTU change + * @param mtu The new MTU size + */ + public void onMtuChanged(BluetoothDevice device, int mtu) { + } + + /** + * Callback triggered as result of {@link BluetoothGattServer#setPreferredPhy}, or as a result + * of remote device changing the PHY. + * + * @param device The remote device + * @param txPhy the transmitter PHY in use. One of {@link BluetoothDevice#PHY_LE_1M}, + * {@link BluetoothDevice#PHY_LE_2M}, and {@link BluetoothDevice#PHY_LE_CODED} + * @param rxPhy the receiver PHY in use. One of {@link BluetoothDevice#PHY_LE_1M}, + * {@link BluetoothDevice#PHY_LE_2M}, and {@link BluetoothDevice#PHY_LE_CODED} + * @param status status of the operation + */ + public void onPhyUpdate(BluetoothDevice device, int txPhy, int rxPhy, int status) { + } + + /** + * Callback triggered as result of {@link BluetoothGattServer#readPhy} + * + * @param device The remote device that requested the PHY read + * @param txPhy the transmitter PHY in use. One of {@link BluetoothDevice#PHY_LE_1M}, + * {@link BluetoothDevice#PHY_LE_2M}, and {@link BluetoothDevice#PHY_LE_CODED} + * @param rxPhy the receiver PHY in use. One of {@link BluetoothDevice#PHY_LE_1M}, + * {@link BluetoothDevice#PHY_LE_2M}, and {@link BluetoothDevice#PHY_LE_CODED} + * @param status status of the operation + */ + public void onPhyRead(BluetoothDevice device, int txPhy, int rxPhy, int status) { + } +} diff --git a/core/java/android/bluetooth/IBluetoothGatt.aidl b/core/java/android/bluetooth/IBluetoothGatt.aidl index 69563cb3e6a4d..5282e9fceba54 100644 --- a/core/java/android/bluetooth/IBluetoothGatt.aidl +++ b/core/java/android/bluetooth/IBluetoothGatt.aidl @@ -27,8 +27,8 @@ import android.bluetooth.le.ResultStorageDescriptor; import android.os.ParcelUuid; import android.os.WorkSource; -import android.bluetooth.IBluetoothGattCallback; -import android.bluetooth.IBluetoothGattServerCallback; +import android.bluetooth.IBluetoothGattCallbackExt; +import android.bluetooth.IBluetoothGattServerCallbackExt; import android.bluetooth.le.IAdvertiserCallback; import android.bluetooth.le.IPeriodicAdvertisingCallback; import android.bluetooth.le.IScannerCallback; @@ -58,10 +58,12 @@ interface IBluetoothGatt { void registerSync(in ScanResult scanResult, in int skip, in int timeout, in IPeriodicAdvertisingCallback callback); void unregisterSync(in IPeriodicAdvertisingCallback callback); - void registerClient(in ParcelUuid appId, in IBluetoothGattCallback callback); + void registerClient(in ParcelUuid appId, in IBluetoothGattCallbackExt callback); void unregisterClient(in int clientIf); - void clientConnect(in int clientIf, in String address, in boolean isDirect, in int transport); + void clientConnect(in int clientIf, in String address, in boolean isDirect, in int transport, in int phy); void clientDisconnect(in int clientIf, in String address); + void clientSetPreferredPhy(in int clientIf, in String address, in int txPhy, in int rxPhy, in int phyOptions); + void clientReadPhy(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 handle, in int authReq); @@ -77,10 +79,12 @@ interface IBluetoothGatt { void configureMTU(in int clientIf, in String address, in int mtu); void connectionParameterUpdate(in int clientIf, in String address, in int connectionPriority); - void registerServer(in ParcelUuid appId, in IBluetoothGattServerCallback callback); + void registerServer(in ParcelUuid appId, in IBluetoothGattServerCallbackExt callback); void unregisterServer(in int serverIf); void serverConnect(in int serverIf, in String address, in boolean isDirect, in int transport); void serverDisconnect(in int serverIf, in String address); + void serverSetPreferredPhy(in int clientIf, in String address, in int txPhy, in int rxPhy, in int phyOptions); + void serverReadPhy(in int clientIf, in String address); void addService(in int serverIf, in BluetoothGattService service); void removeService(in int serverIf, in int handle); void clearServices(in int serverIf); diff --git a/core/java/android/bluetooth/IBluetoothGattCallback.aidl b/core/java/android/bluetooth/IBluetoothGattCallbackExt.aidl similarity index 89% rename from core/java/android/bluetooth/IBluetoothGattCallback.aidl rename to core/java/android/bluetooth/IBluetoothGattCallbackExt.aidl index 72cb61827737a..736f4b2b048fd 100644 --- a/core/java/android/bluetooth/IBluetoothGattCallback.aidl +++ b/core/java/android/bluetooth/IBluetoothGattCallbackExt.aidl @@ -22,10 +22,12 @@ import android.bluetooth.BluetoothGattService; * Callback definitions for interacting with BLE / GATT * @hide */ -oneway interface IBluetoothGattCallback { +oneway interface IBluetoothGattCallbackExt { void onClientRegistered(in int status, in int clientIf); void onClientConnectionState(in int status, in int clientIf, in boolean connected, in String address); + void onPhyUpdate(in String address, in int txPhy, in int rxPhy, in int status); + void onPhyRead(in String address, in int txPhy, in int rxPhy, in int status); void onSearchComplete(in String address, in List services, in int status); 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); diff --git a/core/java/android/bluetooth/IBluetoothGattServerCallback.aidl b/core/java/android/bluetooth/IBluetoothGattServerCallbackExt.aidl similarity index 88% rename from core/java/android/bluetooth/IBluetoothGattServerCallback.aidl rename to core/java/android/bluetooth/IBluetoothGattServerCallbackExt.aidl index 1a924fb4e3158..091ffb3fe9877 100644 --- a/core/java/android/bluetooth/IBluetoothGattServerCallback.aidl +++ b/core/java/android/bluetooth/IBluetoothGattServerCallbackExt.aidl @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,7 @@ import android.bluetooth.BluetoothGattService; * Callback definitions for interacting with BLE / GATT * @hide */ -oneway interface IBluetoothGattServerCallback { +oneway interface IBluetoothGattServerCallbackExt { void onServerRegistered(in int status, in int serverIf); void onServerConnectionState(in int status, in int serverIf, in boolean connected, in String address); @@ -40,4 +40,6 @@ oneway interface IBluetoothGattServerCallback { void onExecuteWrite(in String address, in int transId, in boolean execWrite); void onNotificationSent(in String address, in int status); void onMtuChanged(in String address, in int mtu); + void onPhyUpdate(in String address, in int txPhy, in int rxPhy, in int status); + void onPhyRead(in String address, in int txPhy, in int rxPhy, in int status); }