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

Commit 873ee5e5 authored by Jakub Pawlowski's avatar Jakub Pawlowski Committed by Gerrit Code Review
Browse files

Merge "Move startAdvertising() logic into native code (1/3)"

parents b9549398 288cd5c1
Loading
Loading
Loading
Loading
+36 −41
Original line number Diff line number Diff line
@@ -153,8 +153,7 @@ static jmethodID method_onScanFilterConfig;
static jmethodID method_onScanFilterParamsConfigured;
static jmethodID method_onScanFilterEnableDisabled;
static jmethodID method_onAdvertiserRegistered;
static jmethodID method_onMultiAdvSetParams;
static jmethodID method_onMultiAdvSetAdvData;
static jmethodID method_onAdvertiserStarted;
static jmethodID method_onMultiAdvEnable;
static jmethodID method_onClientCongestion;
static jmethodID method_onBatchScanStorageConfigured;
@@ -599,25 +598,19 @@ void ble_advertiser_register_cb(bt_uuid_t uuid, uint8_t advertiser_id, uint8_t s
                                 status, advertiser_id, UUID_PARAMS(&uuid));
}

void ble_advertiser_set_params_cb(uint8_t advertiser_id, uint8_t status)
{
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvSetParams, status, advertiser_id);
}

void ble_advertiser_setadv_data_cb(uint8_t advertiser_id, uint8_t status)
void ble_advertiser_enable_cb(bool enable, uint8_t advertiser_id, uint8_t status)
{
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvSetAdvData, status, advertiser_id);
    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvEnable, status, advertiser_id, enable);
}

void ble_advertiser_enable_cb(bool enable, uint8_t advertiser_id, uint8_t status)
void ble_advertiser_start_cb(uint8_t advertiser_id, uint8_t status)
{
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvEnable, status, advertiser_id, enable);
    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAdvertiserStarted,
                                 status, advertiser_id);
}

/**
@@ -834,8 +827,7 @@ static void classInitNative(JNIEnv* env, jclass clazz) {
    method_onScanFilterParamsConfigured = env->GetMethodID(clazz, "onScanFilterParamsConfigured", "(IIII)V");
    method_onScanFilterEnableDisabled = env->GetMethodID(clazz, "onScanFilterEnableDisabled", "(III)V");
    method_onAdvertiserRegistered = env->GetMethodID(clazz, "onAdvertiserRegistered", "(IIJJ)V");
    method_onMultiAdvSetParams = env->GetMethodID(clazz, "onAdvertiseParamsSet", "(II)V");
    method_onMultiAdvSetAdvData = env->GetMethodID(clazz, "onAdvertiseDataSet", "(II)V");
    method_onAdvertiserStarted = env->GetMethodID(clazz, "onAdvertiserStarted", "(II)V");
    method_onMultiAdvEnable = env->GetMethodID(clazz, "onAdvertiseInstanceEnabled", "(IIZ)V");
    method_onClientCongestion = env->GetMethodID(clazz, "onClientCongestion", "(IZ)V");
    method_onBatchScanStorageConfigured = env->GetMethodID(clazz, "onBatchScanStorageConfigured", "(II)V");
@@ -1348,6 +1340,34 @@ static void registerAdvertiserNative(JNIEnv* env, jobject object,
    sGattIf->advertiser->RegisterAdvertiser(base::Bind(&ble_advertiser_register_cb, uuid));
}

static void startAdvertiserNative(JNIEnv *env, jobject object, jint advertiser_id,
                                  jint min_interval, jint max_interval, jint adv_type, jint chnl_map,
                                  jint tx_power, jbyteArray adv_data, jbyteArray scan_resp, jint timeout_s) {
    if (!sGattIf) return;

    AdvertiseParameters params;
    params.min_interval = min_interval;
    params.max_interval = max_interval;
    params.adv_type = adv_type;
    params.channel_map = chnl_map;
    params.tx_power = tx_power;

    jbyte* adv_data_data = env->GetByteArrayElements(adv_data, NULL);
    uint16_t adv_data_len = (uint16_t) env->GetArrayLength(adv_data);
    vector<uint8_t> data_vec(adv_data_data, adv_data_data + adv_data_len);
    env->ReleaseByteArrayElements(adv_data, adv_data_data, JNI_ABORT);

    jbyte* scan_resp_data = env->GetByteArrayElements(scan_resp, NULL);
    uint16_t scan_resp_len = (uint16_t) env->GetArrayLength(scan_resp);
    vector<uint8_t> scan_resp_vec(scan_resp_data, scan_resp_data + scan_resp_len);
    env->ReleaseByteArrayElements(scan_resp, scan_resp_data, JNI_ABORT);

    sGattIf->advertiser->StartAdvertising(advertiser_id,
        base::Bind(&ble_advertiser_start_cb, advertiser_id),
        params, data_vec, scan_resp_vec, timeout_s,
        base::Bind(&ble_advertiser_enable_cb, false,
        advertiser_id));
}
static void unregisterAdvertiserNative(JNIEnv* env, jobject object, jint advertiser_id)
{
    if (!sGattIf) return;
@@ -1366,30 +1386,6 @@ static void gattClientEnableAdvNative(JNIEnv* env, jobject object, jint advertis
        base::Bind(&ble_advertiser_enable_cb, false, advertiser_id));
}

static void gattClientSetAdvParamsNative(JNIEnv* env, jobject object, jint advertiser_id,
       jint min_interval, jint max_interval, jint adv_type, jint chnl_map, jint tx_power)
{
    if (!sGattIf) return;

    sGattIf->advertiser->SetParameters(
        advertiser_id, min_interval, max_interval, adv_type, chnl_map, tx_power,
        base::Bind(&ble_advertiser_set_params_cb, advertiser_id));
}

static void gattClientSetAdvDataNative(JNIEnv* env, jobject object, jint advertiser_id,
        jboolean set_scan_rsp, jbyteArray data)
{
    if (!sGattIf) return;
    jbyte* data_data = env->GetByteArrayElements(data, NULL);
    uint16_t data_len = (uint16_t) env->GetArrayLength(data);
    vector<uint8_t> data_vec(data_data, data_data + data_len);
    env->ReleaseByteArrayElements(data, data_data, JNI_ABORT);

    sGattIf->advertiser->SetData(
        advertiser_id, set_scan_rsp, std::move(data_vec),
        base::Bind(&ble_advertiser_setadv_data_cb, advertiser_id));
}

static void gattClientConfigBatchScanStorageNative(JNIEnv* env, jobject object, jint client_if,
            jint max_full_reports_percent, jint max_trunc_reports_percent,
            jint notify_threshold_level_percent)
@@ -1625,9 +1621,8 @@ static void gattTestNative(JNIEnv *env, jobject object, jint command,
static JNINativeMethod sAdvertiseMethods[] = {
    {"registerAdvertiserNative", "(JJ)V", (void *) registerAdvertiserNative},
    {"unregisterAdvertiserNative", "(I)V", (void *) unregisterAdvertiserNative},
    {"gattClientSetParamsNative", "(IIIIII)V", (void *) gattClientSetAdvParamsNative},
    {"gattClientSetAdvDataNative", "(IZ[B)V", (void *) gattClientSetAdvDataNative},
    {"gattClientEnableAdvNative", "(IZI)V", (void *) gattClientEnableAdvNative},
    {"startAdvertiserNative", "(IIIIII[B[BI)V", (void *) startAdvertiserNative},
};

// JNI functions defined in ScanManager class.
+26 −57
Original line number Diff line number Diff line
@@ -277,25 +277,24 @@ class AdvertiseManager {

        boolean startAdverising(AdvertiseClient client) {
            logd("starting advertising");

            int advertiserId = client.advertiserId;
            int minAdvertiseUnit = (int) getAdvertisingIntervalUnit(client.settings);
            int maxAdvertiseUnit = minAdvertiseUnit + ADVERTISING_INTERVAL_DELTA_UNIT;
            int advertiseEventType = getAdvertisingEventType(client);
            int txPowerLevel = getTxPowerLevel(client.settings);

            byte [] adv_data = advertiseDataToBytes(client.advertiseData);
            byte [] scan_resp_data = advertiseDataToBytes(client.scanResponse);

            int advertiseTimeoutSeconds = (int) TimeUnit.MILLISECONDS.toSeconds(
                    client.settings.getTimeout());

            resetCountDownLatch();
            setAdvertisingParameters(client);
            if (!waitForCallback()) {
                return false;
            }
            resetCountDownLatch();
            setAdvertisingData(client, client.advertiseData, false);
            if (!waitForCallback()) {
                return false;
            }
            if (client.scanResponse != null) {
                resetCountDownLatch();
                setAdvertisingData(client, client.scanResponse, true);
                if (!waitForCallback()) {
                    return false;
                }
            }
            resetCountDownLatch();
            enableAdvertising(client, true);

            startAdvertiserNative(advertiserId, minAdvertiseUnit, maxAdvertiseUnit,
                    advertiseEventType, ADVERTISING_CHANNEL_ALL, txPowerLevel, adv_data,
                    scan_resp_data, advertiseTimeoutSeconds);
            if (!waitForCallback()) {
                return false;
            }
@@ -320,29 +319,6 @@ class AdvertiseManager {
            }
        }

        private void setAdvertisingParameters(AdvertiseClient client) {
            int advertiserId = client.advertiserId;
            int minAdvertiseUnit = (int) getAdvertisingIntervalUnit(client.settings);
            int maxAdvertiseUnit = minAdvertiseUnit + ADVERTISING_INTERVAL_DELTA_UNIT;
            int advertiseEventType = getAdvertisingEventType(client);
            int txPowerLevel = getTxPowerLevel(client.settings);

            // if only legacy advertising is supported, the TX power settings wont take effect
            gattClientSetParamsNative(
                        advertiserId,
                        minAdvertiseUnit, maxAdvertiseUnit,
                        advertiseEventType,
                        ADVERTISING_CHANNEL_ALL,
                        txPowerLevel);
        }

        private void enableAdvertising(AdvertiseClient client, boolean enable) {
            int advertiserId = client.advertiserId;
            int advertiseTimeoutSeconds = (int) TimeUnit.MILLISECONDS.toSeconds(
                    client.settings.getTimeout());
            gattClientEnableAdvNative(advertiserId, enable, advertiseTimeoutSeconds);
        }

        private static final int DEVICE_NAME_MAX = 18;

        private static final int COMPLETE_LIST_16_BIT_SERVICE_UUIDS = 0X03;
@@ -357,6 +333,10 @@ class AdvertiseManager {
        private static final int MANUFACTURER_SPECIFIC_DATA = 0XFF;

        private byte[] advertiseDataToBytes(AdvertiseData data) {

            if (data == null)
                return new byte[0];

            // Flags are added by lower layers of the stack, only if needed;
            // no need to add them here.

@@ -482,16 +462,6 @@ class AdvertiseManager {
            return ret.toByteArray();
        }

        private void setAdvertisingData(AdvertiseClient client, AdvertiseData data,
                boolean isScanResponse) {
            if (data == null) {
                return;
            }

            byte [] data_out = advertiseDataToBytes(data);
            gattClientSetAdvDataNative(client.advertiserId, isScanResponse, data_out);
        }

        // Convert settings tx power level to stack tx power level.
        private int getTxPowerLevel(AdvertiseSettings settings) {
            switch (settings.getTxPowerLevel()) {
@@ -541,14 +511,13 @@ class AdvertiseManager {

        private native void unregisterAdvertiserNative(int advertiserId);

        private native void gattClientSetParamsNative(int advertiserId,
                int min_interval, int max_interval, int adv_type, int chnl_map, int tx_power);

        private native void gattClientSetAdvDataNative(int advertiserId,
                boolean set_scan_rsp, byte[] data);

        private native void gattClientEnableAdvNative(int advertiserId,
                boolean enable, int timeout_s);

        private native void startAdvertiserNative(int advertiserId,
                int min_interval, int max_interval, int adv_type, int chnl_map, int tx_power,
                byte[] adv_data, byte[] scan_resp_data, int timeout_s);

    }

    private void logd(String s) {
+15 −10
Original line number Diff line number Diff line
@@ -1185,18 +1185,23 @@ public class GattService extends ProfileService {
        }
    }

    // Callback when advertise parameters are set.
    void onAdvertiseParamsSet(int status, int advertiserId) {
        if (DBG) Log.d(TAG, "onAdvertiseParamsSet() - advertiserId=" + advertiserId
            + ", status=" + status);
        mAdvertiseManager.callbackDone(advertiserId, status);
    }
    void onAdvertiserStarted(int status, int advertiserId)
            throws RemoteException {
        if (DBG) Log.d(TAG, "onAdvertiserStarted() - advertiserId=" + advertiserId +
            ", status=" + status);

    // Callback when advertise data or scan response is set.
    void onAdvertiseDataSet(int status, int advertiserId) {
        if (DBG) Log.d(TAG, "onAdvertiseDataSet() - advertiserId=" + advertiserId
            + ", status=" + status);
        mAdvertiseManager.callbackDone(advertiserId, status);

        AdvertiserMap.App app = mAdvertiserMap.getById(advertiserId);
        if (app != null) {
            if (status == 0) {
                app.callback.onMultiAdvertiseCallback(AdvertiseCallback.ADVERTISE_SUCCESS,
                        true, null);
            } else {
                app.callback.onMultiAdvertiseCallback(
                        AdvertiseCallback.ADVERTISE_FAILED_INTERNAL_ERROR, true, null);
            }
        }
    }

    // Callback when advertise instance is enabled.