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

Commit 7d5f2abf authored by Satya Calloji's avatar Satya Calloji
Browse files

OnFound/OnLost feature JNI changes based on BLE spec v0.90.

Bug: 19609671
Change-Id: I2ac0687ea53616287d82fe47f256686619c0998a
parent 0d2a9efe
Loading
Loading
Loading
Loading
+95 −22
Original line number Diff line number Diff line
@@ -171,8 +171,11 @@ static jmethodID method_onBatchScanStorageConfigured;
static jmethodID method_onBatchScanStartStopped;
static jmethodID method_onBatchScanReports;
static jmethodID method_onBatchScanThresholdCrossed;

static jmethodID method_CreateonTrackAdvFoundLostObject;
static jmethodID method_onTrackAdvFoundLost;


/**
 * Server callback methods
 */
@@ -549,18 +552,42 @@ void btgattc_batchscan_threshold_cb(int client_if)
    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
}

void btgattc_track_adv_event_cb(int client_if, int filt_index, int addr_type,
                                        bt_bdaddr_t* bda, int adv_state)
void btgattc_track_adv_event_cb(btgatt_track_adv_info_t *p_adv_track_info)
{
    CHECK_CALLBACK_ENV
    char c_address[32];
    jobject trackadv_obj = NULL;

    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
        bda->address[0], bda->address[1], bda->address[2],
        bda->address[3], bda->address[4], bda->address[5]);
        p_adv_track_info->bd_addr.address[0], p_adv_track_info->bd_addr.address[1],
        p_adv_track_info->bd_addr.address[2], p_adv_track_info->bd_addr.address[3],
        p_adv_track_info->bd_addr.address[4], p_adv_track_info->bd_addr.address[5]);

    jstring address = sCallbackEnv->NewStringUTF(c_address);
    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onTrackAdvFoundLost,
                                    filt_index, addr_type, address, adv_state, client_if);

    jbyteArray jb_adv_pkt = sCallbackEnv->NewByteArray(p_adv_track_info->adv_pkt_len);
    jbyteArray jb_scan_rsp = sCallbackEnv->NewByteArray(p_adv_track_info->scan_rsp_len);

    sCallbackEnv->SetByteArrayRegion(jb_adv_pkt, 0, p_adv_track_info->adv_pkt_len,
                                     (jbyte *) p_adv_track_info->p_adv_pkt_data);

    sCallbackEnv->SetByteArrayRegion(jb_scan_rsp, 0, p_adv_track_info->scan_rsp_len,
                                     (jbyte *) p_adv_track_info->p_scan_rsp_data);

    trackadv_obj = sCallbackEnv->CallObjectMethod(mCallbacksObj, method_CreateonTrackAdvFoundLostObject,
                    p_adv_track_info->client_if, p_adv_track_info->adv_pkt_len, jb_adv_pkt,
                    p_adv_track_info->scan_rsp_len, jb_scan_rsp, p_adv_track_info->filt_index,
                    p_adv_track_info->advertiser_state, p_adv_track_info->advertiser_info_present,
                    address, p_adv_track_info->addr_type, p_adv_track_info->tx_power,
                    p_adv_track_info->rssi_value, p_adv_track_info->time_stamp);

    if (NULL != trackadv_obj)
        sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onTrackAdvFoundLost, trackadv_obj);

    sCallbackEnv->DeleteLocalRef(address);
    sCallbackEnv->DeleteLocalRef(jb_adv_pkt);
    sCallbackEnv->DeleteLocalRef(jb_scan_rsp);

    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
}

@@ -849,7 +876,9 @@ static void classInitNative(JNIEnv* env, jclass clazz) {
    method_onBatchScanStartStopped = env->GetMethodID(clazz, "onBatchScanStartStopped", "(III)V");
    method_onBatchScanReports = env->GetMethodID(clazz, "onBatchScanReports", "(IIII[B)V");
    method_onBatchScanThresholdCrossed = env->GetMethodID(clazz, "onBatchScanThresholdCrossed", "(I)V");
    method_onTrackAdvFoundLost = env->GetMethodID(clazz, "onTrackAdvFoundLost", "(IILjava/lang/String;II)V");
    method_CreateonTrackAdvFoundLostObject = env->GetMethodID(clazz, "CreateonTrackAdvFoundLostObject", "(II[BI[BIIILjava/lang/String;IIII)Lcom/android/bluetooth/gatt/AdvtFilterOnFoundOnLostInfo;");
    method_onTrackAdvFoundLost = env->GetMethodID(clazz, "onTrackAdvFoundLost",
                                                         "(Lcom/android/bluetooth/gatt/AdvtFilterOnFoundOnLostInfo;)V");

    // Server callbacks

@@ -1285,18 +1314,55 @@ static void gattSetScanParametersNative(JNIEnv* env, jobject object,
    sGattIf->client->set_scan_parameters(scan_interval_unit, scan_window_unit);
}

static void gattClientScanFilterParamAddNative(JNIEnv* env, jobject object,
        jint client_if, jint filt_index,
        jint feat_seln, jint list_logic_type, jint filt_logic_type,
        jint rssi_high_thres, jint rssi_low_thres,
        jint dely_mode, jint found_timeout, jint lost_timeout, jint found_timeout_cnt)
static void gattClientScanFilterParamAddNative(JNIEnv* env, jobject object, jobject params)
{
    if (!sGattIf) return;
    const int add_scan_filter_params_action = 0;
    sGattIf->client->scan_filter_param_setup(client_if, add_scan_filter_params_action, filt_index,
            feat_seln, list_logic_type, filt_logic_type,
            rssi_high_thres, rssi_low_thres,
            dely_mode, found_timeout, lost_timeout, found_timeout_cnt);
    btgatt_filt_param_setup_t filt_params;

    jmethodID methodId = 0;
    jclass filtparam = env->GetObjectClass(params);

    methodId = env->GetMethodID(filtparam, "getClientIf", "()I");
    filt_params.client_if = env->CallIntMethod(params, methodId);;

    filt_params.action = add_scan_filter_params_action;

    methodId = env->GetMethodID(filtparam, "getFiltIndex", "()I");
    filt_params.filt_index = env->CallIntMethod(params, methodId);;

    methodId = env->GetMethodID(filtparam, "getFeatSeln", "()I");
    filt_params.feat_seln = env->CallIntMethod(params, methodId);;

    methodId = env->GetMethodID(filtparam, "getListLogicType", "()I");
    filt_params.list_logic_type = env->CallIntMethod(params, methodId);

    methodId = env->GetMethodID(filtparam, "getFiltLogicType", "()I");
    filt_params.filt_logic_type = env->CallIntMethod(params, methodId);

    methodId = env->GetMethodID(filtparam, "getDelyMode", "()I");
    filt_params.dely_mode = env->CallIntMethod(params, methodId);

    methodId = env->GetMethodID(filtparam, "getFoundTimeout", "()I");
    filt_params.found_timeout = env->CallIntMethod(params, methodId);

    methodId = env->GetMethodID(filtparam, "getLostTimeout", "()I");
    filt_params.lost_timeout = env->CallIntMethod(params, methodId);

    methodId = env->GetMethodID(filtparam, "getFoundTimeOutCnt", "()I");
    filt_params.found_timeout_cnt = env->CallIntMethod(params, methodId);

    methodId = env->GetMethodID(filtparam, "getNumOfTrackEntries", "()I");
    filt_params.num_of_tracking_entries = env->CallIntMethod(params, methodId);

    methodId = env->GetMethodID(filtparam, "getRSSIHighValue", "()I");
    filt_params.rssi_high_thres = env->CallIntMethod(params, methodId);

    methodId = env->GetMethodID(filtparam, "getRSSILowValue", "()I");
    filt_params.rssi_low_thres = env->CallIntMethod(params, methodId);

    env->DeleteLocalRef(filtparam);
    sGattIf->client->scan_filter_param_setup(filt_params);
}

static void gattClientScanFilterParamDeleteNative(JNIEnv* env, jobject object,
@@ -1304,16 +1370,23 @@ static void gattClientScanFilterParamDeleteNative(JNIEnv* env, jobject object,
{
    if (!sGattIf) return;
    const int delete_scan_filter_params_action = 1;
    sGattIf->client->scan_filter_param_setup(client_if, delete_scan_filter_params_action,
            filt_index, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    btgatt_filt_param_setup_t filt_params;
    memset(&filt_params, 0, sizeof(btgatt_filt_param_setup_t));
    filt_params.client_if = client_if;
    filt_params.action = delete_scan_filter_params_action;
    filt_params.filt_index = filt_index;
    sGattIf->client->scan_filter_param_setup(filt_params);
}

static void gattClientScanFilterParamClearAllNative(JNIEnv* env, jobject object, jint client_if)
{
    if (!sGattIf) return;
    const int clear_scan_filter_params_action = 2;
    sGattIf->client->scan_filter_param_setup(client_if, clear_scan_filter_params_action,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    btgatt_filt_param_setup_t filt_params;
    memset(&filt_params, 0, sizeof(btgatt_filt_param_setup_t));
    filt_params.client_if = client_if;
    filt_params.action = clear_scan_filter_params_action;
    sGattIf->client->scan_filter_param_setup(filt_params);
}

static void gattClientScanFilterAddRemoveNative(JNIEnv* env, jobject object,
@@ -1738,7 +1811,7 @@ static JNINativeMethod sScanMethods[] = {
    {"gattClientStopBatchScanNative", "(I)V", (void *) gattClientStopBatchScanNative},
    {"gattClientReadScanReportsNative", "(II)V", (void *) gattClientReadScanReportsNative},
    // Scan filter JNI functions.
    {"gattClientScanFilterParamAddNative", "(IIIIIIIIIII)V", (void *) gattClientScanFilterParamAddNative},
    {"gattClientScanFilterParamAddNative", "(Lcom/android/bluetooth/gatt/FilterParams;)V", (void *) gattClientScanFilterParamAddNative},
    {"gattClientScanFilterParamDeleteNative", "(II)V", (void *) gattClientScanFilterParamDeleteNative},
    {"gattClientScanFilterParamClearAllNative", "(I)V", (void *) gattClientScanFilterParamClearAllNative},
    {"gattClientScanFilterAddNative", "(IIIIIJJJJLjava/lang/String;Ljava/lang/String;B[B[B)V", (void *) gattClientScanFilterAddNative},
+17 −7
Original line number Diff line number Diff line
@@ -64,6 +64,8 @@ class AdapterProperties {
    private int mNumOfOffloadedIrkSupported;
    private int mNumOfOffloadedScanFilterSupported;
    private int mOffloadedScanResultStorageBytes;
    private int mVersSupported;
    private int mTotNumOfTrackableAdv;
    private boolean mIsActivityAndEnergyReporting;

    // Lock for all getters and setters.
@@ -550,13 +552,17 @@ class AdapterProperties {
    }

    void updateFeatureSupport(byte[] val) {
        mNumOfAdvertisementInstancesSupported = (0xFF & ((int)val[1]));
        mRpaOffloadSupported = ((0xFF & ((int)val[2]))!= 0);
        mNumOfOffloadedIrkSupported =  (0xFF & ((int)val[3]));
        mNumOfOffloadedScanFilterSupported = (0xFF & ((int)val[4]));
        mOffloadedScanResultStorageBytes = ((0xFF & ((int)val[6])) << 8)
                            + (0xFF & ((int)val[5]));
        mVersSupported = ((0xFF & ((int)val[1])) << 8)
                            + (0xFF & ((int)val[0]));
        mNumOfAdvertisementInstancesSupported = (0xFF & ((int)val[3]));
        mRpaOffloadSupported = ((0xFF & ((int)val[4]))!= 0);
        mNumOfOffloadedIrkSupported =  (0xFF & ((int)val[5]));
        mNumOfOffloadedScanFilterSupported = (0xFF & ((int)val[6]));
        mIsActivityAndEnergyReporting = ((0xFF & ((int)val[7])) != 0);
        mOffloadedScanResultStorageBytes = ((0xFF & ((int)val[9])) << 8)
                            + (0xFF & ((int)val[8]));
        mTotNumOfTrackableAdv = ((0xFF & ((int)val[11])) << 8)
                            + (0xFF & ((int)val[10]));

        Log.d(TAG, "BT_PROPERTY_LOCAL_LE_FEATURES: update from BT controller"
                + " mNumOfAdvertisementInstancesSupported = "
@@ -569,7 +575,11 @@ class AdapterProperties {
                + " mOffloadedScanResultStorageBytes= "
                + mOffloadedScanResultStorageBytes
                + " mIsActivityAndEnergyReporting = "
                + mIsActivityAndEnergyReporting);
                + mIsActivityAndEnergyReporting
                +" mVersSupported = "
                + mVersSupported
                + " mTotNumOfTrackableAdv = "
                + mTotNumOfTrackableAdv);
    }

    void onBluetoothReady() {
+1 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.bluetooth.gatt;import android.annotation.Nullable;
/** @hide */public class AdvtFilterOnFoundOnLostInfo {
    private int mClientIf;

    private int mAdvPktLen;
    @Nullable
    private byte[] mAdvPkt;

    private int mScanRspLen;

    @Nullable
    private byte[] mScanRsp;

    private int mFiltIndex;
    private int mAdvState;
    private int mAdvInfoPresent;
    private String mAddress;

    private int mAddrType;
    private int mTxPower;
    private int mRssiValue;
    private int mTimeStamp;

    public AdvtFilterOnFoundOnLostInfo(int client_if, int adv_pkt_len, byte[] adv_pkt,
                    int scan_rsp_len, byte[] scan_rsp, int filt_index, int adv_state,
                    int adv_info_present, String address, int addr_type, int tx_power,
                    int rssi_value, int time_stamp){

        mClientIf = client_if;
        mAdvPktLen = adv_pkt_len;
        mAdvPkt = adv_pkt;
        mScanRspLen = scan_rsp_len;
        mScanRsp = scan_rsp;
        mFiltIndex = filt_index;
        mAdvState = adv_state;
        mAdvInfoPresent = adv_info_present;
        mAddress = address;
        mAddrType = addr_type;
        mTxPower = tx_power;
        mRssiValue = rssi_value;
        mTimeStamp = time_stamp;
    }

    public int getClientIf () {
        return mClientIf;
    }

    public int getFiltIndex () {
        return mFiltIndex;
    }

    public int getAdvState () {
        return mAdvState;
    }

    public int getTxPower () {
        return mTxPower;
    }

    public int getTimeStamp () {
        return mTimeStamp;
    }

    public int getRSSIValue () {
        return mRssiValue;
    }

    public int getAdvInfoPresent () {
        return mAdvInfoPresent;
    }

    public String getAddress() {
        return mAddress;
    }

    public int getAddressType() {
        return mAddrType;
    }

    public byte[] getAdvPacketData() {
        return mAdvPkt;
    }

    public int getAdvPacketLen() {
        return mAdvPktLen;
    }

    public byte[] getScanRspData() {
        return mScanRsp;
    }

    public int getScanRspLen() {
        return mScanRspLen;
    }
}
 No newline at end of file
+1 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.bluetooth.gatt;
/** @hide */public class FilterParams {
    private int mClientIf;
    private int mFiltIndex;
    private int mFeatSeln;
    private int mListLogicType;
    private int mFiltLogicType;
    private int mRssiHighValue;
    private int mRssiLowValue;
    private int mDelyMode;
    private int mFoundTimeOut;
    private int mLostTimeOut;
    private int mFoundTimeOutCnt;
    private int mNumOfTrackEntries;

    public FilterParams(int client_if, int filt_index,
        int feat_seln, int list_logic_type, int filt_logic_type,
        int rssi_high_thres, int rssi_low_thres, int dely_mode,
        int found_timeout, int lost_timeout, int found_timeout_cnt,
        int num_of_tracking_entries) {

        mClientIf = client_if;
        mFiltIndex = filt_index;
        mFeatSeln = feat_seln;
        mListLogicType = list_logic_type;
        mFiltLogicType = filt_logic_type;
        mRssiHighValue = rssi_high_thres;
        mRssiLowValue = rssi_low_thres;
        mDelyMode = dely_mode;
        mFoundTimeOut = found_timeout;
        mLostTimeOut = lost_timeout;
        mFoundTimeOutCnt = found_timeout_cnt;
        mNumOfTrackEntries = num_of_tracking_entries;
    }

    public int getClientIf () {
        return mClientIf;
    }

    public int getFiltIndex () {
        return mFiltIndex;
    }

    public int getFeatSeln () {
        return mFeatSeln;
    }

    public int getDelyMode () {
        return mDelyMode;
    }

    public int getListLogicType () {
        return mListLogicType;
    }

    public int getFiltLogicType () {
        return mFiltLogicType;
    }

    public int getRSSIHighValue () {
        return mRssiHighValue;
    }

    public int getRSSILowValue () {
        return mRssiLowValue;
    }

    public int getFoundTimeout () {
        return mFoundTimeOut;
    }

    public int getFoundTimeOutCnt () {
        return mFoundTimeOutCnt;
    }

    public int getLostTimeout () {
        return mLostTimeOut;
    }

    public int getNumOfTrackEntries () {
        return mNumOfTrackEntries;
    }
}
 No newline at end of file
+21 −8
Original line number Diff line number Diff line
@@ -1132,24 +1132,37 @@ public class GattService extends ProfileService {
        flushPendingBatchResults(clientIf, isServer);
    }

    void onTrackAdvFoundLost(int filterIndex, int addrType, String address, int advState,
            int clientIf) throws RemoteException {
        if (DBG) Log.d(TAG, "onClientAdvertiserFoundLost() - clientIf="
                + clientIf + "address = " + address + "adv_state = "
                + advState + "client_if = " + clientIf);
        ClientMap.App app = mClientMap.getById(clientIf);
    AdvtFilterOnFoundOnLostInfo CreateonTrackAdvFoundLostObject(int client_if, int adv_pkt_len,
                    byte[] adv_pkt, int scan_rsp_len, byte[] scan_rsp, int filt_index, int adv_state,
                    int adv_info_present, String address, int addr_type, int tx_power, int rssi_value,
                    int time_stamp) {

        return new AdvtFilterOnFoundOnLostInfo(client_if, adv_pkt_len, adv_pkt,
                    scan_rsp_len, scan_rsp, filt_index, adv_state,
                    adv_info_present, address, addr_type, tx_power,
                    rssi_value, time_stamp);
    }

    void onTrackAdvFoundLost(AdvtFilterOnFoundOnLostInfo trackingInfo) throws RemoteException {
        if (DBG) Log.d(TAG, "onTrackAdvFoundLost() - clientIf="
                       + trackingInfo.getClientIf() + "address = " + trackingInfo.getAddress() +
                       "adv_state = " + trackingInfo.getAdvState()+ "address type=" +
                       trackingInfo.getAddressType()
                       + "ADV packet data =" + trackingInfo.getAdvPacketLen());

        ClientMap.App app = mClientMap.getById(trackingInfo.getClientIf());
        if (app == null || app.callback == null) {
            Log.e(TAG, "app or callback is null");
            return;
        }

        // use hw signal for only onlost reporting
        if (advState != ADVT_STATE_ONLOST) {
        if (trackingInfo.getAdvState() != ADVT_STATE_ONLOST) {
            return;
        }

        for (ScanClient client : mScanManager.getRegularScanQueue()) {
            if (client.clientIf == clientIf) {
            if (client.clientIf == trackingInfo.getClientIf()) {
                ScanSettings settings = client.settings;
                if ((settings.getCallbackType() &
                            ScanSettings.CALLBACK_TYPE_MATCH_LOST) != 0) {
Loading