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

Commit 35ed8fd1 authored by Prerepa Viswanadham's avatar Prerepa Viswanadham
Browse files

Merge commit '732c4a79' into merge_work

parents 49285283 732c4a79
Loading
Loading
Loading
Loading
+95 −22
Original line number Original line Diff line number Diff line
@@ -171,8 +171,11 @@ static jmethodID method_onBatchScanStorageConfigured;
static jmethodID method_onBatchScanStartStopped;
static jmethodID method_onBatchScanStartStopped;
static jmethodID method_onBatchScanReports;
static jmethodID method_onBatchScanReports;
static jmethodID method_onBatchScanThresholdCrossed;
static jmethodID method_onBatchScanThresholdCrossed;

static jmethodID method_CreateonTrackAdvFoundLostObject;
static jmethodID method_onTrackAdvFoundLost;
static jmethodID method_onTrackAdvFoundLost;



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


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

    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
        bda->address[0], bda->address[1], bda->address[2],
        p_adv_track_info->bd_addr.address[0], p_adv_track_info->bd_addr.address[1],
        bda->address[3], bda->address[4], bda->address[5]);
        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);
    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(address);
    sCallbackEnv->DeleteLocalRef(jb_adv_pkt);
    sCallbackEnv->DeleteLocalRef(jb_scan_rsp);

    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
}
}


@@ -849,7 +876,9 @@ static void classInitNative(JNIEnv* env, jclass clazz) {
    method_onBatchScanStartStopped = env->GetMethodID(clazz, "onBatchScanStartStopped", "(III)V");
    method_onBatchScanStartStopped = env->GetMethodID(clazz, "onBatchScanStartStopped", "(III)V");
    method_onBatchScanReports = env->GetMethodID(clazz, "onBatchScanReports", "(IIII[B)V");
    method_onBatchScanReports = env->GetMethodID(clazz, "onBatchScanReports", "(IIII[B)V");
    method_onBatchScanThresholdCrossed = env->GetMethodID(clazz, "onBatchScanThresholdCrossed", "(I)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
    // Server callbacks


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


static void gattClientScanFilterParamAddNative(JNIEnv* env, jobject object,
static void gattClientScanFilterParamAddNative(JNIEnv* env, jobject object, jobject params)
        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)
{
{
    if (!sGattIf) return;
    if (!sGattIf) return;
    const int add_scan_filter_params_action = 0;
    const int add_scan_filter_params_action = 0;
    sGattIf->client->scan_filter_param_setup(client_if, add_scan_filter_params_action, filt_index,
    btgatt_filt_param_setup_t filt_params;
            feat_seln, list_logic_type, filt_logic_type,

            rssi_high_thres, rssi_low_thres,
    jmethodID methodId = 0;
            dely_mode, found_timeout, lost_timeout, found_timeout_cnt);
    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,
static void gattClientScanFilterParamDeleteNative(JNIEnv* env, jobject object,
@@ -1309,16 +1375,23 @@ static void gattClientScanFilterParamDeleteNative(JNIEnv* env, jobject object,
{
{
    if (!sGattIf) return;
    if (!sGattIf) return;
    const int delete_scan_filter_params_action = 1;
    const int delete_scan_filter_params_action = 1;
    sGattIf->client->scan_filter_param_setup(client_if, delete_scan_filter_params_action,
    btgatt_filt_param_setup_t filt_params;
            filt_index, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    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)
static void gattClientScanFilterParamClearAllNative(JNIEnv* env, jobject object, jint client_if)
{
{
    if (!sGattIf) return;
    if (!sGattIf) return;
    const int clear_scan_filter_params_action = 2;
    const int clear_scan_filter_params_action = 2;
    sGattIf->client->scan_filter_param_setup(client_if, clear_scan_filter_params_action,
    btgatt_filt_param_setup_t filt_params;
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    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,
static void gattClientScanFilterAddRemoveNative(JNIEnv* env, jobject object,
@@ -1743,7 +1816,7 @@ static JNINativeMethod sScanMethods[] = {
    {"gattClientStopBatchScanNative", "(I)V", (void *) gattClientStopBatchScanNative},
    {"gattClientStopBatchScanNative", "(I)V", (void *) gattClientStopBatchScanNative},
    {"gattClientReadScanReportsNative", "(II)V", (void *) gattClientReadScanReportsNative},
    {"gattClientReadScanReportsNative", "(II)V", (void *) gattClientReadScanReportsNative},
    // Scan filter JNI functions.
    // Scan filter JNI functions.
    {"gattClientScanFilterParamAddNative", "(IIIIIIIIIII)V", (void *) gattClientScanFilterParamAddNative},
    {"gattClientScanFilterParamAddNative", "(Lcom/android/bluetooth/gatt/FilterParams;)V", (void *) gattClientScanFilterParamAddNative},
    {"gattClientScanFilterParamDeleteNative", "(II)V", (void *) gattClientScanFilterParamDeleteNative},
    {"gattClientScanFilterParamDeleteNative", "(II)V", (void *) gattClientScanFilterParamDeleteNative},
    {"gattClientScanFilterParamClearAllNative", "(I)V", (void *) gattClientScanFilterParamClearAllNative},
    {"gattClientScanFilterParamClearAllNative", "(I)V", (void *) gattClientScanFilterParamClearAllNative},
    {"gattClientScanFilterAddNative", "(IIIIIJJJJLjava/lang/String;Ljava/lang/String;B[B[B)V", (void *) gattClientScanFilterAddNative},
    {"gattClientScanFilterAddNative", "(IIIIIJJJJLjava/lang/String;Ljava/lang/String;B[B[B)V", (void *) gattClientScanFilterAddNative},
+17 −7
Original line number Original line Diff line number Diff line
@@ -64,6 +64,8 @@ class AdapterProperties {
    private int mNumOfOffloadedIrkSupported;
    private int mNumOfOffloadedIrkSupported;
    private int mNumOfOffloadedScanFilterSupported;
    private int mNumOfOffloadedScanFilterSupported;
    private int mOffloadedScanResultStorageBytes;
    private int mOffloadedScanResultStorageBytes;
    private int mVersSupported;
    private int mTotNumOfTrackableAdv;
    private boolean mIsActivityAndEnergyReporting;
    private boolean mIsActivityAndEnergyReporting;


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


    void updateFeatureSupport(byte[] val) {
    void updateFeatureSupport(byte[] val) {
        mNumOfAdvertisementInstancesSupported = (0xFF & ((int)val[1]));
        mVersSupported = ((0xFF & ((int)val[1])) << 8)
        mRpaOffloadSupported = ((0xFF & ((int)val[2]))!= 0);
                            + (0xFF & ((int)val[0]));
        mNumOfOffloadedIrkSupported =  (0xFF & ((int)val[3]));
        mNumOfAdvertisementInstancesSupported = (0xFF & ((int)val[3]));
        mNumOfOffloadedScanFilterSupported = (0xFF & ((int)val[4]));
        mRpaOffloadSupported = ((0xFF & ((int)val[4]))!= 0);
        mOffloadedScanResultStorageBytes = ((0xFF & ((int)val[6])) << 8)
        mNumOfOffloadedIrkSupported =  (0xFF & ((int)val[5]));
                            + (0xFF & ((int)val[5]));
        mNumOfOffloadedScanFilterSupported = (0xFF & ((int)val[6]));
        mIsActivityAndEnergyReporting = ((0xFF & ((int)val[7])) != 0);
        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"
        Log.d(TAG, "BT_PROPERTY_LOCAL_LE_FEATURES: update from BT controller"
                + " mNumOfAdvertisementInstancesSupported = "
                + " mNumOfAdvertisementInstancesSupported = "
@@ -569,7 +575,11 @@ class AdapterProperties {
                + " mOffloadedScanResultStorageBytes= "
                + " mOffloadedScanResultStorageBytes= "
                + mOffloadedScanResultStorageBytes
                + mOffloadedScanResultStorageBytes
                + " mIsActivityAndEnergyReporting = "
                + " mIsActivityAndEnergyReporting = "
                + mIsActivityAndEnergyReporting);
                + mIsActivityAndEnergyReporting
                +" mVersSupported = "
                + mVersSupported
                + " mTotNumOfTrackableAdv = "
                + mTotNumOfTrackableAdv);
    }
    }


    void onBluetoothReady() {
    void onBluetoothReady() {
+8 −0
Original line number Original line Diff line number Diff line
@@ -1128,6 +1128,14 @@ public class AdapterService extends Service {
             return service.reportActivityInfo();
             return service.reportActivityInfo();
         }
         }


         public int numOfHwTrackFiltersAvailable() {
             AdapterService service = getService();
             if (service == null) return 0;
             //ToDo: Accounting of how many filters hw can do, capability,
             //vs how many have been used by current filters by ScanManager
             return 5;
         }

         public String dump() {
         public String dump() {
            AdapterService service = getService();
            AdapterService service = getService();
            if (service == null) {
            if (service == null) {
+126 −0
Original line number Original line 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;
    }

    public byte [] getResult() {
        int resultLength = mAdvPkt.length + ((mScanRsp != null) ? mScanRsp.length : 0);
        byte result[] = new byte[resultLength];
        System.arraycopy(mAdvPkt, 0, result, 0,  mAdvPkt.length);
        if (mScanRsp != null) {
            System.arraycopy(mScanRsp, 0, result, mAdvPkt.length, mScanRsp.length);
        }
        return result;
    }

}
+103 −0
Original line number Original line 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;
    }

}
Loading