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

Commit 1a2eafc2 authored by Jakub Pawlowski's avatar Jakub Pawlowski Committed by android-build-merger
Browse files

Merge "GATT Server refactoring (2/4)"

am: d13954e8c6

Change-Id: I10383d95f79409282d96ae60b294c72754df5641
parents 3f8ae5a2 8d7adf28
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -250,9 +250,6 @@ public final class BluetoothGatt implements BluetoothProfile {
                if (VDBG) Log.d(TAG, "onCharacteristicRead() - Device=" + address
                            + " handle=" + handle + " Status=" + status);

                 Log.w(TAG, "onCharacteristicRead() - Device=" + address
                            + " handle=" + handle + " Status=" + status);

                if (!address.equals(mDevice.getAddress())) {
                    return;
                }
+10 −2
Original line number Diff line number Diff line
@@ -321,10 +321,10 @@ public class BluetoothGattCharacteristic implements Parcelable {
    }

    /**
     * Returns the deisred key size.
     * Returns the desired key size.
     * @hide
     */
    /*package*/ int getKeySize() {
    public int getKeySize() {
        return mKeySize;
    }

@@ -392,6 +392,14 @@ public class BluetoothGattCharacteristic implements Parcelable {
        return mInstance;
    }

    /**
     * Force the instance ID.
     * @hide
     */
    public void setInstanceId(int instanceId) {
        mInstance = instanceId;
    }

    /**
     * Returns the properties of this characteristic.
     *
+8 −0
Original line number Diff line number Diff line
@@ -226,6 +226,14 @@ public class BluetoothGattDescriptor implements Parcelable {
        return mInstance;
    }

    /**
     * Force the instance ID.
     * @hide
     */
    public void setInstanceId(int instanceId) {
        mInstance = instanceId;
    }

    /**
     * Returns the permissions for this descriptor.
     *
+92 −103
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ public final class BluetoothGattServer implements BluetoothProfile {
    private Object mServerIfLock = new Object();
    private int mServerIf;
    private int mTransport;
    private BluetoothGattService mPendingService;
    private List<BluetoothGattService> mServices;

    private static final int CALLBACK_REG_TIMEOUT = 10000;
@@ -109,17 +110,37 @@ public final class BluetoothGattServer implements BluetoothProfile {
             * Service has been added
             * @hide
             */
            public void onServiceAdded(int status, int srvcType,
                                       int srvcInstId, ParcelUuid srvcId) {
                UUID srvcUuid = srvcId.getUuid();
                if (DBG) Log.d(TAG, "onServiceAdded() - service=" + srvcUuid
                    + "status=" + status);
            public void onServiceAdded(int status, BluetoothGattService service) {
                if (DBG) Log.d(TAG, "onServiceAdded() - handle=" + service.getInstanceId()
                    + " uuid=" + service.getUuid() + " status=" + status);

                BluetoothGattService service = getService(srvcUuid, srvcInstId, srvcType);
                if (service == null) return;
                if (mPendingService == null)
                    return;

                BluetoothGattService tmp = mPendingService;
                mPendingService = null;

                // Rewrite newly assigned handles to existing service.
                tmp.setInstanceId(service.getInstanceId());
                List<BluetoothGattCharacteristic> temp_chars = tmp.getCharacteristics();
                List<BluetoothGattCharacteristic> svc_chars = service.getCharacteristics();
                for (int i=0; i<svc_chars.size(); i++) {
                    BluetoothGattCharacteristic temp_char = temp_chars.get(i);
                    BluetoothGattCharacteristic svc_char = svc_chars.get(i);

                    temp_char.setInstanceId(svc_char.getInstanceId());

                    List<BluetoothGattDescriptor> temp_descs = temp_char.getDescriptors();
                    List<BluetoothGattDescriptor> svc_descs = svc_char.getDescriptors();
                    for (int j=0; j<svc_descs.size(); j++) {
                        temp_descs.get(i).setInstanceId(svc_descs.get(i).getInstanceId());
                    }
                }

                mServices.add(tmp);

                try {
                    mCallback.onServiceAdded((int)status, service);
                    mCallback.onServiceAdded((int)status, tmp);
                } catch (Exception ex) {
                    Log.w(TAG, "Unhandled exception in callback", ex);
                }
@@ -130,19 +151,15 @@ public final class BluetoothGattServer implements BluetoothProfile {
             * @hide
             */
            public void onCharacteristicReadRequest(String address, int transId,
                            int offset, boolean isLong, int srvcType, int srvcInstId,
                            ParcelUuid srvcId, int charInstId, ParcelUuid charId) {
                UUID srvcUuid = srvcId.getUuid();
                UUID charUuid = charId.getUuid();
                if (VDBG) Log.d(TAG, "onCharacteristicReadRequest() - "
                    + "service=" + srvcUuid + ", characteristic=" + charUuid);
                            int offset, boolean isLong, int handle) {
                if (VDBG) Log.d(TAG, "onCharacteristicReadRequest() - handle=" + handle);

                BluetoothDevice device = mAdapter.getRemoteDevice(address);
                BluetoothGattService service = getService(srvcUuid, srvcInstId, srvcType);
                if (service == null) return;

                BluetoothGattCharacteristic characteristic = service.getCharacteristic(charUuid);
                if (characteristic == null) return;
                BluetoothGattCharacteristic characteristic = getCharacteristicByHandle(handle);
                if (characteristic == null) {
                    Log.w(TAG, "onCharacteristicReadRequest() no char for handle " + handle);
                    return;
                }

                try {
                    mCallback.onCharacteristicReadRequest(device, transId, offset, characteristic);
@@ -156,25 +173,15 @@ public final class BluetoothGattServer implements BluetoothProfile {
             * @hide
             */
            public void onDescriptorReadRequest(String address, int transId,
                            int offset, boolean isLong, int srvcType, int srvcInstId,
                            ParcelUuid srvcId, int charInstId, ParcelUuid charId,
                            ParcelUuid descrId) {
                UUID srvcUuid = srvcId.getUuid();
                UUID charUuid = charId.getUuid();
                UUID descrUuid = descrId.getUuid();
                if (VDBG) Log.d(TAG, "onCharacteristicReadRequest() - "
                    + "service=" + srvcUuid + ", characteristic=" + charUuid
                    + "descriptor=" + descrUuid);
                            int offset, boolean isLong, int handle) {
                if (VDBG) Log.d(TAG, "onCharacteristicReadRequest() - handle=" + handle);

                BluetoothDevice device = mAdapter.getRemoteDevice(address);
                BluetoothGattService service = getService(srvcUuid, srvcInstId, srvcType);
                if (service == null) return;

                BluetoothGattCharacteristic characteristic = service.getCharacteristic(charUuid);
                if (characteristic == null) return;

                BluetoothGattDescriptor descriptor = characteristic.getDescriptor(descrUuid);
                if (descriptor == null) return;
                BluetoothGattDescriptor descriptor = getDescriptorByHandle(handle);
                if (descriptor == null) {
                    Log.w(TAG, "onDescriptorReadRequest() no desc for handle " + handle);
                    return;
                }

                try {
                    mCallback.onDescriptorReadRequest(device, transId, offset, descriptor);
@@ -189,19 +196,15 @@ public final class BluetoothGattServer implements BluetoothProfile {
             */
            public void onCharacteristicWriteRequest(String address, int transId,
                            int offset, int length, boolean isPrep, boolean needRsp,
                            int srvcType, int srvcInstId, ParcelUuid srvcId,
                            int charInstId, ParcelUuid charId, byte[] value) {
                UUID srvcUuid = srvcId.getUuid();
                UUID charUuid = charId.getUuid();
                if (VDBG) Log.d(TAG, "onCharacteristicWriteRequest() - "
                    + "service=" + srvcUuid + ", characteristic=" + charUuid);
                            int handle, byte[] value) {
                if (VDBG) Log.d(TAG, "onCharacteristicWriteRequest() - handle=" + handle);

                BluetoothDevice device = mAdapter.getRemoteDevice(address);
                BluetoothGattService service = getService(srvcUuid, srvcInstId, srvcType);
                if (service == null) return;

                BluetoothGattCharacteristic characteristic = service.getCharacteristic(charUuid);
                if (characteristic == null) return;
                BluetoothGattCharacteristic characteristic = getCharacteristicByHandle(handle);
                if (characteristic == null) {
                    Log.w(TAG, "onCharacteristicWriteRequest() no char for handle " + handle);
                    return;
                }

                try {
                    mCallback.onCharacteristicWriteRequest(device, transId, characteristic,
@@ -216,28 +219,16 @@ public final class BluetoothGattServer implements BluetoothProfile {
             * Remote client descriptor write request.
             * @hide
             */
            public void onDescriptorWriteRequest(String address, int transId,
                            int offset, int length, boolean isPrep, boolean needRsp,
                            int srvcType, int srvcInstId, ParcelUuid srvcId,
                            int charInstId, ParcelUuid charId, ParcelUuid descrId,
                            byte[] value) {
                UUID srvcUuid = srvcId.getUuid();
                UUID charUuid = charId.getUuid();
                UUID descrUuid = descrId.getUuid();
                if (VDBG) Log.d(TAG, "onDescriptorWriteRequest() - "
                    + "service=" + srvcUuid + ", characteristic=" + charUuid
                    + "descriptor=" + descrUuid);
            public void onDescriptorWriteRequest(String address, int transId, int offset,
                            int length, boolean isPrep, boolean needRsp, int handle, byte[] value) {
                if (VDBG) Log.d(TAG, "onDescriptorWriteRequest() - handle=" + handle);

                BluetoothDevice device = mAdapter.getRemoteDevice(address);

                BluetoothGattService service = getService(srvcUuid, srvcInstId, srvcType);
                if (service == null) return;

                BluetoothGattCharacteristic characteristic = service.getCharacteristic(charUuid);
                if (characteristic == null) return;

                BluetoothGattDescriptor descriptor = characteristic.getDescriptor(descrUuid);
                if (descriptor == null) return;
                BluetoothGattDescriptor descriptor = getDescriptorByHandle(handle);
                if (descriptor == null) {
                    Log.w(TAG, "onDescriptorWriteRequest() no desc for handle " + handle);
                    return;
                }

                try {
                    mCallback.onDescriptorWriteRequest(device, transId, descriptor,
@@ -317,6 +308,36 @@ public final class BluetoothGattServer implements BluetoothProfile {
        mServices = new ArrayList<BluetoothGattService>();
    }

    /**
     * Returns a characteristic with given handle.
     * @hide
     */
    /*package*/ BluetoothGattCharacteristic getCharacteristicByHandle(int handle) {
        for(BluetoothGattService svc : mServices) {
            for(BluetoothGattCharacteristic charac : svc.getCharacteristics()) {
                if (charac.getInstanceId() == handle)
                    return charac;
            }
        }
        return null;
    }

    /**
     * Returns a descriptor with given handle.
     * @hide
     */
    /*package*/ BluetoothGattDescriptor getDescriptorByHandle(int handle) {
        for(BluetoothGattService svc : mServices) {
            for(BluetoothGattCharacteristic charac : svc.getCharacteristics()) {
                for(BluetoothGattDescriptor desc : charac.getDescriptors()) {
                    if (desc.getInstanceId() == handle)
                        return desc;
                }
            }
        }
        return null;
    }

    /**
     * Close this GATT server instance.
     *
@@ -537,9 +558,7 @@ public final class BluetoothGattServer implements BluetoothProfile {

        try {
            mService.sendNotification(mServerIf, device.getAddress(),
                    service.getType(), service.getInstanceId(),
                    new ParcelUuid(service.getUuid()), characteristic.getInstanceId(),
                    new ParcelUuid(characteristic.getUuid()), confirm,
                    characteristic.getInstanceId(), confirm,
                    characteristic.getValue());
        } catch (RemoteException e) {
            Log.e(TAG,"",e);
@@ -568,39 +587,10 @@ public final class BluetoothGattServer implements BluetoothProfile {
        if (DBG) Log.d(TAG, "addService() - service: " + service.getUuid());
        if (mService == null || mServerIf == 0) return false;

        mServices.add(service);
        mPendingService = service;

        try {
            mService.beginServiceDeclaration(mServerIf, service.getType(),
                service.getInstanceId(), service.getHandles(),
                new ParcelUuid(service.getUuid()), service.isAdvertisePreferred());

            List<BluetoothGattService> includedServices = service.getIncludedServices();
            for (BluetoothGattService includedService : includedServices) {
                mService.addIncludedService(mServerIf,
                    includedService.getType(),
                    includedService.getInstanceId(),
                    new ParcelUuid(includedService.getUuid()));
            }

            List<BluetoothGattCharacteristic> characteristics = service.getCharacteristics();
            for (BluetoothGattCharacteristic characteristic : characteristics) {
                int permission = ((characteristic.getKeySize() - 7) << 12)
                                    + characteristic.getPermissions();
                mService.addCharacteristic(mServerIf,
                    new ParcelUuid(characteristic.getUuid()),
                    characteristic.getProperties(), permission);

                List<BluetoothGattDescriptor> descriptors = characteristic.getDescriptors();
                for (BluetoothGattDescriptor descriptor: descriptors) {
                    permission = ((characteristic.getKeySize() - 7) << 12)
                                        + descriptor.getPermissions();
                    mService.addDescriptor(mServerIf,
                        new ParcelUuid(descriptor.getUuid()), permission);
                }
            }

            mService.endServiceDeclaration(mServerIf);
            mService.addService(mServerIf, service);
        } catch (RemoteException e) {
            Log.e(TAG,"",e);
            return false;
@@ -626,8 +616,7 @@ public final class BluetoothGattServer implements BluetoothProfile {
        if (intService == null) return false;

        try {
            mService.removeService(mServerIf, service.getType(),
                service.getInstanceId(), new ParcelUuid(service.getUuid()));
            mService.removeService(mServerIf, service.getInstanceId());
            mServices.remove(intService);
        } catch (RemoteException e) {
            Log.e(TAG,"",e);
+0 −1
Original line number Diff line number Diff line
@@ -250,7 +250,6 @@ public class BluetoothGattService implements Parcelable {

    /**
     * Force the instance ID.
     * This is needed for conformance testing only.
     * @hide
     */
    public void setInstanceId(int instanceId) {
Loading