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

Commit ff55ef02 authored by Rahul Arya's avatar Rahul Arya Committed by Gerrit Code Review
Browse files

Merge changes from topic "private-gatt-cts"

* changes:
  [Private GATT] Clear services when server closed
  [Private GATT] Add API to use a isolated GATT server
parents 9517abfe a956ece3
Loading
Loading
Loading
Loading
+13 −8
Original line number Original line Diff line number Diff line
@@ -2323,12 +2323,10 @@ static void ble_advertising_set_timeout_cb(uint8_t advertiser_id,
                               false, status);
                               false, status);
}
}


static void startAdvertisingSetNative(JNIEnv* env, jobject object,
static void startAdvertisingSetNative(
                                      jobject parameters, jbyteArray adv_data,
    JNIEnv* env, jobject object, jobject parameters, jbyteArray adv_data,
                                      jbyteArray scan_resp,
    jbyteArray scan_resp, jobject periodic_parameters, jbyteArray periodic_data,
                                      jobject periodic_parameters,
    jint duration, jint maxExtAdvEvents, jint reg_id, jint server_if) {
                                      jbyteArray periodic_data, jint duration,
                                      jint maxExtAdvEvents, jint reg_id) {
  if (!sGattIf) return;
  if (!sGattIf) return;


  jbyte* scan_resp_data = env->GetByteArrayElements(scan_resp, NULL);
  jbyte* scan_resp_data = env->GetByteArrayElements(scan_resp, NULL);
@@ -2352,16 +2350,23 @@ static void startAdvertisingSetNative(JNIEnv* env, jobject object,
      periodic_data_data, periodic_data_data + periodic_data_len);
      periodic_data_data, periodic_data_data + periodic_data_len);
  env->ReleaseByteArrayElements(periodic_data, periodic_data_data, JNI_ABORT);
  env->ReleaseByteArrayElements(periodic_data, periodic_data_data, JNI_ABORT);


  sGattIf->advertiser->StartAdvertisingSet(
  auto advertiser_id = sGattIf->advertiser->StartAdvertisingSet(
      reg_id, base::Bind(&ble_advertising_set_started_cb, reg_id), params,
      reg_id, base::Bind(&ble_advertising_set_started_cb, reg_id), params,
      data_vec, scan_resp_vec, periodicParams, periodic_data_vec, duration,
      data_vec, scan_resp_vec, periodicParams, periodic_data_vec, duration,
      maxExtAdvEvents, base::Bind(ble_advertising_set_timeout_cb));
      maxExtAdvEvents, base::Bind(ble_advertising_set_timeout_cb));

  // tie advertiser ID to server_if
  if (server_if != 0) {
    bluetooth::gatt::associate_server_with_advertiser(server_if, advertiser_id);
  }
}
}


static void stopAdvertisingSetNative(JNIEnv* env, jobject object,
static void stopAdvertisingSetNative(JNIEnv* env, jobject object,
                                     jint advertiser_id) {
                                     jint advertiser_id) {
  if (!sGattIf) return;
  if (!sGattIf) return;


  bluetooth::gatt::clear_advertiser(advertiser_id);

  sGattIf->advertiser->Unregister(advertiser_id);
  sGattIf->advertiser->Unregister(advertiser_id);
}
}


@@ -2638,7 +2643,7 @@ static JNINativeMethod sAdvertiseMethods[] = {
    {"cleanupNative", "()V", (void*)advertiseCleanupNative},
    {"cleanupNative", "()V", (void*)advertiseCleanupNative},
    {"startAdvertisingSetNative",
    {"startAdvertisingSetNative",
     "(Landroid/bluetooth/le/AdvertisingSetParameters;[B[BLandroid/bluetooth/"
     "(Landroid/bluetooth/le/AdvertisingSetParameters;[B[BLandroid/bluetooth/"
     "le/PeriodicAdvertisingParameters;[BIII)V",
     "le/PeriodicAdvertisingParameters;[BIIII)V",
     (void*)startAdvertisingSetNative},
     (void*)startAdvertisingSetNative},
    {"getOwnAddressNative", "(I)V", (void*)getOwnAddressNative},
    {"getOwnAddressNative", "(I)V", (void*)getOwnAddressNative},
    {"stopAdvertisingSetNative", "(I)V", (void*)stopAdvertisingSetNative},
    {"stopAdvertisingSetNative", "(I)V", (void*)stopAdvertisingSetNative},
+4 −3
Original line number Original line Diff line number Diff line
@@ -206,7 +206,7 @@ public class AdvertiseManager {


    void startAdvertisingSet(AdvertisingSetParameters parameters, AdvertiseData advertiseData,
    void startAdvertisingSet(AdvertisingSetParameters parameters, AdvertiseData advertiseData,
            AdvertiseData scanResponse, PeriodicAdvertisingParameters periodicParameters,
            AdvertiseData scanResponse, PeriodicAdvertisingParameters periodicParameters,
            AdvertiseData periodicData, int duration, int maxExtAdvEvents,
            AdvertiseData periodicData, int duration, int maxExtAdvEvents, int serverIf,
            IAdvertisingSetCallback callback) {
            IAdvertisingSetCallback callback) {
        AdvertisingSetDeathRecipient deathRecipient = new AdvertisingSetDeathRecipient(callback);
        AdvertisingSetDeathRecipient deathRecipient = new AdvertisingSetDeathRecipient(callback);
        IBinder binder = toBinder(callback);
        IBinder binder = toBinder(callback);
@@ -236,7 +236,8 @@ public class AdvertiseManager {
                    scanResponse, periodicParameters, periodicData, duration, maxExtAdvEvents);
                    scanResponse, periodicParameters, periodicData, duration, maxExtAdvEvents);


            startAdvertisingSetNative(parameters, advDataBytes, scanResponseBytes,
            startAdvertisingSetNative(parameters, advDataBytes, scanResponseBytes,
                    periodicParameters, periodicDataBytes, duration, maxExtAdvEvents, cbId);
                    periodicParameters, periodicDataBytes, duration, maxExtAdvEvents, cbId,
                    serverIf);


        } catch (IllegalArgumentException e) {
        } catch (IllegalArgumentException e) {
            try {
            try {
@@ -534,7 +535,7 @@ public class AdvertiseManager {
    private native void startAdvertisingSetNative(AdvertisingSetParameters parameters,
    private native void startAdvertisingSetNative(AdvertisingSetParameters parameters,
            byte[] advertiseData, byte[] scanResponse,
            byte[] advertiseData, byte[] scanResponse,
            PeriodicAdvertisingParameters periodicParameters, byte[] periodicData, int duration,
            PeriodicAdvertisingParameters periodicParameters, byte[] periodicData, int duration,
            int maxExtAdvEvents, int regId);
            int maxExtAdvEvents, int regId, int serverIf);


    private native void getOwnAddressNative(int advertiserId);
    private native void getOwnAddressNative(int advertiserId);


+11 −11
Original line number Original line Diff line number Diff line
@@ -25,7 +25,6 @@ import android.annotation.SuppressLint;
import android.app.AppOpsManager;
import android.app.AppOpsManager;
import android.app.PendingIntent;
import android.app.PendingIntent;
import android.app.Service;
import android.app.Service;
import android.content.Context;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGatt;
@@ -58,8 +57,9 @@ import android.companion.AssociationInfo;
import android.companion.CompanionDeviceManager;
import android.companion.CompanionDeviceManager;
import android.content.AttributionSource;
import android.content.AttributionSource;
import android.content.Intent;
import android.content.Intent;
import android.content.pm.PackageManager.PackageInfoFlags;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManager.PackageInfoFlags;
import android.content.res.Resources;
import android.net.MacAddress;
import android.net.MacAddress;
import android.os.Binder;
import android.os.Binder;
import android.os.Build;
import android.os.Build;
@@ -106,8 +106,6 @@ import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;
import java.util.function.Predicate;


import android.content.res.Resources;

/**
/**
 * Provides Bluetooth Gatt profile, as a service in
 * Provides Bluetooth Gatt profile, as a service in
 * the Bluetooth application.
 * the Bluetooth application.
@@ -1453,11 +1451,12 @@ public class GattService extends ProfileService {
        public void startAdvertisingSet(AdvertisingSetParameters parameters,
        public void startAdvertisingSet(AdvertisingSetParameters parameters,
                AdvertiseData advertiseData, AdvertiseData scanResponse,
                AdvertiseData advertiseData, AdvertiseData scanResponse,
                PeriodicAdvertisingParameters periodicParameters, AdvertiseData periodicData,
                PeriodicAdvertisingParameters periodicParameters, AdvertiseData periodicData,
                int duration, int maxExtAdvEvents, IAdvertisingSetCallback callback,
                int duration, int maxExtAdvEvents, int serverIf, IAdvertisingSetCallback callback,
                AttributionSource attributionSource, SynchronousResultReceiver receiver) {
                AttributionSource attributionSource, SynchronousResultReceiver receiver) {
            try {
            try {
                startAdvertisingSet(parameters, advertiseData, scanResponse, periodicParameters,
                startAdvertisingSet(parameters, advertiseData, scanResponse, periodicParameters,
                        periodicData, duration, maxExtAdvEvents, callback, attributionSource);
                        periodicData, duration, maxExtAdvEvents, serverIf, callback,
                        attributionSource);
                receiver.send(null);
                receiver.send(null);
            } catch (RuntimeException e) {
            } catch (RuntimeException e) {
                receiver.propagateException(e);
                receiver.propagateException(e);
@@ -1466,14 +1465,14 @@ public class GattService extends ProfileService {
        private void startAdvertisingSet(AdvertisingSetParameters parameters,
        private void startAdvertisingSet(AdvertisingSetParameters parameters,
                AdvertiseData advertiseData, AdvertiseData scanResponse,
                AdvertiseData advertiseData, AdvertiseData scanResponse,
                PeriodicAdvertisingParameters periodicParameters, AdvertiseData periodicData,
                PeriodicAdvertisingParameters periodicParameters, AdvertiseData periodicData,
                int duration, int maxExtAdvEvents, IAdvertisingSetCallback callback,
                int duration, int maxExtAdvEvents, int serverIf, IAdvertisingSetCallback callback,
                AttributionSource attributionSource) {
                AttributionSource attributionSource) {
            GattService service = getService();
            GattService service = getService();
            if (service == null) {
            if (service == null) {
                return;
                return;
            }
            }
            service.startAdvertisingSet(parameters, advertiseData, scanResponse, periodicParameters,
            service.startAdvertisingSet(parameters, advertiseData, scanResponse, periodicParameters,
                    periodicData, duration, maxExtAdvEvents, callback, attributionSource);
                    periodicData, duration, maxExtAdvEvents, serverIf, callback, attributionSource);
        }
        }


        @Override
        @Override
@@ -3470,17 +3469,18 @@ public class GattService extends ProfileService {
    @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
    @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
    void startAdvertisingSet(AdvertisingSetParameters parameters, AdvertiseData advertiseData,
    void startAdvertisingSet(AdvertisingSetParameters parameters, AdvertiseData advertiseData,
            AdvertiseData scanResponse, PeriodicAdvertisingParameters periodicParameters,
            AdvertiseData scanResponse, PeriodicAdvertisingParameters periodicParameters,
            AdvertiseData periodicData, int duration, int maxExtAdvEvents,
            AdvertiseData periodicData, int duration, int maxExtAdvEvents, int serverIf,
            IAdvertisingSetCallback callback, AttributionSource attributionSource) {
            IAdvertisingSetCallback callback, AttributionSource attributionSource) {
        if (!Utils.checkAdvertisePermissionForDataDelivery(
        if (!Utils.checkAdvertisePermissionForDataDelivery(
                this, attributionSource, "GattService startAdvertisingSet")) {
                this, attributionSource, "GattService startAdvertisingSet")) {
            return;
            return;
        }
        }
        if (parameters.getOwnAddressType() != AdvertisingSetParameters.ADDRESS_TYPE_DEFAULT) {
        if (parameters.getOwnAddressType() != AdvertisingSetParameters.ADDRESS_TYPE_DEFAULT
                || serverIf != 0) {
            Utils.enforceBluetoothPrivilegedPermission(this);
            Utils.enforceBluetoothPrivilegedPermission(this);
        }
        }
        mAdvertiseManager.startAdvertisingSet(parameters, advertiseData, scanResponse,
        mAdvertiseManager.startAdvertisingSet(parameters, advertiseData, scanResponse,
                periodicParameters, periodicData, duration, maxExtAdvEvents, callback);
                periodicParameters, periodicData, duration, maxExtAdvEvents, serverIf, callback);
    }
    }


    @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
    @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
+1 −1
Original line number Original line Diff line number Diff line
@@ -88,7 +88,7 @@ public class AdvertiseManagerTest {
        doNothing().when(mBinder).linkToDeath(any(), eq(0));
        doNothing().when(mBinder).linkToDeath(any(), eq(0));


        mAdvertiseManager.startAdvertisingSet(parameters, advertiseData, scanResponse,
        mAdvertiseManager.startAdvertisingSet(parameters, advertiseData, scanResponse,
                periodicParameters, periodicData, duration, maxExtAdvEvents, mCallback);
                periodicParameters, periodicData, duration, maxExtAdvEvents, 0, mCallback);


        mAdvertiserId = AdvertiseManager.sTempRegistrationId;
        mAdvertiserId = AdvertiseManager.sTempRegistrationId;
    }
    }
+4 −3
Original line number Original line Diff line number Diff line
@@ -589,15 +589,16 @@ public class GattServiceBinderTest {
        AdvertiseData periodicData = new AdvertiseData.Builder().build();
        AdvertiseData periodicData = new AdvertiseData.Builder().build();
        int duration = 1;
        int duration = 1;
        int maxExtAdvEvents = 2;
        int maxExtAdvEvents = 2;
        int serverIf = 3;
        IAdvertisingSetCallback callback = mock(IAdvertisingSetCallback.class);
        IAdvertisingSetCallback callback = mock(IAdvertisingSetCallback.class);


        mBinder.startAdvertisingSet(parameters, advertiseData, scanResponse, periodicParameters,
        mBinder.startAdvertisingSet(parameters, advertiseData, scanResponse, periodicParameters,
                periodicData, duration, maxExtAdvEvents, callback,
                periodicData, duration, maxExtAdvEvents, serverIf, callback,
                mAttributionSource, SynchronousResultReceiver.get());
                mAttributionSource, SynchronousResultReceiver.get());


        verify(mService).startAdvertisingSet(parameters, advertiseData, scanResponse,
        verify(mService).startAdvertisingSet(parameters, advertiseData, scanResponse,
                periodicParameters, periodicData, duration, maxExtAdvEvents, callback,
                periodicParameters, periodicData, duration, maxExtAdvEvents,
                mAttributionSource);
                serverIf, callback, mAttributionSource);
    }
    }


    @Test
    @Test
Loading