Loading android/app/jni/com_android_bluetooth_gatt.cpp +95 −22 Original line number Original line Diff line number Diff line Loading @@ -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 */ */ Loading Loading @@ -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__); } } Loading Loading @@ -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 Loading Loading @@ -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, Loading @@ -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, Loading Loading @@ -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}, Loading android/app/src/com/android/bluetooth/btservice/AdapterProperties.java +17 −7 Original line number Original line Diff line number Diff line Loading @@ -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. Loading Loading @@ -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 = " Loading @@ -569,7 +575,11 @@ class AdapterProperties { + " mOffloadedScanResultStorageBytes= " + " mOffloadedScanResultStorageBytes= " + mOffloadedScanResultStorageBytes + mOffloadedScanResultStorageBytes + " mIsActivityAndEnergyReporting = " + " mIsActivityAndEnergyReporting = " + mIsActivityAndEnergyReporting); + mIsActivityAndEnergyReporting +" mVersSupported = " + mVersSupported + " mTotNumOfTrackableAdv = " + mTotNumOfTrackableAdv); } } void onBluetoothReady() { void onBluetoothReady() { Loading android/app/src/com/android/bluetooth/btservice/AdapterService.java +8 −0 Original line number Original line Diff line number Diff line Loading @@ -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) { Loading android/app/src/com/android/bluetooth/gatt/AdvtFilterOnFoundOnLostInfo.java 0 → 100644 +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; } } android/app/src/com/android/bluetooth/gatt/FilterParams.java 0 → 100644 +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
android/app/jni/com_android_bluetooth_gatt.cpp +95 −22 Original line number Original line Diff line number Diff line Loading @@ -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 */ */ Loading Loading @@ -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__); } } Loading Loading @@ -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 Loading Loading @@ -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, Loading @@ -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, Loading Loading @@ -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}, Loading
android/app/src/com/android/bluetooth/btservice/AdapterProperties.java +17 −7 Original line number Original line Diff line number Diff line Loading @@ -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. Loading Loading @@ -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 = " Loading @@ -569,7 +575,11 @@ class AdapterProperties { + " mOffloadedScanResultStorageBytes= " + " mOffloadedScanResultStorageBytes= " + mOffloadedScanResultStorageBytes + mOffloadedScanResultStorageBytes + " mIsActivityAndEnergyReporting = " + " mIsActivityAndEnergyReporting = " + mIsActivityAndEnergyReporting); + mIsActivityAndEnergyReporting +" mVersSupported = " + mVersSupported + " mTotNumOfTrackableAdv = " + mTotNumOfTrackableAdv); } } void onBluetoothReady() { void onBluetoothReady() { Loading
android/app/src/com/android/bluetooth/btservice/AdapterService.java +8 −0 Original line number Original line Diff line number Diff line Loading @@ -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) { Loading
android/app/src/com/android/bluetooth/gatt/AdvtFilterOnFoundOnLostInfo.java 0 → 100644 +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; } }
android/app/src/com/android/bluetooth/gatt/FilterParams.java 0 → 100644 +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; } }