Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 93aa2e43 authored by Andre Eisenbach's avatar Andre Eisenbach Committed by Matthew Xie
Browse files

LE: Add instance ID to descriptors (1/4)

If a remote devices offers multiple descriptors with the same UUID, the
instance ID is used to differentiate between them.

Change-Id: I0c36494c980c86abd23f9647196af8d59ef663e9
parent 43d433df
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -1704,7 +1704,7 @@ public final class BluetoothAdapter {
        public void onGetDescriptor(String address, int srvcType,
                                    int srvcInstId, ParcelUuid srvcUuid,
                                    int charInstId, ParcelUuid charUuid,
                                    ParcelUuid descUuid) {
                                    int descInstId, ParcelUuid descUuid) {
            // no op
        }

@@ -1734,14 +1734,14 @@ public final class BluetoothAdapter {
        public void onDescriptorRead(String address, int status, int srvcType,
                                     int srvcInstId, ParcelUuid srvcUuid,
                                     int charInstId, ParcelUuid charUuid,
                                     ParcelUuid descrUuid, byte[] value) {
                                     int descInstId, ParcelUuid descrUuid, byte[] value) {
            // no op
        }

        public void onDescriptorWrite(String address, int status, int srvcType,
                                      int srvcInstId, ParcelUuid srvcUuid,
                                      int charInstId, ParcelUuid charUuid,
                                      ParcelUuid descrUuid) {
                                      int descInstId, ParcelUuid descrUuid) {
            // no op
        }

+18 −18
Original line number Diff line number Diff line
@@ -261,7 +261,7 @@ public final class BluetoothGatt implements BluetoothProfile {
            public void onGetDescriptor(String address, int srvcType,
                             int srvcInstId, ParcelUuid srvcUuid,
                             int charInstId, ParcelUuid charUuid,
                             ParcelUuid descUuid) {
                             int descrInstId, ParcelUuid descUuid) {
                if (DBG) Log.d(TAG, "onGetDescriptor() - Device=" + address + " UUID=" + descUuid);

                if (!address.equals(mDevice.getAddress())) {
@@ -276,7 +276,7 @@ public final class BluetoothGatt implements BluetoothProfile {
                if (characteristic == null) return;

                characteristic.addDescriptor(new BluetoothGattDescriptor(
                    characteristic, descUuid.getUuid(), 0));
                    characteristic, descUuid.getUuid(), descrInstId, 0));
            }

            /**
@@ -429,7 +429,8 @@ public final class BluetoothGatt implements BluetoothProfile {
            public void onDescriptorRead(String address, int status, int srvcType,
                             int srvcInstId, ParcelUuid srvcUuid,
                             int charInstId, ParcelUuid charUuid,
                             ParcelUuid descrUuid, byte[] value) {
                             int descrInstId, ParcelUuid descrUuid,
                             byte[] value) {
                if (DBG) Log.d(TAG, "onDescriptorRead() - Device=" + address + " UUID=" + charUuid);

                if (!address.equals(mDevice.getAddress())) {
@@ -444,7 +445,7 @@ public final class BluetoothGatt implements BluetoothProfile {
                if (characteristic == null) return;

                BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
                        descrUuid.getUuid());
                        descrUuid.getUuid(), descrInstId);
                if (descriptor == null) return;

                if (status == 0) descriptor.setValue(value);
@@ -456,7 +457,7 @@ public final class BluetoothGatt implements BluetoothProfile {
                        mAuthRetry = true;
                        mService.readDescriptor(mClientIf, address,
                            srvcType, srvcInstId, srvcUuid, charInstId, charUuid,
                            descrUuid, AUTHENTICATION_MITM);
                            descrInstId, descrUuid, AUTHENTICATION_MITM);
                    } catch (RemoteException e) {
                        Log.e(TAG,"",e);
                    }
@@ -478,7 +479,7 @@ public final class BluetoothGatt implements BluetoothProfile {
            public void onDescriptorWrite(String address, int status, int srvcType,
                             int srvcInstId, ParcelUuid srvcUuid,
                             int charInstId, ParcelUuid charUuid,
                             ParcelUuid descrUuid) {
                             int descrInstId, ParcelUuid descrUuid) {
                if (DBG) Log.d(TAG, "onDescriptorWrite() - Device=" + address + " UUID=" + charUuid);

                if (!address.equals(mDevice.getAddress())) {
@@ -493,7 +494,7 @@ public final class BluetoothGatt implements BluetoothProfile {
                if (characteristic == null) return;

                BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
                        descrUuid.getUuid());
                        descrUuid.getUuid(), descrInstId);
                if (descriptor == null) return;

                if ((status == GATT_INSUFFICIENT_AUTHENTICATION
@@ -503,7 +504,7 @@ public final class BluetoothGatt implements BluetoothProfile {
                        mAuthRetry = true;
                        mService.writeDescriptor(mClientIf, address,
                            srvcType, srvcInstId, srvcUuid, charInstId, charUuid,
                            descrUuid, characteristic.getWriteType(),
                            descrInstId, descrUuid, characteristic.getWriteType(),
                            AUTHENTICATION_MITM, descriptor.getValue());
                    } catch (RemoteException e) {
                        Log.e(TAG,"",e);
@@ -915,11 +916,11 @@ public final class BluetoothGatt implements BluetoothProfile {
        if (device == null) return false;

        try {
            mService.readDescriptor(mClientIf, device.getAddress(),
                service.getType(), service.getInstanceId(),
                new ParcelUuid(service.getUuid()), characteristic.getInstanceId(),
                new ParcelUuid(characteristic.getUuid()),
                new ParcelUuid(descriptor.getUuid()), AUTHENTICATION_NONE);
            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);
        } catch (RemoteException e) {
            Log.e(TAG,"",e);
            return false;
@@ -953,11 +954,10 @@ public final class BluetoothGatt implements BluetoothProfile {
        if (device == null) return false;

        try {
            mService.writeDescriptor(mClientIf, device.getAddress(),
                service.getType(), service.getInstanceId(),
                new ParcelUuid(service.getUuid()), characteristic.getInstanceId(),
                new ParcelUuid(characteristic.getUuid()),
                new ParcelUuid(descriptor.getUuid()),
            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());
        } catch (RemoteException e) {
+14 −0
Original line number Diff line number Diff line
@@ -282,6 +282,20 @@ public class BluetoothGattCharacteristic {
        return true;
    }

    /**
     * Get a descriptor by UUID and isntance id.
     * @hide
     */
    /*package*/  BluetoothGattDescriptor getDescriptor(UUID uuid, int instanceId) {
        for(BluetoothGattDescriptor descriptor : mDescriptors) {
            if (descriptor.getUuid().equals(uuid)
             && descriptor.getInstanceId() == instanceId) {
                return descriptor;
            }
        }
        return null;
    }

    /**
     * Returns the service this characteristic belongs to.
     * @return The asscociated service
+26 −4
Original line number Diff line number Diff line
@@ -90,6 +90,12 @@ public class BluetoothGattDescriptor {
     */
    protected UUID mUuid;

    /**
     * Instance ID for this descriptor.
     * @hide
     */
    protected int mInstance;

    /**
     * Permissions for this descriptor
     * @hide
@@ -116,7 +122,7 @@ public class BluetoothGattDescriptor {
     * @param permissions Permissions for this descriptor
     */
    public BluetoothGattDescriptor(UUID uuid, int permissions) {
        initDescriptor(null, uuid, permissions);
        initDescriptor(null, uuid, 0, permissions);
    }

    /**
@@ -128,14 +134,15 @@ public class BluetoothGattDescriptor {
     * @param permissions Permissions for this descriptor
     */
    /*package*/ BluetoothGattDescriptor(BluetoothGattCharacteristic characteristic, UUID uuid,
                                    int permissions) {
        initDescriptor(characteristic, uuid, permissions);
                                    int instance, int permissions) {
        initDescriptor(characteristic, uuid, instance, permissions);
    }

    private void initDescriptor(BluetoothGattCharacteristic characteristic, UUID uuid,
                                int permissions) {
                                int instance, int permissions) {
        mCharacteristic = characteristic;
        mUuid = uuid;
        mInstance = instance;
        mPermissions = permissions;
    }

@@ -164,6 +171,21 @@ public class BluetoothGattDescriptor {
        return mUuid;
    }

    /**
     * Returns the instance ID for this descriptor.
     *
     * <p>If a remote device offers multiple descriptors with the same UUID,
     * the instance ID is used to distuinguish between descriptors.
     *
     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
     *
     * @return Instance ID of this descriptor
     * @hide
     */
    public int getInstanceId() {
        return mInstance;
    }

    /**
     * Returns the permissions for this descriptor.
     *
+2 −2
Original line number Diff line number Diff line
@@ -152,8 +152,8 @@ public class BluetoothGattService {
     */
    /*package*/ BluetoothGattCharacteristic getCharacteristic(UUID uuid, int instanceId) {
        for(BluetoothGattCharacteristic characteristic : mCharacteristics) {
            if (uuid.equals(characteristic.getUuid()) &&
                    mInstanceId == instanceId)
            if (uuid.equals(characteristic.getUuid())
             && characteristic.getInstanceId() == instanceId)
                return characteristic;
        }
        return null;
Loading