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

Commit 0c750f22 authored by Rahul Arya's avatar Rahul Arya
Browse files

[Private GATT] Add API to use a isolated GATT server

Associated / unassociates a server with an advertiser, plumbs
logic into Rust.

Bug: 255880936
Test: CTS
Change-Id: I86a29d0bca54f4f99a2f6fb3c11c5a9384a29f71
parent 0645c96b
Loading
Loading
Loading
Loading
+13 −8
Original line number Diff line number Diff line
@@ -2255,12 +2255,10 @@ static void ble_advertising_set_timeout_cb(uint8_t advertiser_id,
                               false, status);
}

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

  jbyte* scan_resp_data = env->GetByteArrayElements(scan_resp, NULL);
@@ -2284,16 +2282,23 @@ static void startAdvertisingSetNative(JNIEnv* env, jobject object,
      periodic_data_data, periodic_data_data + periodic_data_len);
  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,
      data_vec, scan_resp_vec, periodicParams, periodic_data_vec, duration,
      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,
                                     jint advertiser_id) {
  if (!sGattIf) return;

  bluetooth::gatt::clear_advertiser(advertiser_id);

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

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

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

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

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

    private native void getOwnAddressNative(int advertiserId);

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

import android.content.res.Resources;

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

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

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

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

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

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

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

    @Test
Loading