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

Commit cb76e486 authored by Jakub Pawlowski's avatar Jakub Pawlowski
Browse files

Bluetooth 5 advertising duration refactoring (3/4)

Expose both duration and maximum extended advertising events to limit
advertising time.

Test: manual
Bug: 30622771
Change-Id: I81ee59086f40b64d07eb43b32f1a59a6856ab886
(cherry picked from commit de068ddbc7bc4de68b178c5e32a44180ddf257a0)
parent c5870267
Loading
Loading
Loading
Loading
+12 −12
Original line number Diff line number Diff line
@@ -1798,8 +1798,8 @@ static void startAdvertisingSetNative(JNIEnv* env, jobject object,
                                      jobject parameters, jbyteArray adv_data,
                                      jbyteArray scan_resp,
                                      jobject periodic_parameters,
                                      jbyteArray periodic_data, jint timeout,
                                      jint reg_id) {
                                      jbyteArray periodic_data, jint duration,
                                      jint maxExtAdvEvents, jint reg_id) {
  if (!sGattIf) return;

  jbyte* scan_resp_data = env->GetByteArrayElements(scan_resp, NULL);
@@ -1812,8 +1812,6 @@ static void startAdvertisingSetNative(JNIEnv* env, jobject object,
  PeriodicAdvertisingParameters periodicParams =
      parsePeriodicParams(env, periodic_parameters);

  int timeout_s = (int)timeout / 1000;

  jbyte* adv_data_data = env->GetByteArrayElements(adv_data, NULL);
  uint16_t adv_data_len = (uint16_t)env->GetArrayLength(adv_data);
  std::vector<uint8_t> data_vec(adv_data_data, adv_data_data + adv_data_len);
@@ -1827,8 +1825,8 @@ static void startAdvertisingSetNative(JNIEnv* env, jobject object,

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

static void stopAdvertisingSetNative(JNIEnv* env, jobject object,
@@ -1856,12 +1854,13 @@ static void enableSetCb(uint8_t advertiser_id, bool enable, uint8_t status) {

static void enableAdvertisingSetNative(JNIEnv* env, jobject object,
                                       jint advertiser_id, jboolean enable,
                                       jint timeout) {
                                       jint duration, jint maxExtAdvEvents) {
  if (!sGattIf) return;

  sGattIf->advertiser->Enable(
      advertiser_id, enable, base::Bind(&enableSetCb, advertiser_id, enable),
      timeout / 1000, base::Bind(&enableSetCb, advertiser_id, false));
  sGattIf->advertiser->Enable(advertiser_id, enable,
                              base::Bind(&enableSetCb, advertiser_id, enable),
                              duration, maxExtAdvEvents,
                              base::Bind(&enableSetCb, advertiser_id, false));
}

static void setAdvertisingDataNative(JNIEnv* env, jobject object,
@@ -2056,10 +2055,11 @@ static JNINativeMethod sAdvertiseMethods[] = {
    {"cleanupNative", "()V", (void*)advertiseCleanupNative},
    {"startAdvertisingSetNative",
     "(Landroid/bluetooth/le/AdvertisingSetParameters;[B[BLandroid/bluetooth/"
     "le/PeriodicAdvertisingParameters;[BII)V",
     "le/PeriodicAdvertisingParameters;[BIII)V",
     (void*)startAdvertisingSetNative},
    {"stopAdvertisingSetNative", "(I)V", (void*)stopAdvertisingSetNative},
    {"enableAdvertisingSetNative", "(IZI)V", (void*)enableAdvertisingSetNative},
    {"enableAdvertisingSetNative", "(IZII)V",
     (void*)enableAdvertisingSetNative},
    {"setAdvertisingDataNative", "(I[B)V", (void*)setAdvertisingDataNative},
    {"setScanResponseDataNative", "(I[B)V", (void*)setScanResponseDataNative},
    {"setAdvertisingParametersNative",
+9 −7
Original line number Diff line number Diff line
@@ -179,7 +179,8 @@ class AdvertiseManager {

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

        logd("startAdvertisingSet() - reg_id=" + cb_id + ", callback: " + binder);
        startAdvertisingSetNative(parameters, adv_data, scan_response, periodicParameters,
                periodic_data, timeout, cb_id);
                periodic_data, duration, maxExtAdvEvents, cb_id);
    }

    void stopAdvertisingSet(IAdvertisingSetCallback callback) {
@@ -223,8 +224,8 @@ class AdvertiseManager {
        stopAdvertisingSetNative(advertiser_id);
    }

    void enableAdvertisingSet(int advertiserId, boolean enable, int timeout) {
        enableAdvertisingSetNative(advertiserId, enable, timeout);
    void enableAdvertisingSet(int advertiserId, boolean enable, int duration, int maxExtAdvEvents) {
        enableAdvertisingSetNative(advertiserId, enable, duration, maxExtAdvEvents);
    }

    void setAdvertisingData(int advertiserId, AdvertiseData data) {
@@ -358,10 +359,11 @@ class AdvertiseManager {
    private native void cleanupNative();
    private native void startAdvertisingSetNative(AdvertisingSetParameters parameters,
            byte[] advertiseData, byte[] scanResponse,
            PeriodicAdvertisingParameters periodicParameters, byte[] periodicData, int timeout,
            int reg_id);
            PeriodicAdvertisingParameters periodicParameters, byte[] periodicData, int duration,
            int maxExtAdvEvents, int reg_id);
    private native void stopAdvertisingSetNative(int advertiser_id);
    private native void enableAdvertisingSetNative(int advertiserId, boolean enable, int timeout);
    private native void enableAdvertisingSetNative(
            int advertiserId, boolean enable, int duration, int maxExtAdvEvents);
    private native void setAdvertisingDataNative(int advertiserId, byte[] data);
    private native void setScanResponseDataNative(int advertiserId, byte[] data);
    private native void setAdvertisingParametersNative(
+10 −8
Original line number Diff line number Diff line
@@ -556,11 +556,11 @@ public class GattService extends ProfileService {
        public void startAdvertisingSet(AdvertisingSetParameters parameters,
                AdvertiseData advertiseData, AdvertiseData scanResponse,
                PeriodicAdvertisingParameters periodicParameters, AdvertiseData periodicData,
                int timeout, IAdvertisingSetCallback callback) {
                int duration, int maxExtAdvEvents, IAdvertisingSetCallback callback) {
            GattService service = getService();
            if (service == null) return;
            service.startAdvertisingSet(parameters, advertiseData, scanResponse, periodicParameters,
                    periodicData, timeout, callback);
                    periodicData, duration, maxExtAdvEvents, callback);
        }

        public void stopAdvertisingSet(IAdvertisingSetCallback callback) {
@@ -569,10 +569,11 @@ public class GattService extends ProfileService {
            service.stopAdvertisingSet(callback);
        }

        public void enableAdvertisingSet(int advertiserId, boolean enable, int timeout) {
        public void enableAdvertisingSet(
                int advertiserId, boolean enable, int duration, int maxExtAdvEvents) {
            GattService service = getService();
            if (service == null) return;
            service.enableAdvertisingSet(advertiserId, enable, timeout);
            service.enableAdvertisingSet(advertiserId, enable, duration, maxExtAdvEvents);
        }

        public void setAdvertisingData(int advertiserId, AdvertiseData data) {
@@ -1506,10 +1507,11 @@ public class GattService extends ProfileService {
     *************************************************************************/
    void startAdvertisingSet(AdvertisingSetParameters parameters, AdvertiseData advertiseData,
            AdvertiseData scanResponse, PeriodicAdvertisingParameters periodicParameters,
            AdvertiseData periodicData, int timeout, IAdvertisingSetCallback callback) {
            AdvertiseData periodicData, int duration, int maxExtAdvEvents,
            IAdvertisingSetCallback callback) {
        enforceAdminPermission();
        mAdvertiseManager.startAdvertisingSet(parameters, advertiseData, scanResponse,
                periodicParameters, periodicData, timeout, callback);
                periodicParameters, periodicData, duration, maxExtAdvEvents, callback);
    }

    void stopAdvertisingSet(IAdvertisingSetCallback callback) {
@@ -1517,9 +1519,9 @@ public class GattService extends ProfileService {
        mAdvertiseManager.stopAdvertisingSet(callback);
    }

    void enableAdvertisingSet(int advertiserId, boolean enable, int timeout) {
    void enableAdvertisingSet(int advertiserId, boolean enable, int duration, int maxExtAdvEvents) {
        enforceAdminPermission();
        mAdvertiseManager.enableAdvertisingSet(advertiserId, enable, timeout);
        mAdvertiseManager.enableAdvertisingSet(advertiserId, enable, duration, maxExtAdvEvents);
    }

    void setAdvertisingData(int advertiserId, AdvertiseData data) {
+0 −2
Original line number Diff line number Diff line
@@ -17,9 +17,7 @@
package com.android.bluetooth.gatt;

import android.bluetooth.le.AdvertiseData;
import android.bluetooth.le.AdvertisingSetParameters;
import android.bluetooth.le.IPeriodicAdvertisingCallback;
import android.bluetooth.le.PeriodicAdvertisingParameters;
import android.bluetooth.le.PeriodicAdvertisingReport;
import android.bluetooth.le.ScanRecord;
import android.bluetooth.le.ScanResult;