summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp1
-rw-r--r--android/app/Android.bp75
-rw-r--r--android/app/jni/com_android_bluetooth_gatt.cpp93
-rw-r--r--android/app/jni/com_android_bluetooth_le_audio.cpp4
-rw-r--r--android/app/res/values/config.xml58
-rwxr-xr-xandroid/app/src/com/android/bluetooth/bass_client/BassClientService.java1
-rwxr-xr-xandroid/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java1
-rw-r--r--android/app/src/com/android/bluetooth/btservice/AdapterService.java34
-rw-r--r--android/app/src/com/android/bluetooth/gatt/GattService.java175
-rw-r--r--android/app/src/com/android/bluetooth/hfp/HeadsetService.java10
-rw-r--r--android/app/tests/robotests/Android.mk8
-rwxr-xr-xandroid/app/tests/unit/Android.bp12
-rw-r--r--apex/Android.bp87
-rw-r--r--apex/hiddenapi/hiddenapi-max-target-o-low-priority.txt2806
-rw-r--r--apex/hiddenapi/hiddenapi-max-target-p-low-priority.txt2
-rw-r--r--apex/hiddenapi/hiddenapi-max-target-r-low-priority.txt3
-rw-r--r--apex/hiddenapi/hiddenapi-unsupported.txt13
-rw-r--r--framework/aidl-export/Android.bp11
-rw-r--r--framework/api/current.txt10
-rw-r--r--framework/java/android/bluetooth/BluetoothAdapter.java232
-rwxr-xr-xframework/java/android/bluetooth/BluetoothClass.java5
-rw-r--r--framework/java/android/bluetooth/BluetoothCodecConfig.java42
-rw-r--r--framework/java/android/bluetooth/BluetoothDevice.java314
-rw-r--r--framework/java/android/bluetooth/BluetoothGatt.java188
-rw-r--r--framework/java/android/bluetooth/BluetoothGattCallback.java53
-rw-r--r--framework/java/android/bluetooth/BluetoothGattServer.java56
-rw-r--r--framework/java/android/bluetooth/BluetoothGattServerCallback.java53
-rw-r--r--framework/java/android/bluetooth/BluetoothHeadset.java190
-rw-r--r--framework/java/android/bluetooth/BluetoothLeAudio.java4
-rw-r--r--framework/java/android/bluetooth/BluetoothLeAudioCodecConfig.java167
-rw-r--r--framework/java/android/bluetooth/BluetoothProfile.java65
-rw-r--r--framework/java/android/bluetooth/BluetoothSocket.java61
-rw-r--r--framework/java/android/bluetooth/BluetoothUuid.java35
-rw-r--r--framework/java/android/bluetooth/DeviceGroup.java177
-rw-r--r--framework/java/android/bluetooth/le/AdvertisingSetParameters.java15
-rw-r--r--framework/java/android/bluetooth/le/BluetoothLeScanner.java22
-rw-r--r--framework/java/android/bluetooth/le/BluetoothLeUtils.java41
-rw-r--r--framework/java/android/bluetooth/le/PeriodicAdvertisingManager.java3
-rw-r--r--framework/java/android/bluetooth/le/ScanFilter.java174
-rw-r--r--framework/java/android/bluetooth/le/ScanRecord.java50
-rw-r--r--framework/java/android/bluetooth/le/ScanResult.java51
-rw-r--r--framework/java/android/bluetooth/le/ScanSettings.java9
-rw-r--r--hello_world0
-rw-r--r--service/Android.bp30
-rw-r--r--service/java/com/android/server/bluetooth/BluetoothManagerService.java651
-rw-r--r--service/java/com/android/server/bluetooth/BluetoothModeChangeHelper.java7
-rw-r--r--service/tests/Android.bp33
-rw-r--r--system/Android.bp1
-rw-r--r--system/audio_a2dp_hw/Android.bp1
-rw-r--r--system/audio_a2dp_hw/test/audio_a2dp_hw_test.cc4
-rw-r--r--system/audio_hal_interface/aidl/codec_status_aidl.cc4
-rw-r--r--system/audio_hal_interface/hidl/codec_status_hidl.cc2
-rw-r--r--system/audio_hearing_aid_hw/Android.bp1
-rw-r--r--system/audio_hearing_aid_hw/test/audio_hearing_aid_hw_test.cc6
-rw-r--r--system/binder/Android.bp9
-rw-r--r--system/binder/android/bluetooth/BluetoothActivityEnergyInfo.aidl (renamed from framework/aidl-export/android/bluetooth/BluetoothActivityEnergyInfo.aidl)0
-rw-r--r--system/binder/android/bluetooth/BluetoothDevice.aidl (renamed from framework/aidl-export/android/bluetooth/BluetoothDevice.aidl)0
-rw-r--r--system/binder/android/bluetooth/BluetoothQualityReport.aidl32
-rw-r--r--system/binder/android/bluetooth/DeviceGroup.aidl32
-rw-r--r--system/binder/android/bluetooth/IBluetooth.aidl68
-rw-r--r--system/binder/android/bluetooth/IBluetoothDeviceGroup.aidl73
-rw-r--r--system/binder/android/bluetooth/IBluetoothDun.aidl45
-rw-r--r--system/binder/android/bluetooth/IBluetoothGatt.aidl40
-rw-r--r--system/binder/android/bluetooth/IBluetoothGattCallback.aidl37
-rw-r--r--system/binder/android/bluetooth/IBluetoothGattServerCallback.aidl37
-rw-r--r--system/binder/android/bluetooth/IBluetoothGroupCallback.aidl48
-rw-r--r--system/binder/android/bluetooth/IBluetoothHeadset.aidl4
-rw-r--r--system/binder/android/bluetooth/IBluetoothManager.aidl1
-rw-r--r--system/binder/android/bluetooth/IBluetoothVcp.aidl50
-rw-r--r--system/btcore/Android.bp7
-rw-r--r--system/btif/Android.bp1
-rw-r--r--system/btif/src/btif_a2dp_audio_interface.cc515
-rw-r--r--system/btif/src/btif_ble_advertiser.cc10
-rw-r--r--system/btif/src/btif_ble_scanner.cc25
-rw-r--r--system/btif/src/btif_gatt_client.cc45
-rw-r--r--system/conf/bt_did.conf3
-rw-r--r--system/conf/bt_stack.conf67
-rw-r--r--system/embdrv/lc3/Android.bp1
-rw-r--r--system/gd/Android.bp1
-rw-r--r--system/gd/dumpsys/Android.bp1
-rw-r--r--system/gd/hci/le_scanning_manager.cc4
-rw-r--r--system/gd/hci/le_scanning_manager.h2
-rw-r--r--system/gd/hci/le_scanning_manager_mock.h3
-rw-r--r--system/gd/proto/Android.bp3
-rw-r--r--system/gd/rust/common/Android.bp1
-rw-r--r--system/gd/rust/facade/Android.bp1
-rw-r--r--system/gd/rust/gddi/Android.bp1
-rw-r--r--system/gd/rust/shim/Android.bp5
-rw-r--r--system/gd/rust/stack/Android.bp2
-rw-r--r--system/gd/rust/topshim/src/profiles/gatt.rs2
-rw-r--r--system/include/Android.bp5
-rw-r--r--system/include/hardware/ble_advertiser.h32
-rw-r--r--system/include/hardware/ble_scanner.h28
-rw-r--r--system/include/hardware/bt_av.h23
-rw-r--r--system/include/hardware/bt_common_types.h4
-rw-r--r--system/include/hardware/bt_gatt_client.h51
-rw-r--r--system/include/hardware/bt_gatt_server.h43
-rw-r--r--system/main/Android.bp8
-rw-r--r--system/main/shim/ble_scanner_interface_impl.h13
-rw-r--r--system/main/shim/btm_api.h2
-rw-r--r--system/main/shim/le_advertising_manager.cc6
-rw-r--r--system/main/shim/le_scanning_manager.cc37
-rw-r--r--system/osi/Android.bp9
-rw-r--r--system/packet/Android.bp1
-rw-r--r--system/packet/avrcp/Android.bp1
-rw-r--r--system/packet/base/Android.bp1
-rw-r--r--system/profile/avrcp/Android.bp1
-rw-r--r--system/service/common/Android.bp4
-rw-r--r--system/service/gatt_server_old.cc2
-rw-r--r--system/service/hal/bluetooth_gatt_interface.cc2
-rw-r--r--system/service/hal/fake_bluetooth_gatt_interface.cc1
-rw-r--r--system/service/test/low_energy_advertiser_unittest.cc7
-rw-r--r--system/service/test/low_energy_scanner_unittest.cc13
-rw-r--r--system/stack/a2dp/a2dp_aac.cc4
-rw-r--r--system/stack/a2dp/a2dp_sbc.cc4
-rw-r--r--system/stack/a2dp/a2dp_vendor.cc6
-rw-r--r--system/stack/a2dp/a2dp_vendor_aptx.cc4
-rw-r--r--system/stack/a2dp/a2dp_vendor_aptx_hd.cc4
-rw-r--r--system/stack/a2dp/a2dp_vendor_ldac.cc4
-rw-r--r--system/stack/btm/btm_ble_gap.cc19
-rw-r--r--system/stack/include/btm_ble_api.h2
-rw-r--r--system/stack/test/stack_a2dp_test.cc3
-rw-r--r--system/test/mock/mock_stack_btm_ble_gap.cc2
-rw-r--r--system/test/rootcanal/Android.bp8
-rw-r--r--system/types/Android.bp2
-rw-r--r--system/vendor_libs/Android.bp4
126 files changed, 4434 insertions, 3253 deletions
diff --git a/Android.bp b/Android.bp
index 521a562865..2b49380612 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,5 +1,4 @@
package {
- default_visibility: [":__subpackages__"],
default_applicable_licenses: ["system_bt_license"],
}
diff --git a/android/app/Android.bp b/android/app/Android.bp
index 90f39fd6b0..e7bf31b1fd 100644
--- a/android/app/Android.bp
+++ b/android/app/Android.bp
@@ -1,3 +1,8 @@
+// Bluetooth is in it's own namespace to allow it to be replaced with an
+// alternate implementation.
+soong_namespace {
+}
+
// MAP API module
package {
@@ -32,11 +37,6 @@ java_library {
name: "bluetooth.mapsapi",
srcs: ["lib/mapapi/**/*.java"],
- apex_available: [
- "com.android.bluetooth",
- ],
- min_sdk_version: "Tiramisu",
- sdk_version: "module_current",
}
java_library {
@@ -44,11 +44,6 @@ java_library {
srcs: [":framework-mms-shared-srcs"],
libs: ["unsupportedappusage"],
- apex_available: [
- "com.android.bluetooth",
- ],
- min_sdk_version: "Tiramisu",
- sdk_version: "module_current",
}
// Bluetooth JNI
@@ -78,10 +73,6 @@ cc_library_shared {
sanitize: {
scs: true,
},
- apex_available: [
- "com.android.bluetooth",
- ],
- min_sdk_version: "Tiramisu",
}
// Bluetooth APK
@@ -98,26 +89,18 @@ android_app {
aaptflags: [ "--custom-package", "com.android.bluetooth" ],
certificate: ":com.android.bluetooth.certificate",
- jarjar_rules: ":bluetooth-jarjar-rules",
-
- jni_uses_platform_apis: true,
+ jni_libs: ["libbluetooth_jni"],
libs: [
- "framework-bluetooth-pre-jarjar",
- "framework-statsd.stubs.module_lib",
- "framework-tethering.stubs.module_lib",
- "framework-connectivity.stubs.module_lib",
- "framework-mediaprovider",
- "unsupportedappusage",
- "framework-annotations-lib",
- "error_prone_annotations",
+ "services.net",
],
+ min_sdk_version: "current",
+ platform_apis: true,
static_libs: [
"android.hardware.radio-V1.0-java",
"androidx.core_core",
"androidx.legacy_legacy-support-v4",
"androidx.lifecycle_lifecycle-livedata",
"androidx.room_room-runtime",
- "androidx.annotation_annotation",
"bluetooth.mapsapi",
"bluetooth-protos-lite",
"com.android.vcard",
@@ -130,9 +113,8 @@ android_app {
"modules-utils-synchronous-result-receiver",
"modules-utils-statemachine",
"sap-api-java-static",
- "net-utils-services-common",
- "networkstack-client",
- "PlatformProperties",
+ "services.net",
+ "PlatformProperties"
],
plugins: [
@@ -156,6 +138,7 @@ android_app {
"android.hardware.bluetooth.audio-V2-ndk",
],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
errorprone: {
@@ -163,42 +146,14 @@ android_app {
// "-Xep:AndroidFrameworkRequiresPermission:ERROR",
],
},
- min_sdk_version: "Tiramisu",
- sdk_version: "module_current",
-}
-
-gensrcs {
- name: "bluetooth-proto-enums-java-gen",
- depfile: true,
-
- tools: [
- "aprotoc",
- "protoc-gen-javastream",
- "soong_zip",
- ],
-
- cmd: "mkdir -p $(genDir)/$(in) " +
- "&& $(location aprotoc) " +
- " --plugin=$(location protoc-gen-javastream) " +
- " --dependency_out=$(depfile) " +
- " --javastream_out=$(genDir)/$(in) " +
- " -Iexternal/protobuf/src " +
- " -I . " +
- " $(in) " +
- "&& $(location soong_zip) -jar -o $(out) -C $(genDir)/$(in) -D $(genDir)/$(in)",
-
- srcs: [
- ":srcs_bluetooth_protos",
- ],
- output_extension: "srcjar",
}
genrule {
name: "statslog-bluetooth-java-gen",
tools: ["stats-log-api-gen"],
- cmd: "$(location stats-log-api-gen) --java $(out) --module bluetooth" +
- " --javaPackage com.android.bluetooth --javaClass BluetoothStatsLog" +
- " --minApiLevel 33",
+ cmd: "$(location stats-log-api-gen) --java $(out) --module bluetooth"
+ + " --javaPackage com.android.bluetooth --javaClass BluetoothStatsLog"
+ + " --minApiLevel 33",
out: ["com/android/bluetooth/BluetoothStatsLog.java"],
}
diff --git a/android/app/jni/com_android_bluetooth_gatt.cpp b/android/app/jni/com_android_bluetooth_gatt.cpp
index 963eb56f74..46da457006 100644
--- a/android/app/jni/com_android_bluetooth_gatt.cpp
+++ b/android/app/jni/com_android_bluetooth_gatt.cpp
@@ -12,6 +12,41 @@
* 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.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ *
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ *
*/
#define LOG_TAG "BtGatt.JNI"
@@ -142,6 +177,7 @@ static jmethodID method_onClientPhyUpdate;
static jmethodID method_onClientPhyRead;
static jmethodID method_onClientConnUpdate;
static jmethodID method_onServiceChanged;
+static jmethodID method_onClientSubrateChange;
/**
* Server callback methods
@@ -163,6 +199,7 @@ static jmethodID method_onServerMtuChanged;
static jmethodID method_onServerPhyUpdate;
static jmethodID method_onServerPhyRead;
static jmethodID method_onServerConnUpdate;
+static jmethodID method_onServerSubrateChange;
/**
* Advertiser callback methods
@@ -548,6 +585,19 @@ void btgattc_service_changed_cb(int conn_id) {
sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceChanged, conn_id);
}
+void btgattc_subrate_change_cb(int conn_id, uint16_t subrate_factor, uint16_t latency,
+ uint16_t cont_num, uint16_t timeout, uint8_t status) {
+ CallbackEnv sCallbackEnv(__func__);
+ if (!sCallbackEnv.valid()) return;
+ if (!mCallbacksObj) {
+ ALOGE("mCallbacksObj is NULL. Return.");
+ return;
+ }
+
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onClientSubrateChange,
+ conn_id, subrate_factor, latency, cont_num, timeout, status);
+}
+
static const btgatt_scanner_callbacks_t sGattScannerCallbacks = {
btgattc_scan_result_cb,
btgattc_batchscan_reports_cb,
@@ -576,6 +626,7 @@ static const btgatt_client_callbacks_t sGattClientCallbacks = {
btgattc_phy_updated_cb,
btgattc_conn_updated_cb,
btgattc_service_changed_cb,
+ btgattc_subrate_change_cb,
};
/**
@@ -756,6 +807,19 @@ void btgatts_conn_updated_cb(int conn_id, uint16_t interval, uint16_t latency,
conn_id, interval, latency, timeout, status);
}
+void btgatts_subrate_change_cb(int conn_id, uint16_t subrate_factor, uint16_t latency,
+ uint16_t cont_num, uint16_t timeout, uint8_t status) {
+ CallbackEnv sCallbackEnv(__func__);
+ if (!sCallbackEnv.valid()) return;
+ if (!mCallbacksObj) {
+ ALOGE("mCallbacksObj is NULL. Return.");
+ return;
+ }
+
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServerSubrateChange,
+ conn_id, subrate_factor, latency, cont_num, timeout, status);
+}
+
static const btgatt_server_callbacks_t sGattServerCallbacks = {
btgatts_register_app_cb,
btgatts_connection_cb,
@@ -772,7 +836,8 @@ static const btgatt_server_callbacks_t sGattServerCallbacks = {
btgatts_congestion_cb,
btgatts_mtu_changed_cb,
btgatts_phy_updated_cb,
- btgatts_conn_updated_cb};
+ btgatts_conn_updated_cb,
+ btgatts_subrate_change_cb};
/**
* GATT callbacks
@@ -1125,6 +1190,8 @@ static void classInitNative(JNIEnv* env, jclass clazz) {
env->GetMethodID(clazz, "onClientConnUpdate", "(IIIII)V");
method_onServiceChanged =
env->GetMethodID(clazz, "onServiceChanged", "(I)V");
+ method_onClientSubrateChange =
+ env->GetMethodID(clazz, "onClientSubrateChange", "(IIIIII)V");
// Server callbacks
@@ -1161,6 +1228,8 @@ static void classInitNative(JNIEnv* env, jclass clazz) {
env->GetMethodID(clazz, "onServerPhyUpdate", "(IIII)V");
method_onServerConnUpdate =
env->GetMethodID(clazz, "onServerConnUpdate", "(IIIII)V");
+ method_onServerSubrateChange =
+ env->GetMethodID(clazz, "onServerSubrateChange", "(IIIIII)V");
info("classInitNative: Success!");
}
@@ -1461,8 +1530,15 @@ static void gattSetScanParametersNative(JNIEnv* env, jobject object,
jint client_if, jint scan_interval_unit,
jint scan_window_unit) {
if (!sGattIf) return;
+
+ ALOGW("gattSetScanParametersNative");
+ std::vector<uint32_t> scan_interval = {0,0};
+ std::vector<uint32_t> scan_window = {0,0};
+ scan_interval.push_back(scan_interval_unit);
+ scan_window.push_back(scan_window_unit);
+
sGattIf->scanner->SetScanParameters(
- client_if, scan_interval_unit, scan_window_unit,
+ client_if, scan_interval, scan_window,
base::Bind(&set_scan_params_cmpl_cb, client_if));
}
@@ -1725,6 +1801,17 @@ static void gattConnectionParameterUpdateNative(JNIEnv* env, jobject object,
(uint16_t)min_ce_len, (uint16_t)max_ce_len);
}
+static void gattSubrateRequestNative(JNIEnv* env, jobject object,
+ jint client_if, jstring address,
+ jint subrate_min, jint subrate_max,
+ jint max_latency, jint cont_num,
+ jint sup_timeout) {
+ if (!sGattIf) return;
+ sGattIf->client->subrate_request(
+ str2addr(env, address), subrate_min, subrate_max, max_latency, cont_num,
+ sup_timeout);
+}
+
void batchscan_cfg_storage_cb(uint8_t client_if, uint8_t status) {
CallbackEnv sCallbackEnv(__func__);
if (!sCallbackEnv.valid()) return;
@@ -2511,6 +2598,8 @@ static JNINativeMethod sMethods[] = {
(void*)gattServerSendNotificationNative},
{"gattServerSendResponseNative", "(IIIIII[BI)V",
(void*)gattServerSendResponseNative},
+ {"gattSubrateRequestNative", "(ILjava/lang/String;IIIII)V",
+ (void*)gattSubrateRequestNative},
{"gattTestNative", "(IJJLjava/lang/String;IIIII)V", (void*)gattTestNative},
};
diff --git a/android/app/jni/com_android_bluetooth_le_audio.cpp b/android/app/jni/com_android_bluetooth_le_audio.cpp
index b97385f2a3..584498b111 100644
--- a/android/app/jni/com_android_bluetooth_le_audio.cpp
+++ b/android/app/jni/com_android_bluetooth_le_audio.cpp
@@ -101,7 +101,7 @@ jobject prepareCodecConfigObj(JNIEnv* env,
jobject codecConfigObj =
env->NewObject(android_bluetooth_BluetoothLeAudioCodecConfig.clazz,
android_bluetooth_BluetoothLeAudioCodecConfig.constructor,
- (jint)codecConfig.codec_type, 0, 0, 0, 0, 0, 0, 0, 0);
+ (jint)codecConfig.codec_type, 0, 0, 0, 0, 0, 0, 0, 0, 0L, 0L, 0L, 0L);
return codecConfigObj;
}
@@ -279,7 +279,7 @@ static void classInitNative(JNIEnv* env, jclass clazz) {
jclass jniBluetoothLeAudioCodecConfigClass =
env->FindClass("android/bluetooth/BluetoothLeAudioCodecConfig");
android_bluetooth_BluetoothLeAudioCodecConfig.constructor = env->GetMethodID(
- jniBluetoothLeAudioCodecConfigClass, "<init>", "(IIIIIIIII)V");
+ jniBluetoothLeAudioCodecConfigClass, "<init>", "(IIIIIIIIILLLL)V");
android_bluetooth_BluetoothLeAudioCodecConfig.getCodecType = env->GetMethodID(
jniBluetoothLeAudioCodecConfigClass, "getCodecType", "()I");
diff --git a/android/app/res/values/config.xml b/android/app/res/values/config.xml
index 8e8c755b2b..93b77da771 100644
--- a/android/app/res/values/config.xml
+++ b/android/app/res/values/config.xml
@@ -11,6 +11,41 @@
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.
+
+ Changes from Qualcomm Innovation Center are provided under the following license:
+
+ Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted (subject to the limitations in the
+ disclaimer below) provided that the following conditions are met:
+
+ Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+
-->
<resources>
<bool name="pbap_include_photos_in_vcard">true</bool>
@@ -40,6 +75,29 @@
<integer name="gatt_balanced_priority_latency">0</integer>
<integer name="gatt_low_power_latency">2</integer>
+ <!-- Specifies the min/max subrate factor parameters for high priority,
+ balanced and low power subrate request configurations. -->
+ <integer name="subrate_mode_high_priority_min_subrate">2</integer>
+ <integer name="subrate_mode_high_priority_max_subrate">4</integer>
+ <integer name="subrate_mode_balanced_min_subrate">5</integer>
+ <integer name="subrate_mode_balanced_max_subrate">7</integer>
+ <integer name="subrate_mode_low_power_min_subrate">8</integer>
+ <integer name="subrate_mode_low_power_max_subrate">10</integer>
+
+ <!-- Specifies max latency parameters for high priority, balanced
+ and low power subrate request configurations. These values
+ represents the number of subrate events a peripheral device
+ is allowed to skip. -->
+ <integer name="subrate_mode_high_priority_latency">0</integer>
+ <integer name="subrate_mode_balanced_latency">1</integer>
+ <integer name="subrate_mode_low_power_latency">1</integer>
+
+ <!-- Specifies continuation number parameters for high priority,
+ balanced and low power subrate request configurations. -->
+ <integer name="subrate_mode_high_priority_cont_number">2</integer>
+ <integer name="subrate_mode_balanced_cont_number">2</integer>
+ <integer name="subrate_mode_low_power_cont_number">2</integer>
+
<bool name="headset_client_initial_audio_route_allowed">true</bool>
<!-- @deprecated: use a2dp_absolute_volume_initial_threshold_percent
diff --git a/android/app/src/com/android/bluetooth/bass_client/BassClientService.java b/android/app/src/com/android/bluetooth/bass_client/BassClientService.java
index 881ef14533..e0de32c39d 100755
--- a/android/app/src/com/android/bluetooth/bass_client/BassClientService.java
+++ b/android/app/src/com/android/bluetooth/bass_client/BassClientService.java
@@ -49,7 +49,6 @@ import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.btservice.ProfileService;
import com.android.internal.annotations.VisibleForTesting;
-import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
diff --git a/android/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java b/android/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java
index 1e304805c5..cdae78d979 100755
--- a/android/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java
+++ b/android/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java
@@ -662,7 +662,6 @@ public class BassClientStateMachine extends StateMachine {
badBroadcastCode,
0,
BassConstants.BCAST_RCVR_STATE_BADCODE_SIZE);
- badBroadcastCode = reverseBytes(badBroadcastCode);
badBroadcastCodeLen = BassConstants.BCAST_RCVR_STATE_BADCODE_SIZE;
}
byte numSubGroups = receiverState[BassConstants.BCAST_RCVR_STATE_BADCODE_START_IDX
diff --git a/android/app/src/com/android/bluetooth/btservice/AdapterService.java b/android/app/src/com/android/bluetooth/btservice/AdapterService.java
index f44b6d466c..f371a255f7 100644
--- a/android/app/src/com/android/bluetooth/btservice/AdapterService.java
+++ b/android/app/src/com/android/bluetooth/btservice/AdapterService.java
@@ -3688,6 +3688,40 @@ public class AdapterService extends Service {
return service.allowLowLatencyAudio(allowed, device);
}
+ // Either implement these custom methods, or remove them from IBluetooth.
+ @Override
+ public void setBondingInitiatedLocally(BluetoothDevice device, boolean localInitiated,
+ AttributionSource source) {}
+
+ @Override
+ public boolean isTwsPlusDevice(BluetoothDevice device,
+ AttributionSource attributionSource) { return false; }
+
+ @Override
+ public String getTwsPlusPeerAddress(BluetoothDevice device,
+ AttributionSource attributionSource) { return null; }
+
+ @Override
+ public void updateQuietModeStatus(boolean quietMode,
+ AttributionSource attributionSource) {}
+
+ @Override
+ public int setSocketOpt(int type, int port, int optionName, byte [] optionVal,
+ int optionLen) { return -1; }
+
+ @Override
+ public int getSocketOpt(int type, int port, int optionName,
+ byte [] optionVal) { return -1; }
+
+ @Override
+ public int getDeviceType(BluetoothDevice device, AttributionSource source)
+ { return -1; }
+
+ @Override
+ public boolean isBroadcastActive(AttributionSource attributionSource) {
+ return true;
+ }
+
@Override
public void startRfcommListener(String name, ParcelUuid uuid, PendingIntent pendingIntent,
AttributionSource attributionSource, SynchronousResultReceiver receiver) {
diff --git a/android/app/src/com/android/bluetooth/gatt/GattService.java b/android/app/src/com/android/bluetooth/gatt/GattService.java
index 009315d634..2e070cf128 100644
--- a/android/app/src/com/android/bluetooth/gatt/GattService.java
+++ b/android/app/src/com/android/bluetooth/gatt/GattService.java
@@ -12,6 +12,41 @@
* 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.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ *
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ *
*/
package com.android.bluetooth.gatt;
@@ -1151,6 +1186,30 @@ public class GattService extends ProfileService {
}
@Override
+ public void subrateModeRequest(int clientIf, String address,
+ int subrateMode, AttributionSource attributionSource) {
+ GattService service = getService();
+ if (service == null) {
+ return;
+ }
+ service.subrateModeRequest(clientIf, address, subrateMode,
+ attributionSource);
+ }
+
+ @Override
+ public void leSubrateRequest(int clientIf, String address,
+ int subrateMin, int subrateMax, int maxLatency,
+ int contNumber, int supervisionTimeout,
+ AttributionSource attributionSource) {
+ GattService service = getService();
+ if (service == null) {
+ return;
+ }
+ service.leSubrateRequest(clientIf, address, subrateMin, subrateMax, maxLatency,
+ contNumber, supervisionTimeout, attributionSource);
+ }
+
+ @Override
public void registerServer(ParcelUuid uuid, IBluetoothGattServerCallback callback,
boolean eattSupport, AttributionSource attributionSource,
SynchronousResultReceiver receiver) {
@@ -1697,6 +1756,7 @@ public class GattService extends ProfileService {
}
return service.numHwTrackFiltersAvailable(attributionSource);
}
+
}
;
@@ -2132,6 +2192,24 @@ public class GattService extends ProfileService {
app.callback.onServiceChanged(address);
}
+ void onClientSubrateChange(int connId, int subrateFactor, int latency, int contNum,
+ int timeout, int status)
+ throws RemoteException {
+ Log.d(TAG, "onClientSubrateChange() - connId=" + connId + ", status=" + status);
+
+ String address = mClientMap.addressByConnId(connId);
+ if (address == null) {
+ return;
+ }
+
+ ClientMap.App app = mClientMap.getByConnId(connId);
+ if (app == null) {
+ return;
+ }
+
+ app.callback.onSubrateChange(address, subrateFactor, latency, contNum, timeout, status);
+ }
+
void onServerPhyUpdate(int connId, int txPhy, int rxPhy, int status) throws RemoteException {
if (DBG) {
Log.d(TAG, "onServerPhyUpdate() - connId=" + connId + ", status=" + status);
@@ -2189,6 +2267,25 @@ public class GattService extends ProfileService {
app.callback.onConnectionUpdated(address, interval, latency, timeout, status);
}
+ void onServerSubrateChange(int connId, int subrateFactor, int latency, int contNum,
+ int timeout, int status)
+ throws RemoteException {
+ Log.d(TAG, "onServerSubrateChange() - connId=" + connId + ", status=" + status);
+
+ String address = mServerMap.addressByConnId(connId);
+ if (address == null) {
+ return;
+ }
+
+ ServerMap.App app = mServerMap.getByConnId(connId);
+ if (app == null) {
+ return;
+ }
+
+ app.callback.onSubrateChange(address, subrateFactor, latency, contNum, timeout, status);
+ }
+
+
void onSearchCompleted(int connId, int status) throws RemoteException {
if (DBG) {
Log.d(TAG, "onSearchCompleted() - connId=" + connId + ", status=" + status);
@@ -3883,6 +3980,81 @@ public class GattService extends ProfileService {
minConnectionEventLen, maxConnectionEventLen);
}
+ @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+ public void subrateModeRequest(int clientIf, String address,
+ int subrateMode, AttributionSource attributionSource) {
+ if (!Utils.checkConnectPermissionForDataDelivery(
+ this, attributionSource, "GattService subrateModeRequest")) {
+ return;
+ }
+
+ int subrateMin;
+ int subrateMax;
+ int maxLatency;
+ int contNumber;
+ // Link supervision timeout is measured in N * 10ms
+ int supervisionTimeout = 500; // 5s
+
+ switch (subrateMode) {
+ case BluetoothGatt.SUBRATE_REQ_HIGH:
+ subrateMin =
+ getResources().getInteger(R.integer.subrate_mode_high_priority_min_subrate);
+ subrateMax =
+ getResources().getInteger(R.integer.subrate_mode_high_priority_max_subrate);
+ maxLatency =
+ getResources().getInteger(R.integer.subrate_mode_high_priority_latency);
+ contNumber =
+ getResources().getInteger(R.integer.subrate_mode_high_priority_cont_number);
+ break;
+
+ case BluetoothGatt.SUBRATE_REQ_LOW_POWER:
+ subrateMin =
+ getResources().getInteger(R.integer.subrate_mode_low_power_min_subrate);
+ subrateMax =
+ getResources().getInteger(R.integer.subrate_mode_low_power_max_subrate);
+ maxLatency = getResources().getInteger(R.integer.subrate_mode_low_power_latency);
+ contNumber = getResources().getInteger(R.integer.subrate_mode_low_power_cont_number);
+ break;
+
+ default:
+ // Using the values for SUBRATE_REQ_BALANCED.
+ subrateMin =
+ getResources().getInteger(R.integer.subrate_mode_balanced_min_subrate);
+ subrateMax =
+ getResources().getInteger(R.integer.subrate_mode_balanced_max_subrate);
+ maxLatency = getResources().getInteger(R.integer.subrate_mode_balanced_latency);
+ contNumber = getResources().getInteger(R.integer.subrate_mode_balanced_cont_number);
+ break;
+ }
+
+ if (DBG) {
+ Log.d(TAG, "subrateModeRequest() - address=" + address + ", subrate min/max="
+ + subrateMin + "/" + subrateMax + ", maxLatency=" + maxLatency
+ + " continuation Number=" + contNumber +", timeout=" + supervisionTimeout);
+ }
+
+ gattSubrateRequestNative(clientIf, address, subrateMin, subrateMax, maxLatency,
+ contNumber, supervisionTimeout);
+ }
+
+ void leSubrateRequest(int clientIf, String address, int subrateMin, int subrateMax,
+ int maxLatency, int contNumber, int supervisionTimeout,
+ AttributionSource attributionSource) {
+ if (!Utils.checkConnectPermissionForDataDelivery(
+ this, attributionSource, "GattService leSubrateRequest")) {
+ return;
+ }
+
+ if (DBG) {
+ Log.d(TAG, "leSubrateRequest() - address=" + address + ", subrate min/max="
+ + subrateMin + "/" + subrateMax + ", maxLatency=" + maxLatency
+ + " continuation Number=" + contNumber +", timeout=" + supervisionTimeout);
+ }
+
+ gattSubrateRequestNative(clientIf, address, subrateMin, subrateMax, maxLatency,
+ contNumber, supervisionTimeout);
+ }
+
/**************************************************************************
* Callback functions - SERVER
*************************************************************************/
@@ -4807,4 +4979,7 @@ public class GattService extends ProfileService {
private native void gattServerSendResponseNative(int serverIf, int connId, int transId,
int status, int handle, int offset, byte[] val, int authReq);
+
+ private native void gattSubrateRequestNative(int clientIf, String address, int subrateMin,
+ int subrateMax, int maxLatency, int contNumber, int supervisionTimeout);
}
diff --git a/android/app/src/com/android/bluetooth/hfp/HeadsetService.java b/android/app/src/com/android/bluetooth/hfp/HeadsetService.java
index 17a7067259..226d1eb35b 100644
--- a/android/app/src/com/android/bluetooth/hfp/HeadsetService.java
+++ b/android/app/src/com/android/bluetooth/hfp/HeadsetService.java
@@ -935,6 +935,16 @@ public class HeadsetService extends ProfileService {
receiver.propagateException(e);
}
}
+
+ @Override
+ public void phoneStateChangedDsDa(int numActive, int numHeld, int callState, String number,
+ int type, String name, AttributionSource source) {
+ }
+
+ @Override
+ public void clccResponseDsDa(int index, int direction, int status, int mode, boolean mpty,
+ String number, int type, AttributionSource source) {
+ }
}
// API methods
diff --git a/android/app/tests/robotests/Android.mk b/android/app/tests/robotests/Android.mk
index e1749ea9a0..4d3527ae03 100644
--- a/android/app/tests/robotests/Android.mk
+++ b/android/app/tests/robotests/Android.mk
@@ -1,3 +1,5 @@
+ifneq ($(TARGET_USE_QTI_BT_STACK),true)
+
#############################################################
# Bluetooth Robolectric test target. #
#############################################################
@@ -26,7 +28,7 @@ LOCAL_INSTRUMENTATION_FOR := Bluetooth
LOCAL_MODULE_TAGS := optional
-#include $(BUILD_STATIC_JAVA_LIBRARY)
+include $(BUILD_STATIC_JAVA_LIBRARY)
#############################################################
# Bluetooth runner target to run the previous target. #
@@ -48,4 +50,6 @@ LOCAL_TEST_PACKAGE := Bluetooth
LOCAL_INSTRUMENT_SOURCE_DIRS := $(dir $(LOCAL_PATH))../src
-#include external/robolectric-shadows/run_robotests.mk
+include external/robolectric-shadows/run_robotests.mk
+
+endif
diff --git a/android/app/tests/unit/Android.bp b/android/app/tests/unit/Android.bp
index f4f932321c..ab9fe68b48 100755
--- a/android/app/tests/unit/Android.bp
+++ b/android/app/tests/unit/Android.bp
@@ -7,10 +7,7 @@ android_test {
// We only want this apk build for tests.
certificate: ":com.android.bluetooth.certificate",
- defaults: ["framework-bluetooth-tests-defaults"],
- min_sdk_version: "current",
- target_sdk_version: "current",
libs: [
"javax.obex",
"android.test.runner",
@@ -30,18 +27,14 @@ android_test {
"androidx.room_room-runtime",
"androidx.room_room-testing",
"truth-prebuilt",
- "PlatformProperties",
- "framework-bluetooth-pre-jarjar",
+ "PlatformProperties"
],
asset_dirs: ["src/com/android/bluetooth/btservice/storage/schemas"],
// Include all test java files.
srcs: ["src/**/*.java"],
- jacoco: {
- include_filter: ["android.bluetooth.*"],
- exclude_filter: [],
- },
+
platform_apis: true,
test_suites: [
@@ -50,4 +43,5 @@ android_test {
],
instrumentation_for: "Bluetooth",
+
}
diff --git a/apex/Android.bp b/apex/Android.bp
index 3026a4ce01..3515453121 100644
--- a/apex/Android.bp
+++ b/apex/Android.bp
@@ -13,25 +13,21 @@ linker_config {
installable: false,
}
-// Mainline bluetooth apex module (legacy, do not use).
// TODO: Remove
apex {
+ // TODO(b/224561763): Qualcomm to refactor BT modifications into APEX.
name: "com.android.bluetooth",
- defaults: ["t-launched-apex-module"],
+ enabled: false,
+
manifest: "apex_manifest.json",
- bootclasspath_fragments: ["com.android.btservices-bootclasspath-fragment"],
- systemserverclasspath_fragments: ["com.android.btservices-systemserverclasspath-fragment"],
- compat_configs: ["bluetooth-compat-config"],
+
+ native_shared_libs: [
+ "libbluetooth_jni",
+ "libbluetooth"
+ ],
apps: ["Bluetooth"],
- multilib: {
- first: {
- // Extractor process runs only with the primary ABI.
- jni_libs: [
- "libbluetooth_jni",
- ],
- },
- },
+ compile_multilib: "both",
prebuilts: [
"audio_set_configurations_bfbs",
@@ -67,6 +63,8 @@ apex {
],
},
},
+ min_sdk_version: "current",
+ enabled: false,
prebuilts: [
"audio_set_configurations_bfbs",
@@ -94,66 +92,3 @@ android_app_certificate {
name: "com.android.btservices.certificate",
certificate: "com.android.btservices",
}
-
-sdk {
- name: "btservices-module-sdk",
- bootclasspath_fragments: ["com.android.btservices-bootclasspath-fragment"],
- systemserverclasspath_fragments: ["com.android.btservices-systemserverclasspath-fragment"],
-}
-
-// Encapsulate the contributions made by the com.android.bluetooth to the bootclasspath.
-bootclasspath_fragment {
- name: "com.android.btservices-bootclasspath-fragment",
- contents: ["framework-bluetooth"],
- apex_available: ["com.android.bluetooth"],
-
- // The bootclasspath_fragments that provide APIs on which this depends.
- fragments: [
- {
- apex: "com.android.art",
- module: "art-bootclasspath-fragment",
- },
- ],
-
- // Additional stubs libraries that this fragment's contents use which are
- // not provided by another bootclasspath_fragment.
- additional_stubs: [
- "android-non-updatable",
- ],
-
- // Additional hidden API flag files to override the defaults. This must only be
- // modified by the Soong or platform compat team.
- hidden_api: {
- max_target_o_low_priority: ["hiddenapi/hiddenapi-max-target-o-low-priority.txt"],
- max_target_r_low_priority: ["hiddenapi/hiddenapi-max-target-r-low-priority.txt"],
- unsupported: ["hiddenapi/hiddenapi-unsupported.txt"],
-
- // The following packages contain classes from other modules on the
- // bootclasspath. That means that the hidden API flags for this module
- // has to explicitly list every single class this module provides in
- // that package to differentiate them from the classes provided by other
- // modules. That can include private classes that are not part of the
- // API.
- split_packages: [
- "android.bluetooth",
- ],
-
- // The following packages and all their subpackages currently only
- // contain classes from this bootclasspath_fragment. Listing a package
- // here won't prevent other bootclasspath modules from adding classes in
- // any of those packages but it will prevent them from adding those
- // classes into an API surface, e.g. public, system, etc.. Doing so will
- // result in a build failure due to inconsistent flags.
- package_prefixes: [
- "android.bluetooth.le",
- "com.android.bluetooth",
- ],
- },
-
-}
-
-systemserverclasspath_fragment {
- name: "com.android.btservices-systemserverclasspath-fragment",
- standalone_contents: ["service-bluetooth"],
- apex_available: ["com.android.bluetooth"],
-}
diff --git a/apex/hiddenapi/hiddenapi-max-target-o-low-priority.txt b/apex/hiddenapi/hiddenapi-max-target-o-low-priority.txt
deleted file mode 100644
index 994008b9ea..0000000000
--- a/apex/hiddenapi/hiddenapi-max-target-o-low-priority.txt
+++ /dev/null
@@ -1,2806 +0,0 @@
-Landroid/bluetooth/BluetoothA2dp;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothA2dp;->ACTION_AVRCP_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothA2dp;->DBG:Z
-Landroid/bluetooth/BluetoothA2dp;->doBind()Z
-Landroid/bluetooth/BluetoothA2dp;->enableDisableOptionalCodecs(Landroid/bluetooth/BluetoothDevice;Z)V
-Landroid/bluetooth/BluetoothA2dp;->isAvrcpAbsoluteVolumeSupported()Z
-Landroid/bluetooth/BluetoothA2dp;->isEnabled()Z
-Landroid/bluetooth/BluetoothA2dp;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothA2dp;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothA2dp;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothA2dp;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothA2dp;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothA2dp;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothA2dp;->mService:Landroid/bluetooth/IBluetoothA2dp;
-Landroid/bluetooth/BluetoothA2dp;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothA2dp;->mServiceLock:Ljava/util/concurrent/locks/ReentrantReadWriteLock;
-Landroid/bluetooth/BluetoothA2dp;->setAvrcpAbsoluteVolume(I)V
-Landroid/bluetooth/BluetoothA2dp;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothA2dp;->shouldSendVolumeKeys(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothA2dp;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothA2dp;->VDBG:Z
-Landroid/bluetooth/BluetoothA2dpSink;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothA2dpSink;->ACTION_AUDIO_CONFIG_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothA2dpSink;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothA2dpSink;->ACTION_PLAYING_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothA2dpSink;->close()V
-Landroid/bluetooth/BluetoothA2dpSink;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothA2dpSink;->DBG:Z
-Landroid/bluetooth/BluetoothA2dpSink;->doBind()Z
-Landroid/bluetooth/BluetoothA2dpSink;->EXTRA_AUDIO_CONFIG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothA2dpSink;->getAudioConfig(Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothAudioConfig;
-Landroid/bluetooth/BluetoothA2dpSink;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothA2dpSink;->isA2dpPlaying(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothA2dpSink;->isEnabled()Z
-Landroid/bluetooth/BluetoothA2dpSink;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothA2dpSink;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothA2dpSink;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothA2dpSink;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothA2dpSink;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothA2dpSink;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothA2dpSink;->mService:Landroid/bluetooth/IBluetoothA2dpSink;
-Landroid/bluetooth/BluetoothA2dpSink;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothA2dpSink;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothA2dpSink;->stateToString(I)Ljava/lang/String;
-Landroid/bluetooth/BluetoothA2dpSink;->STATE_NOT_PLAYING:I
-Landroid/bluetooth/BluetoothA2dpSink;->STATE_PLAYING:I
-Landroid/bluetooth/BluetoothA2dpSink;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothA2dpSink;->VDBG:Z
-Landroid/bluetooth/BluetoothActivityEnergyInfo;-><init>(JIJJJJ)V
-Landroid/bluetooth/BluetoothActivityEnergyInfo;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->BT_STACK_STATE_INVALID:I
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->BT_STACK_STATE_STATE_ACTIVE:I
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->BT_STACK_STATE_STATE_IDLE:I
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->BT_STACK_STATE_STATE_SCANNING:I
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->getBluetoothStackState()I
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->getControllerEnergyUsed()J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->getControllerIdleTimeMillis()J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->getControllerRxTimeMillis()J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->getControllerTxTimeMillis()J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->getTimeStamp()J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->getUidTraffic()[Landroid/bluetooth/UidTraffic;
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->isValid()Z
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->mBluetoothStackState:I
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->mControllerEnergyUsed:J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->mControllerIdleTimeMs:J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->mControllerRxTimeMs:J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->mControllerTxTimeMs:J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->mTimestamp:J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->mUidTraffic:[Landroid/bluetooth/UidTraffic;
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->setUidTraffic([Landroid/bluetooth/UidTraffic;)V
-Landroid/bluetooth/BluetoothAdapter$BluetoothStateChangeCallback;->onBluetoothStateChange(Z)V
-Landroid/bluetooth/BluetoothAdapter$StateChangeCallbackWrapper;->mCallback:Landroid/bluetooth/BluetoothAdapter$BluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothAdapter$StateChangeCallbackWrapper;->onBluetoothStateChange(Z)V
-Landroid/bluetooth/BluetoothAdapter;-><init>(Landroid/bluetooth/IBluetoothManager;)V
-Landroid/bluetooth/BluetoothAdapter;->ACTION_BLE_ACL_CONNECTED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAdapter;->ACTION_BLE_ACL_DISCONNECTED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAdapter;->ACTION_BLUETOOTH_ADDRESS_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAdapter;->ACTION_REQUEST_DISABLE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAdapter;->ADDRESS_LENGTH:I
-Landroid/bluetooth/BluetoothAdapter;->BLUETOOTH_MANAGER_SERVICE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAdapter;->changeApplicationBluetoothState(ZLandroid/bluetooth/BluetoothAdapter$BluetoothStateChangeCallback;)Z
-Landroid/bluetooth/BluetoothAdapter;->createNewRfcommSocketAndRecord(Ljava/lang/String;Ljava/util/UUID;ZZ)Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->DBG:Z
-Landroid/bluetooth/BluetoothAdapter;->DEFAULT_MAC_ADDRESS:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAdapter;->EXTRA_BLUETOOTH_ADDRESS:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAdapter;->getBluetoothClass()Landroid/bluetooth/BluetoothClass;
-Landroid/bluetooth/BluetoothAdapter;->getControllerActivityEnergyInfo(I)Landroid/bluetooth/BluetoothActivityEnergyInfo;
-Landroid/bluetooth/BluetoothAdapter;->getDiscoveryEndMillis()J
-Landroid/bluetooth/BluetoothAdapter;->getLeAccess()Z
-Landroid/bluetooth/BluetoothAdapter;->getMaxConnectedAudioDevices()I
-Landroid/bluetooth/BluetoothAdapter;->getPeriodicAdvertisingManager()Landroid/bluetooth/le/PeriodicAdvertisingManager;
-Landroid/bluetooth/BluetoothAdapter;->getSupportedProfiles()Ljava/util/List;
-Landroid/bluetooth/BluetoothAdapter;->isHardwareTrackingFiltersAvailable()Z
-Landroid/bluetooth/BluetoothAdapter;->LE_PSM_CHARACTERISTIC_UUID:Ljava/util/UUID;
-Landroid/bluetooth/BluetoothAdapter;->listenUsingEncryptedRfcommOn(I)Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->listenUsingInsecureL2capCoc(I)Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->listenUsingInsecureL2capOn(I)Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->listenUsingInsecureRfcommOn(I)Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->listenUsingL2capCoc(I)Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->listenUsingL2capOn(I)Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->listenUsingL2capOn(IZZ)Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->listenUsingRfcommOn(I)Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->listenUsingScoOn()Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->mLeScanClients:Ljava/util/Map;
-Landroid/bluetooth/BluetoothAdapter;->mLock:Ljava/lang/Object;
-Landroid/bluetooth/BluetoothAdapter;->mManagerCallback:Landroid/bluetooth/IBluetoothManagerCallback;
-Landroid/bluetooth/BluetoothAdapter;->mManagerService:Landroid/bluetooth/IBluetoothManager;
-Landroid/bluetooth/BluetoothAdapter;->mProxyServiceStateCallbacks:Ljava/util/ArrayList;
-Landroid/bluetooth/BluetoothAdapter;->mServiceLock:Ljava/util/concurrent/locks/ReentrantReadWriteLock;
-Landroid/bluetooth/BluetoothAdapter;->mToken:Landroid/os/IBinder;
-Landroid/bluetooth/BluetoothAdapter;->nameForState(I)Ljava/lang/String;
-Landroid/bluetooth/BluetoothAdapter;->readOutOfBandData()Landroid/util/Pair;
-Landroid/bluetooth/BluetoothAdapter;->removeServiceStateCallback(Landroid/bluetooth/IBluetoothManagerCallback;)V
-Landroid/bluetooth/BluetoothAdapter;->requestControllerActivityEnergyInfo(Landroid/os/ResultReceiver;)V
-Landroid/bluetooth/BluetoothAdapter;->sAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothAdapter;->sBluetoothLeAdvertiser:Landroid/bluetooth/le/BluetoothLeAdvertiser;
-Landroid/bluetooth/BluetoothAdapter;->sBluetoothLeScanner:Landroid/bluetooth/le/BluetoothLeScanner;
-Landroid/bluetooth/BluetoothAdapter;->setBluetoothClass(Landroid/bluetooth/BluetoothClass;)Z
-Landroid/bluetooth/BluetoothAdapter;->SOCKET_CHANNEL_AUTO_STATIC_NO_SDP:I
-Landroid/bluetooth/BluetoothAdapter;->sPeriodicAdvertisingManager:Landroid/bluetooth/le/PeriodicAdvertisingManager;
-Landroid/bluetooth/BluetoothAdapter;->STATE_BLE_ON:I
-Landroid/bluetooth/BluetoothAdapter;->STATE_BLE_TURNING_OFF:I
-Landroid/bluetooth/BluetoothAdapter;->STATE_BLE_TURNING_ON:I
-Landroid/bluetooth/BluetoothAdapter;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAdapter;->toDeviceSet([Landroid/bluetooth/BluetoothDevice;)Ljava/util/Set;
-Landroid/bluetooth/BluetoothAdapter;->VDBG:Z
-Landroid/bluetooth/BluetoothAssignedNumbers;-><init>()V
-Landroid/bluetooth/BluetoothAudioConfig;-><init>(III)V
-Landroid/bluetooth/BluetoothAudioConfig;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/BluetoothAudioConfig;->getAudioFormat()I
-Landroid/bluetooth/BluetoothAudioConfig;->getChannelConfig()I
-Landroid/bluetooth/BluetoothAudioConfig;->getSampleRate()I
-Landroid/bluetooth/BluetoothAudioConfig;->mAudioFormat:I
-Landroid/bluetooth/BluetoothAudioConfig;->mChannelConfig:I
-Landroid/bluetooth/BluetoothAudioConfig;->mSampleRate:I
-Landroid/bluetooth/BluetoothAvrcp;-><init>()V
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_0:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_1:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_2:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_3:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_4:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_5:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_6:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_7:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_8:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_9:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_ANGLE:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_BACKWARD:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_CHAN_DOWN:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_CHAN_UP:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_CLEAR:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_CONT_MENU:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_DISP_INFO:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_DOT:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_DOWN:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_EJECT:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_ENTER:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_EXIT:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_F1:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_F2:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_F3:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_F4:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_F5:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_FAST_FOR:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_FAV_MENU:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_FORWARD:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_HELP:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_INPUT_SEL:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_LEFT:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_LEFT_DOWN:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_LEFT_UP:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_MUTE:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_PAGE_DOWN:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_PAGE_UP:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_PAUSE:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_PLAY:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_POWER:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_PREV_CHAN:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_RECORD:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_REWIND:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_RIGHT:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_RIGHT_DOWN:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_RIGHT_UP:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_ROOT_MENU:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_SELECT:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_SETUP_MENU:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_SOUND_SEL:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_STOP:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_SUBPICT:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_UP:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_VENDOR:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_VOL_DOWN:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_VOL_UP:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_KEYPRESSED_RELEASE:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_STATE_PRESS:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_STATE_RELEASE:I
-Landroid/bluetooth/BluetoothAvrcpController;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothAvrcpController;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAvrcpController;->ACTION_PLAYER_SETTING:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAvrcpController;->close()V
-Landroid/bluetooth/BluetoothAvrcpController;->DBG:Z
-Landroid/bluetooth/BluetoothAvrcpController;->doBind()Z
-Landroid/bluetooth/BluetoothAvrcpController;->EXTRA_PLAYER_SETTING:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAvrcpController;->getPlayerSettings(Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothAvrcpPlayerSettings;
-Landroid/bluetooth/BluetoothAvrcpController;->isEnabled()Z
-Landroid/bluetooth/BluetoothAvrcpController;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothAvrcpController;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothAvrcpController;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothAvrcpController;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothAvrcpController;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothAvrcpController;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothAvrcpController;->mService:Landroid/bluetooth/IBluetoothAvrcpController;
-Landroid/bluetooth/BluetoothAvrcpController;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothAvrcpController;->sendGroupNavigationCmd(Landroid/bluetooth/BluetoothDevice;II)V
-Landroid/bluetooth/BluetoothAvrcpController;->setPlayerApplicationSetting(Landroid/bluetooth/BluetoothAvrcpPlayerSettings;)Z
-Landroid/bluetooth/BluetoothAvrcpController;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAvrcpController;->VDBG:Z
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;-><init>(I)V
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->addSettingValue(II)V
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->getSettings()I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->getSettingValue(I)I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->mSettings:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->mSettingsValue:Ljava/util/Map;
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->SETTING_EQUALIZER:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->SETTING_REPEAT:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->SETTING_SCAN:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->SETTING_SHUFFLE:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->STATE_ALL_TRACK:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->STATE_GROUP:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->STATE_INVALID:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->STATE_OFF:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->STATE_ON:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->STATE_SINGLE_TRACK:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothClass$Device$Major;->BITMASK:I
-Landroid/bluetooth/BluetoothClass$Device;->BITMASK:I
-Landroid/bluetooth/BluetoothClass$Device;->PERIPHERAL_KEYBOARD:I
-Landroid/bluetooth/BluetoothClass$Device;->PERIPHERAL_KEYBOARD_POINTING:I
-Landroid/bluetooth/BluetoothClass$Device;->PERIPHERAL_NON_KEYBOARD_NON_POINTING:I
-Landroid/bluetooth/BluetoothClass$Device;->PERIPHERAL_POINTING:I
-Landroid/bluetooth/BluetoothClass$Service;->BITMASK:I
-Landroid/bluetooth/BluetoothClass;->ERROR:I
-Landroid/bluetooth/BluetoothClass;->getClassOfDevice()I
-Landroid/bluetooth/BluetoothClass;->getClassOfDeviceBytes()[B
-Landroid/bluetooth/BluetoothClass;->mClass:I
-Landroid/bluetooth/BluetoothClass;->PROFILE_A2DP_SINK:I
-Landroid/bluetooth/BluetoothClass;->PROFILE_HID:I
-Landroid/bluetooth/BluetoothClass;->PROFILE_NAP:I
-Landroid/bluetooth/BluetoothClass;->PROFILE_OPP:I
-Landroid/bluetooth/BluetoothClass;->PROFILE_PANU:I
-Landroid/bluetooth/BluetoothCodecConfig;->appendCapabilityToString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/bluetooth/BluetoothCodecConfig;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/BluetoothCodecConfig;->getCodecName()Ljava/lang/String;
-Landroid/bluetooth/BluetoothCodecConfig;->isMandatoryCodec()Z
-Landroid/bluetooth/BluetoothCodecConfig;->isValid()Z
-Landroid/bluetooth/BluetoothCodecConfig;->mBitsPerSample:I
-Landroid/bluetooth/BluetoothCodecConfig;->mChannelMode:I
-Landroid/bluetooth/BluetoothCodecConfig;->mCodecPriority:I
-Landroid/bluetooth/BluetoothCodecConfig;->mCodecSpecific1:J
-Landroid/bluetooth/BluetoothCodecConfig;->mCodecSpecific2:J
-Landroid/bluetooth/BluetoothCodecConfig;->mCodecSpecific3:J
-Landroid/bluetooth/BluetoothCodecConfig;->mCodecSpecific4:J
-Landroid/bluetooth/BluetoothCodecConfig;->mCodecType:I
-Landroid/bluetooth/BluetoothCodecConfig;->mSampleRate:I
-Landroid/bluetooth/BluetoothCodecConfig;->sameAudioFeedingParameters(Landroid/bluetooth/BluetoothCodecConfig;)Z
-Landroid/bluetooth/BluetoothCodecStatus;-><init>(Landroid/bluetooth/BluetoothCodecConfig;[Landroid/bluetooth/BluetoothCodecConfig;[Landroid/bluetooth/BluetoothCodecConfig;)V
-Landroid/bluetooth/BluetoothCodecStatus;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/BluetoothCodecStatus;->mCodecConfig:Landroid/bluetooth/BluetoothCodecConfig;
-Landroid/bluetooth/BluetoothCodecStatus;->mCodecsLocalCapabilities:[Landroid/bluetooth/BluetoothCodecConfig;
-Landroid/bluetooth/BluetoothCodecStatus;->mCodecsSelectableCapabilities:[Landroid/bluetooth/BluetoothCodecConfig;
-Landroid/bluetooth/BluetoothCodecStatus;->sameCapabilities([Landroid/bluetooth/BluetoothCodecConfig;[Landroid/bluetooth/BluetoothCodecConfig;)Z
-Landroid/bluetooth/BluetoothDevice;->ACTION_BATTERY_LEVEL_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->ACTION_CONNECTION_ACCESS_CANCEL:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->ACTION_CONNECTION_ACCESS_REPLY:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->ACTION_CONNECTION_ACCESS_REQUEST:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->ACTION_MAS_INSTANCE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->ACTION_NAME_FAILED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->BATTERY_LEVEL_UNKNOWN:I
-Landroid/bluetooth/BluetoothDevice;->BOND_SUCCESS:I
-Landroid/bluetooth/BluetoothDevice;->CONNECTION_ACCESS_NO:I
-Landroid/bluetooth/BluetoothDevice;->CONNECTION_ACCESS_YES:I
-Landroid/bluetooth/BluetoothDevice;->CONNECTION_STATE_CONNECTED:I
-Landroid/bluetooth/BluetoothDevice;->CONNECTION_STATE_DISCONNECTED:I
-Landroid/bluetooth/BluetoothDevice;->CONNECTION_STATE_ENCRYPTED_BREDR:I
-Landroid/bluetooth/BluetoothDevice;->CONNECTION_STATE_ENCRYPTED_LE:I
-Landroid/bluetooth/BluetoothDevice;->createBondOutOfBand(ILandroid/bluetooth/OobData;)Z
-Landroid/bluetooth/BluetoothDevice;->createInsecureL2capCocSocket(II)Landroid/bluetooth/BluetoothSocket;
-Landroid/bluetooth/BluetoothDevice;->createInsecureL2capSocket(I)Landroid/bluetooth/BluetoothSocket;
-Landroid/bluetooth/BluetoothDevice;->createL2capCocSocket(II)Landroid/bluetooth/BluetoothSocket;
-Landroid/bluetooth/BluetoothDevice;->createL2capSocket(I)Landroid/bluetooth/BluetoothSocket;
-Landroid/bluetooth/BluetoothDevice;->DBG:Z
-Landroid/bluetooth/BluetoothDevice;->EXTRA_ACCESS_REQUEST_TYPE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->EXTRA_ALWAYS_ALLOWED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->EXTRA_BATTERY_LEVEL:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->EXTRA_CLASS_NAME:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->EXTRA_CONNECTION_ACCESS_RESULT:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->EXTRA_MAS_INSTANCE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->EXTRA_PACKAGE_NAME:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->EXTRA_SDP_RECORD:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->getSimAccessPermission()I
-Landroid/bluetooth/BluetoothDevice;->isBluetoothEnabled()Z
-Landroid/bluetooth/BluetoothDevice;->mAddress:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->PAIRING_VARIANT_CONSENT:I
-Landroid/bluetooth/BluetoothDevice;->PAIRING_VARIANT_DISPLAY_PASSKEY:I
-Landroid/bluetooth/BluetoothDevice;->PAIRING_VARIANT_DISPLAY_PIN:I
-Landroid/bluetooth/BluetoothDevice;->PAIRING_VARIANT_OOB_CONSENT:I
-Landroid/bluetooth/BluetoothDevice;->PAIRING_VARIANT_PASSKEY:I
-Landroid/bluetooth/BluetoothDevice;->PAIRING_VARIANT_PIN_16_DIGITS:I
-Landroid/bluetooth/BluetoothDevice;->REQUEST_TYPE_MESSAGE_ACCESS:I
-Landroid/bluetooth/BluetoothDevice;->REQUEST_TYPE_PHONEBOOK_ACCESS:I
-Landroid/bluetooth/BluetoothDevice;->REQUEST_TYPE_PROFILE_CONNECTION:I
-Landroid/bluetooth/BluetoothDevice;->REQUEST_TYPE_SIM_ACCESS:I
-Landroid/bluetooth/BluetoothDevice;->sdpSearch(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothDevice;->setDeviceOutOfBandData([B[B)Z
-Landroid/bluetooth/BluetoothDevice;->setRemoteOutOfBandData()Z
-Landroid/bluetooth/BluetoothDevice;->sService:Landroid/bluetooth/IBluetooth;
-Landroid/bluetooth/BluetoothDevice;->sStateChangeCallback:Landroid/bluetooth/IBluetoothManagerCallback;
-Landroid/bluetooth/BluetoothDevice;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->UNBOND_REASON_AUTH_CANCELED:I
-Landroid/bluetooth/BluetoothDevice;->UNBOND_REASON_REMOVED:I
-Landroid/bluetooth/BluetoothDevicePicker;->ACTION_DEVICE_SELECTED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevicePicker;->ACTION_LAUNCH:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevicePicker;->EXTRA_FILTER_TYPE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevicePicker;->EXTRA_LAUNCH_CLASS:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevicePicker;->EXTRA_LAUNCH_PACKAGE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevicePicker;->EXTRA_NEED_AUTH:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevicePicker;->FILTER_TYPE_ALL:I
-Landroid/bluetooth/BluetoothDevicePicker;->FILTER_TYPE_AUDIO:I
-Landroid/bluetooth/BluetoothDevicePicker;->FILTER_TYPE_NAP:I
-Landroid/bluetooth/BluetoothDevicePicker;->FILTER_TYPE_PANU:I
-Landroid/bluetooth/BluetoothDevicePicker;->FILTER_TYPE_TRANSFER:I
-Landroid/bluetooth/BluetoothGatt;-><init>(Landroid/bluetooth/IBluetoothGatt;Landroid/bluetooth/BluetoothDevice;IZI)V
-Landroid/bluetooth/BluetoothGatt;->AUTHENTICATION_MITM:I
-Landroid/bluetooth/BluetoothGatt;->AUTHENTICATION_NONE:I
-Landroid/bluetooth/BluetoothGatt;->AUTHENTICATION_NO_MITM:I
-Landroid/bluetooth/BluetoothGatt;->AUTH_RETRY_STATE_IDLE:I
-Landroid/bluetooth/BluetoothGatt;->AUTH_RETRY_STATE_MITM:I
-Landroid/bluetooth/BluetoothGatt;->AUTH_RETRY_STATE_NO_MITM:I
-Landroid/bluetooth/BluetoothGatt;->CONN_STATE_CLOSED:I
-Landroid/bluetooth/BluetoothGatt;->CONN_STATE_CONNECTED:I
-Landroid/bluetooth/BluetoothGatt;->CONN_STATE_CONNECTING:I
-Landroid/bluetooth/BluetoothGatt;->CONN_STATE_DISCONNECTING:I
-Landroid/bluetooth/BluetoothGatt;->CONN_STATE_IDLE:I
-Landroid/bluetooth/BluetoothGatt;->DBG:Z
-Landroid/bluetooth/BluetoothGatt;->discoverServiceByUuid(Ljava/util/UUID;)Z
-Landroid/bluetooth/BluetoothGatt;->getCharacteristicById(Landroid/bluetooth/BluetoothDevice;I)Landroid/bluetooth/BluetoothGattCharacteristic;
-Landroid/bluetooth/BluetoothGatt;->getDescriptorById(Landroid/bluetooth/BluetoothDevice;I)Landroid/bluetooth/BluetoothGattDescriptor;
-Landroid/bluetooth/BluetoothGatt;->getService(Landroid/bluetooth/BluetoothDevice;Ljava/util/UUID;I)Landroid/bluetooth/BluetoothGattService;
-Landroid/bluetooth/BluetoothGatt;->mBluetoothGattCallback:Landroid/bluetooth/IBluetoothGattCallback;
-Landroid/bluetooth/BluetoothGatt;->mConnState:I
-Landroid/bluetooth/BluetoothGatt;->mDevice:Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/BluetoothGatt;->mHandler:Landroid/os/Handler;
-Landroid/bluetooth/BluetoothGatt;->mOpportunistic:Z
-Landroid/bluetooth/BluetoothGatt;->mPhy:I
-Landroid/bluetooth/BluetoothGatt;->mServices:Ljava/util/List;
-Landroid/bluetooth/BluetoothGatt;->mStateLock:Ljava/lang/Object;
-Landroid/bluetooth/BluetoothGatt;->readUsingCharacteristicUuid(Ljava/util/UUID;II)Z
-Landroid/bluetooth/BluetoothGatt;->registerApp(Landroid/bluetooth/BluetoothGattCallback;Landroid/os/Handler;)Z
-Landroid/bluetooth/BluetoothGatt;->requestLeConnectionUpdate(IIIIII)Z
-Landroid/bluetooth/BluetoothGatt;->runOrQueueCallback(Ljava/lang/Runnable;)V
-Landroid/bluetooth/BluetoothGatt;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothGatt;->VDBG:Z
-Landroid/bluetooth/BluetoothGattCallback;->onConnectionUpdated(Landroid/bluetooth/BluetoothGatt;IIII)V
-Landroid/bluetooth/BluetoothGattCharacteristic;-><init>(Landroid/bluetooth/BluetoothGattService;Ljava/util/UUID;III)V
-Landroid/bluetooth/BluetoothGattCharacteristic;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/BluetoothGattCharacteristic;-><init>(Ljava/util/UUID;III)V
-Landroid/bluetooth/BluetoothGattCharacteristic;->bytesToFloat(BB)F
-Landroid/bluetooth/BluetoothGattCharacteristic;->bytesToFloat(BBBB)F
-Landroid/bluetooth/BluetoothGattCharacteristic;->getDescriptor(Ljava/util/UUID;I)Landroid/bluetooth/BluetoothGattDescriptor;
-Landroid/bluetooth/BluetoothGattCharacteristic;->getKeySize()I
-Landroid/bluetooth/BluetoothGattCharacteristic;->getTypeLen(I)I
-Landroid/bluetooth/BluetoothGattCharacteristic;->initCharacteristic(Landroid/bluetooth/BluetoothGattService;Ljava/util/UUID;III)V
-Landroid/bluetooth/BluetoothGattCharacteristic;->intToSignedBits(II)I
-Landroid/bluetooth/BluetoothGattCharacteristic;->mKeySize:I
-Landroid/bluetooth/BluetoothGattCharacteristic;->mPermissions:I
-Landroid/bluetooth/BluetoothGattCharacteristic;->mProperties:I
-Landroid/bluetooth/BluetoothGattCharacteristic;->mUuid:Ljava/util/UUID;
-Landroid/bluetooth/BluetoothGattCharacteristic;->mValue:[B
-Landroid/bluetooth/BluetoothGattCharacteristic;->mWriteType:I
-Landroid/bluetooth/BluetoothGattCharacteristic;->setInstanceId(I)V
-Landroid/bluetooth/BluetoothGattCharacteristic;->unsignedBytesToInt(BB)I
-Landroid/bluetooth/BluetoothGattCharacteristic;->unsignedBytesToInt(BBBB)I
-Landroid/bluetooth/BluetoothGattCharacteristic;->unsignedByteToInt(B)I
-Landroid/bluetooth/BluetoothGattCharacteristic;->unsignedToSigned(II)I
-Landroid/bluetooth/BluetoothGattDescriptor;-><init>(Landroid/bluetooth/BluetoothGattCharacteristic;Ljava/util/UUID;II)V
-Landroid/bluetooth/BluetoothGattDescriptor;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/BluetoothGattDescriptor;-><init>(Ljava/util/UUID;II)V
-Landroid/bluetooth/BluetoothGattDescriptor;->getInstanceId()I
-Landroid/bluetooth/BluetoothGattDescriptor;->initDescriptor(Landroid/bluetooth/BluetoothGattCharacteristic;Ljava/util/UUID;II)V
-Landroid/bluetooth/BluetoothGattDescriptor;->mPermissions:I
-Landroid/bluetooth/BluetoothGattDescriptor;->mUuid:Ljava/util/UUID;
-Landroid/bluetooth/BluetoothGattDescriptor;->mValue:[B
-Landroid/bluetooth/BluetoothGattDescriptor;->setInstanceId(I)V
-Landroid/bluetooth/BluetoothGattIncludedService;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/BluetoothGattIncludedService;-><init>(Ljava/util/UUID;II)V
-Landroid/bluetooth/BluetoothGattIncludedService;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/BluetoothGattIncludedService;->getInstanceId()I
-Landroid/bluetooth/BluetoothGattIncludedService;->getType()I
-Landroid/bluetooth/BluetoothGattIncludedService;->getUuid()Ljava/util/UUID;
-Landroid/bluetooth/BluetoothGattIncludedService;->mInstanceId:I
-Landroid/bluetooth/BluetoothGattIncludedService;->mServiceType:I
-Landroid/bluetooth/BluetoothGattIncludedService;->mUuid:Ljava/util/UUID;
-Landroid/bluetooth/BluetoothGattServer;-><init>(Landroid/bluetooth/IBluetoothGatt;I)V
-Landroid/bluetooth/BluetoothGattServer;->CALLBACK_REG_TIMEOUT:I
-Landroid/bluetooth/BluetoothGattServer;->DBG:Z
-Landroid/bluetooth/BluetoothGattServer;->getCharacteristicByHandle(I)Landroid/bluetooth/BluetoothGattCharacteristic;
-Landroid/bluetooth/BluetoothGattServer;->getDescriptorByHandle(I)Landroid/bluetooth/BluetoothGattDescriptor;
-Landroid/bluetooth/BluetoothGattServer;->getService(Ljava/util/UUID;II)Landroid/bluetooth/BluetoothGattService;
-Landroid/bluetooth/BluetoothGattServer;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothGattServer;->mBluetoothGattServerCallback:Landroid/bluetooth/IBluetoothGattServerCallback;
-Landroid/bluetooth/BluetoothGattServer;->mCallback:Landroid/bluetooth/BluetoothGattServerCallback;
-Landroid/bluetooth/BluetoothGattServer;->mPendingService:Landroid/bluetooth/BluetoothGattService;
-Landroid/bluetooth/BluetoothGattServer;->mServerIf:I
-Landroid/bluetooth/BluetoothGattServer;->mServerIfLock:Ljava/lang/Object;
-Landroid/bluetooth/BluetoothGattServer;->mService:Landroid/bluetooth/IBluetoothGatt;
-Landroid/bluetooth/BluetoothGattServer;->mServices:Ljava/util/List;
-Landroid/bluetooth/BluetoothGattServer;->mTransport:I
-Landroid/bluetooth/BluetoothGattServer;->registerCallback(Landroid/bluetooth/BluetoothGattServerCallback;)Z
-Landroid/bluetooth/BluetoothGattServer;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothGattServer;->unregisterCallback()V
-Landroid/bluetooth/BluetoothGattServer;->VDBG:Z
-Landroid/bluetooth/BluetoothGattServerCallback;->onConnectionUpdated(Landroid/bluetooth/BluetoothDevice;IIII)V
-Landroid/bluetooth/BluetoothGattService;-><init>(Landroid/bluetooth/BluetoothDevice;Ljava/util/UUID;II)V
-Landroid/bluetooth/BluetoothGattService;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/BluetoothGattService;-><init>(Ljava/util/UUID;II)V
-Landroid/bluetooth/BluetoothGattService;->addIncludedService(Landroid/bluetooth/BluetoothGattService;)V
-Landroid/bluetooth/BluetoothGattService;->getCharacteristic(Ljava/util/UUID;I)Landroid/bluetooth/BluetoothGattCharacteristic;
-Landroid/bluetooth/BluetoothGattService;->getDevice()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/BluetoothGattService;->getHandles()I
-Landroid/bluetooth/BluetoothGattService;->isAdvertisePreferred()Z
-Landroid/bluetooth/BluetoothGattService;->mAdvertisePreferred:Z
-Landroid/bluetooth/BluetoothGattService;->mHandles:I
-Landroid/bluetooth/BluetoothGattService;->mInstanceId:I
-Landroid/bluetooth/BluetoothGattService;->mServiceType:I
-Landroid/bluetooth/BluetoothGattService;->mUuid:Ljava/util/UUID;
-Landroid/bluetooth/BluetoothGattService;->setDevice(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/BluetoothGattService;->setHandles(I)V
-Landroid/bluetooth/BluetoothHeadset;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothHeadset;->ACTION_HF_INDICATORS_VALUE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadset;->clccResponse(IIIIZLjava/lang/String;I)V
-Landroid/bluetooth/BluetoothHeadset;->DBG:Z
-Landroid/bluetooth/BluetoothHeadset;->doBind()Z
-Landroid/bluetooth/BluetoothHeadset;->doUnbind()V
-Landroid/bluetooth/BluetoothHeadset;->EXTRA_HF_INDICATORS_IND_ID:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadset;->EXTRA_HF_INDICATORS_IND_VALUE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadset;->getAudioRouteAllowed()Z
-Landroid/bluetooth/BluetoothHeadset;->isAudioOn()Z
-Landroid/bluetooth/BluetoothHeadset;->isBluetoothVoiceDialingEnabled(Landroid/content/Context;)Z
-Landroid/bluetooth/BluetoothHeadset;->isDisabled()Z
-Landroid/bluetooth/BluetoothHeadset;->isInbandRingingEnabled()Z
-Landroid/bluetooth/BluetoothHeadset;->isInbandRingingSupported(Landroid/content/Context;)Z
-Landroid/bluetooth/BluetoothHeadset;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadset;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothHeadset;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothHeadset;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothHeadset;->mConnection:Landroid/bluetooth/IBluetoothProfileServiceConnection;
-Landroid/bluetooth/BluetoothHeadset;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothHeadset;->MESSAGE_HEADSET_SERVICE_CONNECTED:I
-Landroid/bluetooth/BluetoothHeadset;->MESSAGE_HEADSET_SERVICE_DISCONNECTED:I
-Landroid/bluetooth/BluetoothHeadset;->mHandler:Landroid/os/Handler;
-Landroid/bluetooth/BluetoothHeadset;->mService:Landroid/bluetooth/IBluetoothHeadset;
-Landroid/bluetooth/BluetoothHeadset;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothHeadset;->setAudioRouteAllowed(Z)V
-Landroid/bluetooth/BluetoothHeadset;->setForceScoAudio(Z)V
-Landroid/bluetooth/BluetoothHeadset;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadset;->VDBG:Z
-Landroid/bluetooth/BluetoothHeadset;->VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadset;->VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV_BATTERY_LEVEL:I
-Landroid/bluetooth/BluetoothHeadset;->VENDOR_SPECIFIC_HEADSET_EVENT_XAPL:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadset;->VENDOR_SPECIFIC_HEADSET_EVENT_XEVENT:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadset;->VENDOR_SPECIFIC_HEADSET_EVENT_XEVENT_BATTERY_LEVEL:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_AG_EVENT:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_AUDIO_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_CALL_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_LAST_VTAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_RESULT:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_RESULT_ERROR:I
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_RESULT_ERROR_BLACKLISTED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_RESULT_ERROR_BUSY:I
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_RESULT_ERROR_CME:I
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_RESULT_ERROR_DELAYED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_RESULT_ERROR_NO_ANSWER:I
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_RESULT_ERROR_NO_CARRIER:I
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_RESULT_OK:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CALL_ACCEPT_HOLD:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CALL_ACCEPT_NONE:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CALL_ACCEPT_TERMINATE:I
-Landroid/bluetooth/BluetoothHeadsetClient;->close()V
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_CORPORATE_PERSONALIZATION_PIN_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_CORPORATE_PERSONALIZATION_PUK_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_DIAL_STRING_TOO_LONG:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_EAP_NOT_SUPPORTED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_EMERGENCY_SERVICE_ONLY:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_HIDDEN_KEY_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_INCORRECT_PARAMETERS:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_INCORRECT_PASSWORD:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_INVALID_CHARACTER_IN_DIAL_STRING:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_INVALID_CHARACTER_IN_TEXT_STRING:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_INVALID_INDEX:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_MEMORY_FAILURE:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_MEMORY_FULL:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NETWORK_PERSONALIZATION_PIN_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NETWORK_PERSONALIZATION_PUK_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NETWORK_SUBSET_PERSONALIZATION_PIN_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NETWORK_SUBSET_PERSONALIZATION_PUK_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NETWORK_TIMEOUT:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NOT_FOUND:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NOT_SUPPORTED_FOR_VOIP:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NO_CONNECTION_TO_PHONE:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NO_NETWORK_SERVICE:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NO_SIMULTANOUS_VOIP_CS_CALLS:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_OPERATION_NOT_ALLOWED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_OPERATION_NOT_SUPPORTED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_PHFSIM_PIN_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_PHFSIM_PUK_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_PHONE_FAILURE:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_PHSIM_PIN_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SERVICE_PROVIDER_PERSONALIZATION_PIN_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SERVICE_PROVIDER_PERSONALIZATION_PUK_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SIM_BUSY:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SIM_FAILURE:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SIM_NOT_INSERTED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SIM_PIN2_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SIM_PIN_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SIM_PUK2_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SIM_PUK_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SIM_WRONG:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SIP_RESPONSE_CODE:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_TEXT_STRING_TOO_LONG:I
-Landroid/bluetooth/BluetoothHeadsetClient;->connectAudio(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->DBG:Z
-Landroid/bluetooth/BluetoothHeadsetClient;->dial(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;)Landroid/bluetooth/BluetoothHeadsetClientCall;
-Landroid/bluetooth/BluetoothHeadsetClient;->disconnectAudio(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->doBind()Z
-Landroid/bluetooth/BluetoothHeadsetClient;->enterPrivateMode(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->explicitCallTransfer(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_3WAY_CALLING:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_ACCEPT_HELD_OR_WAITING_CALL:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_ATTACH_NUMBER_TO_VT:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_ECC:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_MERGE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_MERGE_AND_DETACH:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_REJECT_CALL:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_RELEASE_AND_ACCEPT:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_RELEASE_HELD_OR_WAITING_CALL:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_RESPONSE_AND_HOLD:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_VOICE_RECOGNITION:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AUDIO_WBS:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_BATTERY_LEVEL:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_CALL:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_CME_CODE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_IN_BAND_RING:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_NETWORK_ROAMING:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_NETWORK_SIGNAL_STRENGTH:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_NETWORK_STATUS:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_NUMBER:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_OPERATOR_NAME:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_RESULT_CODE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_SUBSCRIBER_INFO:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_VOICE_RECOGNITION:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->getAudioRouteAllowed(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->getCurrentAgEvents(Landroid/bluetooth/BluetoothDevice;)Landroid/os/Bundle;
-Landroid/bluetooth/BluetoothHeadsetClient;->getCurrentAgFeatures(Landroid/bluetooth/BluetoothDevice;)Landroid/os/Bundle;
-Landroid/bluetooth/BluetoothHeadsetClient;->getCurrentCalls(Landroid/bluetooth/BluetoothDevice;)Ljava/util/List;
-Landroid/bluetooth/BluetoothHeadsetClient;->getLastVoiceTagNumber(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothHeadsetClient;->holdCall(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->isEnabled()Z
-Landroid/bluetooth/BluetoothHeadsetClient;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothHeadsetClient;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothHeadsetClient;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothHeadsetClient;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothHeadsetClient;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothHeadsetClient;->mService:Landroid/bluetooth/IBluetoothHeadsetClient;
-Landroid/bluetooth/BluetoothHeadsetClient;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothHeadsetClient;->sendDTMF(Landroid/bluetooth/BluetoothDevice;B)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->setAudioRouteAllowed(Landroid/bluetooth/BluetoothDevice;Z)V
-Landroid/bluetooth/BluetoothHeadsetClient;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->startVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->STATE_AUDIO_CONNECTED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->STATE_AUDIO_CONNECTING:I
-Landroid/bluetooth/BluetoothHeadsetClient;->STATE_AUDIO_DISCONNECTED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->stopVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->terminateCall(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHeadsetClientCall;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->VDBG:Z
-Landroid/bluetooth/BluetoothHeadsetClientCall;-><init>(Landroid/bluetooth/BluetoothDevice;IILjava/lang/String;ZZZ)V
-Landroid/bluetooth/BluetoothHeadsetClientCall;-><init>(Landroid/bluetooth/BluetoothDevice;ILjava/util/UUID;ILjava/lang/String;ZZZ)V
-Landroid/bluetooth/BluetoothHeadsetClientCall;->CALL_STATE_ACTIVE:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->CALL_STATE_ALERTING:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->CALL_STATE_DIALING:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->CALL_STATE_HELD:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->CALL_STATE_HELD_BY_RESPONSE_AND_HOLD:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->CALL_STATE_INCOMING:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->CALL_STATE_TERMINATED:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->CALL_STATE_WAITING:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/BluetoothHeadsetClientCall;->getCreationElapsedMilli()J
-Landroid/bluetooth/BluetoothHeadsetClientCall;->getDevice()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/BluetoothHeadsetClientCall;->getUUID()Ljava/util/UUID;
-Landroid/bluetooth/BluetoothHeadsetClientCall;->isInBandRing()Z
-Landroid/bluetooth/BluetoothHeadsetClientCall;->mCreationElapsedMilli:J
-Landroid/bluetooth/BluetoothHeadsetClientCall;->mDevice:Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/BluetoothHeadsetClientCall;->mId:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->mInBandRing:Z
-Landroid/bluetooth/BluetoothHeadsetClientCall;->mMultiParty:Z
-Landroid/bluetooth/BluetoothHeadsetClientCall;->mNumber:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClientCall;->mOutgoing:Z
-Landroid/bluetooth/BluetoothHeadsetClientCall;->mState:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->mUUID:Ljava/util/UUID;
-Landroid/bluetooth/BluetoothHeadsetClientCall;->setMultiParty(Z)V
-Landroid/bluetooth/BluetoothHeadsetClientCall;->setNumber(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothHeadsetClientCall;->setState(I)V
-Landroid/bluetooth/BluetoothHeadsetClientCall;->toString(Z)Ljava/lang/String;
-Landroid/bluetooth/BluetoothHealth$BluetoothHealthCallbackWrapper;-><init>(Landroid/bluetooth/BluetoothHealthCallback;)V
-Landroid/bluetooth/BluetoothHealth$BluetoothHealthCallbackWrapper;->mCallback:Landroid/bluetooth/BluetoothHealthCallback;
-Landroid/bluetooth/BluetoothHealth$BluetoothHealthCallbackWrapper;->onHealthAppConfigurationStatusChange(Landroid/bluetooth/BluetoothHealthAppConfiguration;I)V
-Landroid/bluetooth/BluetoothHealth$BluetoothHealthCallbackWrapper;->onHealthChannelStateChange(Landroid/bluetooth/BluetoothHealthAppConfiguration;Landroid/bluetooth/BluetoothDevice;IILandroid/os/ParcelFileDescriptor;I)V
-Landroid/bluetooth/BluetoothHealth;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothHealth;->CHANNEL_TYPE_ANY:I
-Landroid/bluetooth/BluetoothHealth;->checkAppParam(Ljava/lang/String;IILandroid/bluetooth/BluetoothHealthCallback;)Z
-Landroid/bluetooth/BluetoothHealth;->close()V
-Landroid/bluetooth/BluetoothHealth;->connectChannelToSink(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;I)Z
-Landroid/bluetooth/BluetoothHealth;->DBG:Z
-Landroid/bluetooth/BluetoothHealth;->doBind()Z
-Landroid/bluetooth/BluetoothHealth;->HEALTH_OPERATION_ERROR:I
-Landroid/bluetooth/BluetoothHealth;->HEALTH_OPERATION_GENERIC_FAILURE:I
-Landroid/bluetooth/BluetoothHealth;->HEALTH_OPERATION_INVALID_ARGS:I
-Landroid/bluetooth/BluetoothHealth;->HEALTH_OPERATION_NOT_ALLOWED:I
-Landroid/bluetooth/BluetoothHealth;->HEALTH_OPERATION_NOT_FOUND:I
-Landroid/bluetooth/BluetoothHealth;->HEALTH_OPERATION_SUCCESS:I
-Landroid/bluetooth/BluetoothHealth;->isEnabled()Z
-Landroid/bluetooth/BluetoothHealth;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHealth;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothHealth;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothHealth;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothHealth;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothHealth;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothHealth;->mService:Landroid/bluetooth/IBluetoothHealth;
-Landroid/bluetooth/BluetoothHealth;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothHealth;->registerAppConfiguration(Ljava/lang/String;IIILandroid/bluetooth/BluetoothHealthCallback;)Z
-Landroid/bluetooth/BluetoothHealth;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHealth;->VDBG:Z
-Landroid/bluetooth/BluetoothHealthAppConfiguration;-><init>(Ljava/lang/String;I)V
-Landroid/bluetooth/BluetoothHealthAppConfiguration;-><init>(Ljava/lang/String;III)V
-Landroid/bluetooth/BluetoothHealthAppConfiguration;->getChannelType()I
-Landroid/bluetooth/BluetoothHealthAppConfiguration;->mChannelType:I
-Landroid/bluetooth/BluetoothHealthAppConfiguration;->mDataType:I
-Landroid/bluetooth/BluetoothHealthAppConfiguration;->mName:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHealthAppConfiguration;->mRole:I
-Landroid/bluetooth/BluetoothHealthCallback;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHearingAid;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothHearingAid;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHearingAid;->ACTION_PLAYING_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHearingAid;->adjustVolume(I)V
-Landroid/bluetooth/BluetoothHearingAid;->close()V
-Landroid/bluetooth/BluetoothHearingAid;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHearingAid;->DBG:Z
-Landroid/bluetooth/BluetoothHearingAid;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHearingAid;->doBind()V
-Landroid/bluetooth/BluetoothHearingAid;->getDeviceMode(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothHearingAid;->getDeviceSide(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothHearingAid;->getHiSyncId(Landroid/bluetooth/BluetoothDevice;)J
-Landroid/bluetooth/BluetoothHearingAid;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothHearingAid;->getVolume()I
-Landroid/bluetooth/BluetoothHearingAid;->HI_SYNC_ID_INVALID:J
-Landroid/bluetooth/BluetoothHearingAid;->isEnabled()Z
-Landroid/bluetooth/BluetoothHearingAid;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHearingAid;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothHearingAid;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothHearingAid;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothHearingAid;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothHearingAid;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothHearingAid;->MODE_BINAURAL:I
-Landroid/bluetooth/BluetoothHearingAid;->MODE_MONAURAL:I
-Landroid/bluetooth/BluetoothHearingAid;->mService:Landroid/bluetooth/IBluetoothHearingAid;
-Landroid/bluetooth/BluetoothHearingAid;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothHearingAid;->mServiceLock:Ljava/util/concurrent/locks/ReentrantReadWriteLock;
-Landroid/bluetooth/BluetoothHearingAid;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothHearingAid;->setVolume(I)V
-Landroid/bluetooth/BluetoothHearingAid;->SIDE_LEFT:I
-Landroid/bluetooth/BluetoothHearingAid;->SIDE_RIGHT:I
-Landroid/bluetooth/BluetoothHearingAid;->stateToString(I)Ljava/lang/String;
-Landroid/bluetooth/BluetoothHearingAid;->STATE_NOT_PLAYING:I
-Landroid/bluetooth/BluetoothHearingAid;->STATE_PLAYING:I
-Landroid/bluetooth/BluetoothHearingAid;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHearingAid;->VDBG:Z
-Landroid/bluetooth/BluetoothHidDevice$Callback;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;-><init>(Ljava/util/concurrent/Executor;Landroid/bluetooth/BluetoothHidDevice$Callback;)V
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;->mCallback:Landroid/bluetooth/BluetoothHidDevice$Callback;
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;->mExecutor:Ljava/util/concurrent/Executor;
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;->onAppStatusChanged(Landroid/bluetooth/BluetoothDevice;Z)V
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;->onConnectionStateChanged(Landroid/bluetooth/BluetoothDevice;I)V
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;->onGetReport(Landroid/bluetooth/BluetoothDevice;BBI)V
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;->onInterruptData(Landroid/bluetooth/BluetoothDevice;B[B)V
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;->onSetProtocol(Landroid/bluetooth/BluetoothDevice;B)V
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;->onSetReport(Landroid/bluetooth/BluetoothDevice;BB[B)V
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;->onVirtualCableUnplug(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/BluetoothHidDevice;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothHidDevice;->close()V
-Landroid/bluetooth/BluetoothHidDevice;->doBind()Z
-Landroid/bluetooth/BluetoothHidDevice;->doUnbind()V
-Landroid/bluetooth/BluetoothHidDevice;->getUserAppName()Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidDevice;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothHidDevice;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothHidDevice;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothHidDevice;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothHidDevice;->mService:Landroid/bluetooth/IBluetoothHidDevice;
-Landroid/bluetooth/BluetoothHidDevice;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothHidDevice;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;->mDelayVariation:I
-Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;->mLatency:I
-Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;->mPeakBandwidth:I
-Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;->mServiceType:I
-Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;->mTokenBucketSize:I
-Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;->mTokenRate:I
-Landroid/bluetooth/BluetoothHidDeviceAppSdpSettings;->mDescription:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidDeviceAppSdpSettings;->mDescriptors:[B
-Landroid/bluetooth/BluetoothHidDeviceAppSdpSettings;->mName:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidDeviceAppSdpSettings;->mProvider:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidDeviceAppSdpSettings;->mSubclass:B
-Landroid/bluetooth/BluetoothHidHost;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothHidHost;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->ACTION_HANDSHAKE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->ACTION_IDLE_TIME_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->ACTION_PROTOCOL_MODE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->ACTION_REPORT:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->ACTION_VIRTUAL_UNPLUG_STATUS:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->close()V
-Landroid/bluetooth/BluetoothHidHost;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHidHost;->DBG:Z
-Landroid/bluetooth/BluetoothHidHost;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHidHost;->doBind()Z
-Landroid/bluetooth/BluetoothHidHost;->EXTRA_IDLE_TIME:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->EXTRA_PROTOCOL_MODE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->EXTRA_REPORT:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->EXTRA_REPORT_BUFFER_SIZE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->EXTRA_REPORT_ID:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->EXTRA_REPORT_TYPE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->EXTRA_STATUS:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->EXTRA_VIRTUAL_UNPLUG_STATUS:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->getIdleTime(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHidHost;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothHidHost;->getProtocolMode(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHidHost;->getReport(Landroid/bluetooth/BluetoothDevice;BBI)Z
-Landroid/bluetooth/BluetoothHidHost;->INPUT_CONNECT_FAILED_ALREADY_CONNECTED:I
-Landroid/bluetooth/BluetoothHidHost;->INPUT_CONNECT_FAILED_ATTEMPT_FAILED:I
-Landroid/bluetooth/BluetoothHidHost;->INPUT_DISCONNECT_FAILED_NOT_CONNECTED:I
-Landroid/bluetooth/BluetoothHidHost;->INPUT_OPERATION_GENERIC_FAILURE:I
-Landroid/bluetooth/BluetoothHidHost;->INPUT_OPERATION_SUCCESS:I
-Landroid/bluetooth/BluetoothHidHost;->isEnabled()Z
-Landroid/bluetooth/BluetoothHidHost;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHidHost;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothHidHost;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothHidHost;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothHidHost;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothHidHost;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothHidHost;->mService:Landroid/bluetooth/IBluetoothHidHost;
-Landroid/bluetooth/BluetoothHidHost;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothHidHost;->PROTOCOL_BOOT_MODE:I
-Landroid/bluetooth/BluetoothHidHost;->PROTOCOL_REPORT_MODE:I
-Landroid/bluetooth/BluetoothHidHost;->PROTOCOL_UNSUPPORTED_MODE:I
-Landroid/bluetooth/BluetoothHidHost;->REPORT_TYPE_FEATURE:B
-Landroid/bluetooth/BluetoothHidHost;->REPORT_TYPE_INPUT:B
-Landroid/bluetooth/BluetoothHidHost;->REPORT_TYPE_OUTPUT:B
-Landroid/bluetooth/BluetoothHidHost;->sendData(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;)Z
-Landroid/bluetooth/BluetoothHidHost;->setIdleTime(Landroid/bluetooth/BluetoothDevice;B)Z
-Landroid/bluetooth/BluetoothHidHost;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothHidHost;->setProtocolMode(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothHidHost;->setReport(Landroid/bluetooth/BluetoothDevice;BLjava/lang/String;)Z
-Landroid/bluetooth/BluetoothHidHost;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->VDBG:Z
-Landroid/bluetooth/BluetoothHidHost;->virtualUnplug(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHidHost;->VIRTUAL_UNPLUG_STATUS_FAIL:I
-Landroid/bluetooth/BluetoothHidHost;->VIRTUAL_UNPLUG_STATUS_SUCCESS:I
-Landroid/bluetooth/BluetoothInputStream;-><init>(Landroid/bluetooth/BluetoothSocket;)V
-Landroid/bluetooth/BluetoothInputStream;->mSocket:Landroid/bluetooth/BluetoothSocket;
-Landroid/bluetooth/BluetoothManager;-><init>(Landroid/content/Context;)V
-Landroid/bluetooth/BluetoothManager;->DBG:Z
-Landroid/bluetooth/BluetoothManager;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothManager;->openGattServer(Landroid/content/Context;Landroid/bluetooth/BluetoothGattServerCallback;I)Landroid/bluetooth/BluetoothGattServer;
-Landroid/bluetooth/BluetoothManager;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothManager;->VDBG:Z
-Landroid/bluetooth/BluetoothMap;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothMap;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMap;->close()V
-Landroid/bluetooth/BluetoothMap;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothMap;->DBG:Z
-Landroid/bluetooth/BluetoothMap;->doBind()Z
-Landroid/bluetooth/BluetoothMap;->doesClassMatchSink(Landroid/bluetooth/BluetoothClass;)Z
-Landroid/bluetooth/BluetoothMap;->getClient()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/BluetoothMap;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothMap;->getState()I
-Landroid/bluetooth/BluetoothMap;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothMap;->isEnabled()Z
-Landroid/bluetooth/BluetoothMap;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothMap;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothMap;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothMap;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothMap;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothMap;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothMap;->mService:Landroid/bluetooth/IBluetoothMap;
-Landroid/bluetooth/BluetoothMap;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothMap;->RESULT_CANCELED:I
-Landroid/bluetooth/BluetoothMap;->RESULT_FAILURE:I
-Landroid/bluetooth/BluetoothMap;->RESULT_SUCCESS:I
-Landroid/bluetooth/BluetoothMap;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothMap;->STATE_ERROR:I
-Landroid/bluetooth/BluetoothMap;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMap;->VDBG:Z
-Landroid/bluetooth/BluetoothMapClient;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothMapClient;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMapClient;->ACTION_MESSAGE_DELIVERED_SUCCESSFULLY:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMapClient;->ACTION_MESSAGE_RECEIVED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMapClient;->ACTION_MESSAGE_SENT_SUCCESSFULLY:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMapClient;->close()V
-Landroid/bluetooth/BluetoothMapClient;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothMapClient;->DBG:Z
-Landroid/bluetooth/BluetoothMapClient;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothMapClient;->doBind()Z
-Landroid/bluetooth/BluetoothMapClient;->EXTRA_MESSAGE_HANDLE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMapClient;->EXTRA_SENDER_CONTACT_NAME:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMapClient;->EXTRA_SENDER_CONTACT_URI:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMapClient;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothMapClient;->getUnreadMessages(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothMapClient;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothMapClient;->isEnabled()Z
-Landroid/bluetooth/BluetoothMapClient;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothMapClient;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothMapClient;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothMapClient;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothMapClient;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothMapClient;->mService:Landroid/bluetooth/IBluetoothMapClient;
-Landroid/bluetooth/BluetoothMapClient;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothMapClient;->RESULT_CANCELED:I
-Landroid/bluetooth/BluetoothMapClient;->RESULT_FAILURE:I
-Landroid/bluetooth/BluetoothMapClient;->RESULT_SUCCESS:I
-Landroid/bluetooth/BluetoothMapClient;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothMapClient;->STATE_ERROR:I
-Landroid/bluetooth/BluetoothMapClient;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMapClient;->VDBG:Z
-Landroid/bluetooth/BluetoothMasInstance$MessageType;-><init>()V
-Landroid/bluetooth/BluetoothMasInstance$MessageType;->EMAIL:I
-Landroid/bluetooth/BluetoothMasInstance$MessageType;->MMS:I
-Landroid/bluetooth/BluetoothMasInstance$MessageType;->SMS_CDMA:I
-Landroid/bluetooth/BluetoothMasInstance$MessageType;->SMS_GSM:I
-Landroid/bluetooth/BluetoothMasInstance;-><init>(ILjava/lang/String;II)V
-Landroid/bluetooth/BluetoothMasInstance;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/BluetoothMasInstance;->getChannel()I
-Landroid/bluetooth/BluetoothMasInstance;->getId()I
-Landroid/bluetooth/BluetoothMasInstance;->getMsgTypes()I
-Landroid/bluetooth/BluetoothMasInstance;->getName()Ljava/lang/String;
-Landroid/bluetooth/BluetoothMasInstance;->mChannel:I
-Landroid/bluetooth/BluetoothMasInstance;->mId:I
-Landroid/bluetooth/BluetoothMasInstance;->mMsgTypes:I
-Landroid/bluetooth/BluetoothMasInstance;->mName:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMasInstance;->msgSupported(I)Z
-Landroid/bluetooth/BluetoothOutputStream;-><init>(Landroid/bluetooth/BluetoothSocket;)V
-Landroid/bluetooth/BluetoothOutputStream;->mSocket:Landroid/bluetooth/BluetoothSocket;
-Landroid/bluetooth/BluetoothPan;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothPan;->DBG:Z
-Landroid/bluetooth/BluetoothPan;->EXTRA_LOCAL_ROLE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothPan;->LOCAL_NAP_ROLE:I
-Landroid/bluetooth/BluetoothPan;->LOCAL_PANU_ROLE:I
-Landroid/bluetooth/BluetoothPan;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothPan;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothPan;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothPan;->mPanService:Landroid/bluetooth/IBluetoothPan;
-Landroid/bluetooth/BluetoothPan;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothPan;->mStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothPan;->PAN_CONNECT_FAILED_ALREADY_CONNECTED:I
-Landroid/bluetooth/BluetoothPan;->PAN_CONNECT_FAILED_ATTEMPT_FAILED:I
-Landroid/bluetooth/BluetoothPan;->PAN_DISCONNECT_FAILED_NOT_CONNECTED:I
-Landroid/bluetooth/BluetoothPan;->PAN_OPERATION_GENERIC_FAILURE:I
-Landroid/bluetooth/BluetoothPan;->PAN_OPERATION_SUCCESS:I
-Landroid/bluetooth/BluetoothPan;->PAN_ROLE_NONE:I
-Landroid/bluetooth/BluetoothPan;->REMOTE_NAP_ROLE:I
-Landroid/bluetooth/BluetoothPan;->REMOTE_PANU_ROLE:I
-Landroid/bluetooth/BluetoothPan;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothPan;->VDBG:Z
-Landroid/bluetooth/BluetoothPbap$ServiceListener;->onServiceConnected(Landroid/bluetooth/BluetoothPbap;)V
-Landroid/bluetooth/BluetoothPbap$ServiceListener;->onServiceDisconnected()V
-Landroid/bluetooth/BluetoothPbap;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothPbap$ServiceListener;)V
-Landroid/bluetooth/BluetoothPbap;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothPbap;->close()V
-Landroid/bluetooth/BluetoothPbap;->DBG:Z
-Landroid/bluetooth/BluetoothPbap;->doBind()Z
-Landroid/bluetooth/BluetoothPbap;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothPbap;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothPbap;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothPbap;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothPbap;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothPbap;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothPbap;->mService:Landroid/bluetooth/IBluetoothPbap;
-Landroid/bluetooth/BluetoothPbap;->mServiceListener:Landroid/bluetooth/BluetoothPbap$ServiceListener;
-Landroid/bluetooth/BluetoothPbap;->RESULT_CANCELED:I
-Landroid/bluetooth/BluetoothPbap;->RESULT_FAILURE:I
-Landroid/bluetooth/BluetoothPbap;->RESULT_SUCCESS:I
-Landroid/bluetooth/BluetoothPbap;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothPbapClient;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothPbapClient;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothPbapClient;->close()V
-Landroid/bluetooth/BluetoothPbapClient;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothPbapClient;->DBG:Z
-Landroid/bluetooth/BluetoothPbapClient;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothPbapClient;->doBind()Z
-Landroid/bluetooth/BluetoothPbapClient;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothPbapClient;->isEnabled()Z
-Landroid/bluetooth/BluetoothPbapClient;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothPbapClient;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothPbapClient;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothPbapClient;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothPbapClient;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothPbapClient;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothPbapClient;->mService:Landroid/bluetooth/IBluetoothPbapClient;
-Landroid/bluetooth/BluetoothPbapClient;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothPbapClient;->RESULT_CANCELED:I
-Landroid/bluetooth/BluetoothPbapClient;->RESULT_FAILURE:I
-Landroid/bluetooth/BluetoothPbapClient;->RESULT_SUCCESS:I
-Landroid/bluetooth/BluetoothPbapClient;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothPbapClient;->STATE_ERROR:I
-Landroid/bluetooth/BluetoothPbapClient;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothPbapClient;->VDBG:Z
-Landroid/bluetooth/BluetoothProfile;->AVRCP:I
-Landroid/bluetooth/BluetoothProfile;->getConnectionStateName(I)Ljava/lang/String;
-Landroid/bluetooth/BluetoothProfile;->HEADSET_CLIENT:I
-Landroid/bluetooth/BluetoothProfile;->HEARING_AID:I
-Landroid/bluetooth/BluetoothProfile;->HID_HOST:I
-Landroid/bluetooth/BluetoothProfile;->MAP:I
-Landroid/bluetooth/BluetoothProfile;->MAP_CLIENT:I
-Landroid/bluetooth/BluetoothProfile;->MAX_PROFILE_ID:I
-Landroid/bluetooth/BluetoothProfile;->OPP:I
-Landroid/bluetooth/BluetoothProfile;->PBAP:I
-Landroid/bluetooth/BluetoothProfile;->PBAP_CLIENT:I
-Landroid/bluetooth/BluetoothProtoEnums;-><init>()V
-Landroid/bluetooth/BluetoothProtoEnums;->CONNECTION_STATE_CONNECTED:I
-Landroid/bluetooth/BluetoothProtoEnums;->CONNECTION_STATE_CONNECTING:I
-Landroid/bluetooth/BluetoothProtoEnums;->CONNECTION_STATE_DISCONNECTED:I
-Landroid/bluetooth/BluetoothProtoEnums;->CONNECTION_STATE_DISCONNECTING:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_AIRPLANE_MODE:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_APPLICATION_REQUEST:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_CRASH:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_DISALLOWED:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_RESTARTED:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_RESTORE_USER_SETTING:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_START_ERROR:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_SYSTEM_BOOT:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_UNSPECIFIED:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_USER_SWITCH:I
-Landroid/bluetooth/BluetoothSap;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothSap;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothSap;->close()V
-Landroid/bluetooth/BluetoothSap;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothSap;->DBG:Z
-Landroid/bluetooth/BluetoothSap;->doBind()Z
-Landroid/bluetooth/BluetoothSap;->getClient()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/BluetoothSap;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothSap;->getState()I
-Landroid/bluetooth/BluetoothSap;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothSap;->isEnabled()Z
-Landroid/bluetooth/BluetoothSap;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothSap;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothSap;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothSap;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothSap;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothSap;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothSap;->mService:Landroid/bluetooth/IBluetoothSap;
-Landroid/bluetooth/BluetoothSap;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothSap;->RESULT_CANCELED:I
-Landroid/bluetooth/BluetoothSap;->RESULT_SUCCESS:I
-Landroid/bluetooth/BluetoothSap;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothSap;->STATE_ERROR:I
-Landroid/bluetooth/BluetoothSap;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothSap;->VDBG:Z
-Landroid/bluetooth/BluetoothServerSocket;-><init>(IZZI)V
-Landroid/bluetooth/BluetoothServerSocket;-><init>(IZZIZZ)V
-Landroid/bluetooth/BluetoothServerSocket;-><init>(IZZLandroid/os/ParcelUuid;)V
-Landroid/bluetooth/BluetoothServerSocket;->DBG:Z
-Landroid/bluetooth/BluetoothServerSocket;->getChannel()I
-Landroid/bluetooth/BluetoothServerSocket;->getPsm()I
-Landroid/bluetooth/BluetoothServerSocket;->mChannel:I
-Landroid/bluetooth/BluetoothServerSocket;->mHandler:Landroid/os/Handler;
-Landroid/bluetooth/BluetoothServerSocket;->mMessage:I
-Landroid/bluetooth/BluetoothServerSocket;->setChannel(I)V
-Landroid/bluetooth/BluetoothServerSocket;->setCloseHandler(Landroid/os/Handler;I)V
-Landroid/bluetooth/BluetoothServerSocket;->setServiceName(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothServerSocket;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothSocket$SocketState;->CLOSED:Landroid/bluetooth/BluetoothSocket$SocketState;
-Landroid/bluetooth/BluetoothSocket$SocketState;->CONNECTED:Landroid/bluetooth/BluetoothSocket$SocketState;
-Landroid/bluetooth/BluetoothSocket$SocketState;->INIT:Landroid/bluetooth/BluetoothSocket$SocketState;
-Landroid/bluetooth/BluetoothSocket$SocketState;->LISTENING:Landroid/bluetooth/BluetoothSocket$SocketState;
-Landroid/bluetooth/BluetoothSocket$SocketState;->valueOf(Ljava/lang/String;)Landroid/bluetooth/BluetoothSocket$SocketState;
-Landroid/bluetooth/BluetoothSocket$SocketState;->values()[Landroid/bluetooth/BluetoothSocket$SocketState;
-Landroid/bluetooth/BluetoothSocket;-><init>(IIZZLandroid/bluetooth/BluetoothDevice;ILandroid/os/ParcelUuid;)V
-Landroid/bluetooth/BluetoothSocket;-><init>(IIZZLandroid/bluetooth/BluetoothDevice;ILandroid/os/ParcelUuid;ZZ)V
-Landroid/bluetooth/BluetoothSocket;-><init>(IIZZLjava/lang/String;I)V
-Landroid/bluetooth/BluetoothSocket;-><init>(Landroid/bluetooth/BluetoothSocket;)V
-Landroid/bluetooth/BluetoothSocket;->accept(I)Landroid/bluetooth/BluetoothSocket;
-Landroid/bluetooth/BluetoothSocket;->acceptSocket(Ljava/lang/String;)Landroid/bluetooth/BluetoothSocket;
-Landroid/bluetooth/BluetoothSocket;->available()I
-Landroid/bluetooth/BluetoothSocket;->bindListen()I
-Landroid/bluetooth/BluetoothSocket;->BTSOCK_FLAG_NO_SDP:I
-Landroid/bluetooth/BluetoothSocket;->convertAddr([B)Ljava/lang/String;
-Landroid/bluetooth/BluetoothSocket;->createL2capRxBuffer()V
-Landroid/bluetooth/BluetoothSocket;->DBG:Z
-Landroid/bluetooth/BluetoothSocket;->EBADFD:I
-Landroid/bluetooth/BluetoothSocket;->fillL2capRxBuffer()I
-Landroid/bluetooth/BluetoothSocket;->getPort()I
-Landroid/bluetooth/BluetoothSocket;->getSecurityFlags()I
-Landroid/bluetooth/BluetoothSocket;->mAddress:Ljava/lang/String;
-Landroid/bluetooth/BluetoothSocket;->mAuth:Z
-Landroid/bluetooth/BluetoothSocket;->mAuthMitm:Z
-Landroid/bluetooth/BluetoothSocket;->MAX_L2CAP_PACKAGE_SIZE:I
-Landroid/bluetooth/BluetoothSocket;->MAX_RFCOMM_CHANNEL:I
-Landroid/bluetooth/BluetoothSocket;->mDevice:Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/BluetoothSocket;->mEncrypt:Z
-Landroid/bluetooth/BluetoothSocket;->mExcludeSdp:Z
-Landroid/bluetooth/BluetoothSocket;->mFd:I
-Landroid/bluetooth/BluetoothSocket;->mInputStream:Landroid/bluetooth/BluetoothInputStream;
-Landroid/bluetooth/BluetoothSocket;->mL2capBuffer:Ljava/nio/ByteBuffer;
-Landroid/bluetooth/BluetoothSocket;->mMaxRxPacketSize:I
-Landroid/bluetooth/BluetoothSocket;->mMaxTxPacketSize:I
-Landroid/bluetooth/BluetoothSocket;->mMin16DigitPin:Z
-Landroid/bluetooth/BluetoothSocket;->mOutputStream:Landroid/bluetooth/BluetoothOutputStream;
-Landroid/bluetooth/BluetoothSocket;->mServiceName:Ljava/lang/String;
-Landroid/bluetooth/BluetoothSocket;->mSocketIS:Ljava/io/InputStream;
-Landroid/bluetooth/BluetoothSocket;->mSocketOS:Ljava/io/OutputStream;
-Landroid/bluetooth/BluetoothSocket;->mSocketState:Landroid/bluetooth/BluetoothSocket$SocketState;
-Landroid/bluetooth/BluetoothSocket;->mType:I
-Landroid/bluetooth/BluetoothSocket;->mUuid:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothSocket;->PROXY_CONNECTION_TIMEOUT:I
-Landroid/bluetooth/BluetoothSocket;->read([BII)I
-Landroid/bluetooth/BluetoothSocket;->readAll(Ljava/io/InputStream;[B)I
-Landroid/bluetooth/BluetoothSocket;->readInt(Ljava/io/InputStream;)I
-Landroid/bluetooth/BluetoothSocket;->removeChannel()V
-Landroid/bluetooth/BluetoothSocket;->requestMaximumTxDataLength()V
-Landroid/bluetooth/BluetoothSocket;->SEC_FLAG_AUTH:I
-Landroid/bluetooth/BluetoothSocket;->SEC_FLAG_AUTH_16_DIGIT:I
-Landroid/bluetooth/BluetoothSocket;->SEC_FLAG_AUTH_MITM:I
-Landroid/bluetooth/BluetoothSocket;->SEC_FLAG_ENCRYPT:I
-Landroid/bluetooth/BluetoothSocket;->setExcludeSdp(Z)V
-Landroid/bluetooth/BluetoothSocket;->setServiceName(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothSocket;->SOCK_SIGNAL_SIZE:I
-Landroid/bluetooth/BluetoothSocket;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothSocket;->TYPE_L2CAP_BREDR:I
-Landroid/bluetooth/BluetoothSocket;->TYPE_L2CAP_LE:I
-Landroid/bluetooth/BluetoothSocket;->VDBG:Z
-Landroid/bluetooth/BluetoothSocket;->waitSocketSignal(Ljava/io/InputStream;)Ljava/lang/String;
-Landroid/bluetooth/BluetoothSocket;->write([BII)I
-Landroid/bluetooth/BluetoothUuid;-><init>()V
-Landroid/bluetooth/BluetoothUuid;->AudioSource:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->AvrcpController:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->AvrcpTarget:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->BASE_UUID:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->BNEP:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->containsAllUuids([Landroid/os/ParcelUuid;[Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->getServiceIdentifierFromParcelUuid(Landroid/os/ParcelUuid;)I
-Landroid/bluetooth/BluetoothUuid;->Handsfree_AG:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->HearingAid:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->Hid:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->HSP_AG:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->isAudioSink(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isAvrcpController(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isBnep(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isHandsfree(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isHeadset(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isInputDevice(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isMap(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isMas(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isMns(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isNap(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isPanu(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isSap(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->MAP:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->MAS:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->MNS:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->PANU:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->parseUuidFrom([B)Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->PBAP_PCE:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->SAP:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->uuidToBytes(Landroid/os/ParcelUuid;)[B
-Landroid/bluetooth/BluetoothUuid;->UUID_BYTES_128_BIT:I
-Landroid/bluetooth/BluetoothUuid;->UUID_BYTES_16_BIT:I
-Landroid/bluetooth/BluetoothUuid;->UUID_BYTES_32_BIT:I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->cancelBondProcess(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->cancelDiscovery()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->createBond(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->createBondOutOfBand(Landroid/bluetooth/BluetoothDevice;ILandroid/bluetooth/OobData;)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->disable()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->enable()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->enableNoAutoConnect()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->factoryReset()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->fetchRemoteUuids(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getAdapterConnectionState()I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getBatteryLevel(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getBluetoothClass()Landroid/bluetooth/BluetoothClass;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getBondedDevices()[Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getBondState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getDiscoverableTimeout()I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getDiscoveryEndMillis()J
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getLeMaximumAdvertisingDataLength()I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getMaxConnectedAudioDevices()I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getMessageAccessPermission(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getName()Ljava/lang/String;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getPhonebookAccessPermission(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getProfileConnectionState(I)I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getRemoteAlias(Landroid/bluetooth/BluetoothDevice;)Ljava/lang/String;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getRemoteClass(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getRemoteName(Landroid/bluetooth/BluetoothDevice;)Ljava/lang/String;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getRemoteType(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getRemoteUuids(Landroid/bluetooth/BluetoothDevice;)[Landroid/os/ParcelUuid;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getScanMode()I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getSimAccessPermission(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getSocketManager()Landroid/bluetooth/IBluetoothSocketManager;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getState()I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getSupportedProfiles()J
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getUuids()[Landroid/os/ParcelUuid;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isActivityAndEnergyReportingSupported()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isBondingInitiatedLocally(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isDiscovering()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isEnabled()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isLe2MPhySupported()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isLeCodedPhySupported()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isLeExtendedAdvertisingSupported()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isLePeriodicAdvertisingSupported()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isMultiAdvertisementSupported()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isOffloadedFilteringSupported()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isOffloadedScanBatchingSupported()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->onBrEdrDown()V
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->onLeServiceUp()V
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->registerCallback(Landroid/bluetooth/IBluetoothCallback;)V
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->removeBond(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->reportActivityInfo()Landroid/bluetooth/BluetoothActivityEnergyInfo;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->requestActivityInfo(Landroid/os/ResultReceiver;)V
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->sdpSearch(Landroid/bluetooth/BluetoothDevice;Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->sendConnectionStateChange(Landroid/bluetooth/BluetoothDevice;III)V
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setBluetoothClass(Landroid/bluetooth/BluetoothClass;)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setDiscoverableTimeout(I)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setMessageAccessPermission(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setName(Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setPairingConfirmation(Landroid/bluetooth/BluetoothDevice;Z)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setPasskey(Landroid/bluetooth/BluetoothDevice;ZI[B)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setPhonebookAccessPermission(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setPin(Landroid/bluetooth/BluetoothDevice;ZI[B)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setRemoteAlias(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setScanMode(II)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setSimAccessPermission(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->startDiscovery()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->unregisterCallback(Landroid/bluetooth/IBluetoothCallback;)V
-Landroid/bluetooth/IBluetooth$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_cancelBondProcess:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_cancelDiscovery:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_createBond:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_createBondOutOfBand:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_disable:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_enableNoAutoConnect:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_factoryReset:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_fetchRemoteUuids:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getAdapterConnectionState:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getAddress:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getBatteryLevel:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getBluetoothClass:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getBondedDevices:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getBondState:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getDiscoverableTimeout:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getDiscoveryEndMillis:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getLeMaximumAdvertisingDataLength:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getMaxConnectedAudioDevices:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getMessageAccessPermission:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getName:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getPhonebookAccessPermission:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getProfileConnectionState:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getRemoteAlias:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getRemoteClass:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getRemoteName:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getRemoteType:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getRemoteUuids:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getScanMode:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getSimAccessPermission:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getSocketManager:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getState:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getSupportedProfiles:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getUuids:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isActivityAndEnergyReportingSupported:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isBondingInitiatedLocally:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isDiscovering:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isEnabled:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isLe2MPhySupported:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isLeCodedPhySupported:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isLeExtendedAdvertisingSupported:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isLePeriodicAdvertisingSupported:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isMultiAdvertisementSupported:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isOffloadedFilteringSupported:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isOffloadedScanBatchingSupported:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_onBrEdrDown:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_onLeServiceUp:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_registerCallback:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_removeBond:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_reportActivityInfo:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_requestActivityInfo:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_sdpSearch:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_sendConnectionStateChange:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setBluetoothClass:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setDiscoverableTimeout:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setMessageAccessPermission:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setName:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setPairingConfirmation:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setPasskey:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setPhonebookAccessPermission:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setPin:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setRemoteAlias:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setScanMode:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setSimAccessPermission:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_startDiscovery:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_unregisterCallback:I
-Landroid/bluetooth/IBluetooth;->cancelBondProcess(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetooth;->cancelDiscovery()Z
-Landroid/bluetooth/IBluetooth;->createBond(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetooth;->createBondOutOfBand(Landroid/bluetooth/BluetoothDevice;ILandroid/bluetooth/OobData;)Z
-Landroid/bluetooth/IBluetooth;->disable()Z
-Landroid/bluetooth/IBluetooth;->enable()Z
-Landroid/bluetooth/IBluetooth;->enableNoAutoConnect()Z
-Landroid/bluetooth/IBluetooth;->factoryReset()Z
-Landroid/bluetooth/IBluetooth;->getAdapterConnectionState()I
-Landroid/bluetooth/IBluetooth;->getBatteryLevel(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth;->getBluetoothClass()Landroid/bluetooth/BluetoothClass;
-Landroid/bluetooth/IBluetooth;->getBondedDevices()[Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetooth;->getBondState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth;->getDiscoverableTimeout()I
-Landroid/bluetooth/IBluetooth;->getDiscoveryEndMillis()J
-Landroid/bluetooth/IBluetooth;->getLeMaximumAdvertisingDataLength()I
-Landroid/bluetooth/IBluetooth;->getMaxConnectedAudioDevices()I
-Landroid/bluetooth/IBluetooth;->getMessageAccessPermission(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth;->getName()Ljava/lang/String;
-Landroid/bluetooth/IBluetooth;->getPhonebookAccessPermission(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth;->getProfileConnectionState(I)I
-Landroid/bluetooth/IBluetooth;->getRemoteClass(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth;->getRemoteName(Landroid/bluetooth/BluetoothDevice;)Ljava/lang/String;
-Landroid/bluetooth/IBluetooth;->getRemoteType(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth;->getRemoteUuids(Landroid/bluetooth/BluetoothDevice;)[Landroid/os/ParcelUuid;
-Landroid/bluetooth/IBluetooth;->getScanMode()I
-Landroid/bluetooth/IBluetooth;->getSimAccessPermission(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth;->getSocketManager()Landroid/bluetooth/IBluetoothSocketManager;
-Landroid/bluetooth/IBluetooth;->getState()I
-Landroid/bluetooth/IBluetooth;->getSupportedProfiles()J
-Landroid/bluetooth/IBluetooth;->getUuids()[Landroid/os/ParcelUuid;
-Landroid/bluetooth/IBluetooth;->isActivityAndEnergyReportingSupported()Z
-Landroid/bluetooth/IBluetooth;->isBondingInitiatedLocally(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetooth;->isDiscovering()Z
-Landroid/bluetooth/IBluetooth;->isLe2MPhySupported()Z
-Landroid/bluetooth/IBluetooth;->isLeCodedPhySupported()Z
-Landroid/bluetooth/IBluetooth;->isLeExtendedAdvertisingSupported()Z
-Landroid/bluetooth/IBluetooth;->isLePeriodicAdvertisingSupported()Z
-Landroid/bluetooth/IBluetooth;->isMultiAdvertisementSupported()Z
-Landroid/bluetooth/IBluetooth;->isOffloadedFilteringSupported()Z
-Landroid/bluetooth/IBluetooth;->isOffloadedScanBatchingSupported()Z
-Landroid/bluetooth/IBluetooth;->onBrEdrDown()V
-Landroid/bluetooth/IBluetooth;->onLeServiceUp()V
-Landroid/bluetooth/IBluetooth;->registerCallback(Landroid/bluetooth/IBluetoothCallback;)V
-Landroid/bluetooth/IBluetooth;->removeBond(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetooth;->reportActivityInfo()Landroid/bluetooth/BluetoothActivityEnergyInfo;
-Landroid/bluetooth/IBluetooth;->requestActivityInfo(Landroid/os/ResultReceiver;)V
-Landroid/bluetooth/IBluetooth;->sdpSearch(Landroid/bluetooth/BluetoothDevice;Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/IBluetooth;->setBluetoothClass(Landroid/bluetooth/BluetoothClass;)Z
-Landroid/bluetooth/IBluetooth;->setDiscoverableTimeout(I)Z
-Landroid/bluetooth/IBluetooth;->setMessageAccessPermission(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetooth;->setName(Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetooth;->setPairingConfirmation(Landroid/bluetooth/BluetoothDevice;Z)Z
-Landroid/bluetooth/IBluetooth;->setPasskey(Landroid/bluetooth/BluetoothDevice;ZI[B)Z
-Landroid/bluetooth/IBluetooth;->setPhonebookAccessPermission(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetooth;->setPin(Landroid/bluetooth/BluetoothDevice;ZI[B)Z
-Landroid/bluetooth/IBluetooth;->setRemoteAlias(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetooth;->setScanMode(II)Z
-Landroid/bluetooth/IBluetooth;->setSimAccessPermission(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetooth;->startDiscovery()Z
-Landroid/bluetooth/IBluetooth;->unregisterCallback(Landroid/bluetooth/IBluetoothCallback;)V
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->disableOptionalCodecs(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->enableOptionalCodecs(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->getActiveDevice()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->getCodecStatus(Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothCodecStatus;
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->getOptionalCodecsEnabled(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->isA2dpPlaying(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->isAvrcpAbsoluteVolumeSupported()Z
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->setActiveDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->setAvrcpAbsoluteVolume(I)V
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->setCodecConfigPreference(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothCodecConfig;)V
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->setOptionalCodecsEnabled(Landroid/bluetooth/BluetoothDevice;I)V
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->supportsOptionalCodecs(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_disableOptionalCodecs:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_enableOptionalCodecs:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_getActiveDevice:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_getCodecStatus:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_getOptionalCodecsEnabled:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_isA2dpPlaying:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_isAvrcpAbsoluteVolumeSupported:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_setActiveDevice:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_setAvrcpAbsoluteVolume:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_setCodecConfigPreference:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_setOptionalCodecsEnabled:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_supportsOptionalCodecs:I
-Landroid/bluetooth/IBluetoothA2dp;->disableOptionalCodecs(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothA2dp;->enableOptionalCodecs(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothA2dp;->getActiveDevice()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetoothA2dp;->getCodecStatus(Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothCodecStatus;
-Landroid/bluetooth/IBluetoothA2dp;->getOptionalCodecsEnabled(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dp;->isA2dpPlaying(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dp;->isAvrcpAbsoluteVolumeSupported()Z
-Landroid/bluetooth/IBluetoothA2dp;->setActiveDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dp;->setAvrcpAbsoluteVolume(I)V
-Landroid/bluetooth/IBluetoothA2dp;->setCodecConfigPreference(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothCodecConfig;)V
-Landroid/bluetooth/IBluetoothA2dp;->setOptionalCodecsEnabled(Landroid/bluetooth/BluetoothDevice;I)V
-Landroid/bluetooth/IBluetoothA2dp;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothA2dp;->supportsOptionalCodecs(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->getAudioConfig(Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothAudioConfig;
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->isA2dpPlaying(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothA2dpSink;
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->TRANSACTION_getAudioConfig:I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->TRANSACTION_isA2dpPlaying:I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothA2dpSink;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dpSink;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dpSink;->getAudioConfig(Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothAudioConfig;
-Landroid/bluetooth/IBluetoothA2dpSink;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothA2dpSink;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dpSink;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothA2dpSink;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dpSink;->isA2dpPlaying(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dpSink;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothAvrcpController$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothAvrcpController$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothAvrcpController$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothAvrcpController$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothAvrcpController$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothAvrcpController$Stub$Proxy;->getPlayerSettings(Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothAvrcpPlayerSettings;
-Landroid/bluetooth/IBluetoothAvrcpController$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothAvrcpController$Stub$Proxy;->sendGroupNavigationCmd(Landroid/bluetooth/BluetoothDevice;II)V
-Landroid/bluetooth/IBluetoothAvrcpController$Stub$Proxy;->setPlayerApplicationSetting(Landroid/bluetooth/BluetoothAvrcpPlayerSettings;)Z
-Landroid/bluetooth/IBluetoothAvrcpController$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothAvrcpController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothAvrcpController;
-Landroid/bluetooth/IBluetoothAvrcpController$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothAvrcpController$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothAvrcpController$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothAvrcpController$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothAvrcpController$Stub;->TRANSACTION_getPlayerSettings:I
-Landroid/bluetooth/IBluetoothAvrcpController$Stub;->TRANSACTION_sendGroupNavigationCmd:I
-Landroid/bluetooth/IBluetoothAvrcpController$Stub;->TRANSACTION_setPlayerApplicationSetting:I
-Landroid/bluetooth/IBluetoothAvrcpController;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothAvrcpController;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothAvrcpController;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothAvrcpController;->getPlayerSettings(Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothAvrcpPlayerSettings;
-Landroid/bluetooth/IBluetoothAvrcpController;->sendGroupNavigationCmd(Landroid/bluetooth/BluetoothDevice;II)V
-Landroid/bluetooth/IBluetoothAvrcpController;->setPlayerApplicationSetting(Landroid/bluetooth/BluetoothAvrcpPlayerSettings;)Z
-Landroid/bluetooth/IBluetoothAvrcpTarget$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothAvrcpTarget$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothAvrcpTarget$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothAvrcpTarget$Stub$Proxy;->sendVolumeChanged(I)V
-Landroid/bluetooth/IBluetoothAvrcpTarget$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothAvrcpTarget$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothAvrcpTarget;
-Landroid/bluetooth/IBluetoothAvrcpTarget$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothAvrcpTarget$Stub;->TRANSACTION_sendVolumeChanged:I
-Landroid/bluetooth/IBluetoothAvrcpTarget;->sendVolumeChanged(I)V
-Landroid/bluetooth/IBluetoothCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothCallback$Stub$Proxy;->onBluetoothStateChange(II)V
-Landroid/bluetooth/IBluetoothCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothCallback;
-Landroid/bluetooth/IBluetoothCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothCallback$Stub;->TRANSACTION_onBluetoothStateChange:I
-Landroid/bluetooth/IBluetoothCallback;->onBluetoothStateChange(II)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->addService(ILandroid/bluetooth/BluetoothGattService;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->beginReliableWrite(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->clearServices(I)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->clientConnect(ILjava/lang/String;ZIZI)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->clientDisconnect(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->clientReadPhy(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->clientSetPreferredPhy(ILjava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->configureMTU(ILjava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->connectionParameterUpdate(ILjava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->disconnectAll()V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->discoverServiceByUuid(ILjava/lang/String;Landroid/os/ParcelUuid;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->discoverServices(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->enableAdvertisingSet(IZII)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->endReliableWrite(ILjava/lang/String;Z)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->flushPendingBatchResults(I)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->getOwnAddress(I)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->leConnectionUpdate(ILjava/lang/String;IIIIII)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->numHwTrackFiltersAvailable()I
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->readCharacteristic(ILjava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->readDescriptor(ILjava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->readRemoteRssi(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->readUsingCharacteristicUuid(ILjava/lang/String;Landroid/os/ParcelUuid;III)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->refreshDevice(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->registerClient(Landroid/os/ParcelUuid;Landroid/bluetooth/IBluetoothGattCallback;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->registerForNotification(ILjava/lang/String;IZ)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->registerScanner(Landroid/bluetooth/le/IScannerCallback;Landroid/os/WorkSource;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->registerServer(Landroid/os/ParcelUuid;Landroid/bluetooth/IBluetoothGattServerCallback;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->registerSync(Landroid/bluetooth/le/ScanResult;IILandroid/bluetooth/le/IPeriodicAdvertisingCallback;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->removeService(II)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->sendNotification(ILjava/lang/String;IZ[B)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->sendResponse(ILjava/lang/String;III[B)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->serverConnect(ILjava/lang/String;ZI)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->serverDisconnect(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->serverReadPhy(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->serverSetPreferredPhy(ILjava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->setAdvertisingData(ILandroid/bluetooth/le/AdvertiseData;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->setAdvertisingParameters(ILandroid/bluetooth/le/AdvertisingSetParameters;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->setPeriodicAdvertisingData(ILandroid/bluetooth/le/AdvertiseData;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->setPeriodicAdvertisingEnable(IZ)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->setPeriodicAdvertisingParameters(ILandroid/bluetooth/le/PeriodicAdvertisingParameters;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->setScanResponseData(ILandroid/bluetooth/le/AdvertiseData;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->startAdvertisingSet(Landroid/bluetooth/le/AdvertisingSetParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/PeriodicAdvertisingParameters;Landroid/bluetooth/le/AdvertiseData;IILandroid/bluetooth/le/IAdvertisingSetCallback;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->startScan(ILandroid/bluetooth/le/ScanSettings;Ljava/util/List;Ljava/util/List;Ljava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->startScanForIntent(Landroid/app/PendingIntent;Landroid/bluetooth/le/ScanSettings;Ljava/util/List;Ljava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->stopAdvertisingSet(Landroid/bluetooth/le/IAdvertisingSetCallback;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->stopScan(I)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->stopScanForIntent(Landroid/app/PendingIntent;Ljava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->unregAll()V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->unregisterClient(I)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->unregisterScanner(I)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->unregisterServer(I)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->unregisterSync(Landroid/bluetooth/le/IPeriodicAdvertisingCallback;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->writeCharacteristic(ILjava/lang/String;III[B)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->writeDescriptor(ILjava/lang/String;II[B)V
-Landroid/bluetooth/IBluetoothGatt$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothGatt$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothGatt;
-Landroid/bluetooth/IBluetoothGatt$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_addService:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_beginReliableWrite:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_clearServices:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_clientConnect:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_clientDisconnect:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_clientReadPhy:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_clientSetPreferredPhy:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_configureMTU:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_connectionParameterUpdate:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_disconnectAll:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_discoverServiceByUuid:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_discoverServices:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_enableAdvertisingSet:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_endReliableWrite:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_flushPendingBatchResults:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_getOwnAddress:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_leConnectionUpdate:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_numHwTrackFiltersAvailable:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_readCharacteristic:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_readDescriptor:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_readRemoteRssi:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_readUsingCharacteristicUuid:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_refreshDevice:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_registerClient:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_registerForNotification:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_registerScanner:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_registerServer:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_registerSync:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_removeService:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_sendNotification:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_sendResponse:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_serverConnect:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_serverDisconnect:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_serverReadPhy:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_serverSetPreferredPhy:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_setAdvertisingData:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_setAdvertisingParameters:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_setPeriodicAdvertisingData:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_setPeriodicAdvertisingEnable:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_setPeriodicAdvertisingParameters:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_setScanResponseData:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_startAdvertisingSet:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_startScan:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_startScanForIntent:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_stopAdvertisingSet:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_stopScan:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_stopScanForIntent:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_unregAll:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_unregisterClient:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_unregisterScanner:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_unregisterServer:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_unregisterSync:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_writeCharacteristic:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_writeDescriptor:I
-Landroid/bluetooth/IBluetoothGatt;->addService(ILandroid/bluetooth/BluetoothGattService;)V
-Landroid/bluetooth/IBluetoothGatt;->beginReliableWrite(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->clearServices(I)V
-Landroid/bluetooth/IBluetoothGatt;->clientConnect(ILjava/lang/String;ZIZI)V
-Landroid/bluetooth/IBluetoothGatt;->clientDisconnect(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->clientReadPhy(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->clientSetPreferredPhy(ILjava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGatt;->configureMTU(ILjava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGatt;->connectionParameterUpdate(ILjava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGatt;->disconnectAll()V
-Landroid/bluetooth/IBluetoothGatt;->discoverServiceByUuid(ILjava/lang/String;Landroid/os/ParcelUuid;)V
-Landroid/bluetooth/IBluetoothGatt;->discoverServices(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->enableAdvertisingSet(IZII)V
-Landroid/bluetooth/IBluetoothGatt;->endReliableWrite(ILjava/lang/String;Z)V
-Landroid/bluetooth/IBluetoothGatt;->flushPendingBatchResults(I)V
-Landroid/bluetooth/IBluetoothGatt;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothGatt;->getOwnAddress(I)V
-Landroid/bluetooth/IBluetoothGatt;->leConnectionUpdate(ILjava/lang/String;IIIIII)V
-Landroid/bluetooth/IBluetoothGatt;->numHwTrackFiltersAvailable()I
-Landroid/bluetooth/IBluetoothGatt;->readCharacteristic(ILjava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGatt;->readDescriptor(ILjava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGatt;->readRemoteRssi(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->readUsingCharacteristicUuid(ILjava/lang/String;Landroid/os/ParcelUuid;III)V
-Landroid/bluetooth/IBluetoothGatt;->refreshDevice(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->registerForNotification(ILjava/lang/String;IZ)V
-Landroid/bluetooth/IBluetoothGatt;->registerScanner(Landroid/bluetooth/le/IScannerCallback;Landroid/os/WorkSource;)V
-Landroid/bluetooth/IBluetoothGatt;->registerServer(Landroid/os/ParcelUuid;Landroid/bluetooth/IBluetoothGattServerCallback;)V
-Landroid/bluetooth/IBluetoothGatt;->registerSync(Landroid/bluetooth/le/ScanResult;IILandroid/bluetooth/le/IPeriodicAdvertisingCallback;)V
-Landroid/bluetooth/IBluetoothGatt;->removeService(II)V
-Landroid/bluetooth/IBluetoothGatt;->sendNotification(ILjava/lang/String;IZ[B)V
-Landroid/bluetooth/IBluetoothGatt;->sendResponse(ILjava/lang/String;III[B)V
-Landroid/bluetooth/IBluetoothGatt;->serverConnect(ILjava/lang/String;ZI)V
-Landroid/bluetooth/IBluetoothGatt;->serverDisconnect(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->serverReadPhy(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->serverSetPreferredPhy(ILjava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGatt;->setAdvertisingData(ILandroid/bluetooth/le/AdvertiseData;)V
-Landroid/bluetooth/IBluetoothGatt;->setAdvertisingParameters(ILandroid/bluetooth/le/AdvertisingSetParameters;)V
-Landroid/bluetooth/IBluetoothGatt;->setPeriodicAdvertisingData(ILandroid/bluetooth/le/AdvertiseData;)V
-Landroid/bluetooth/IBluetoothGatt;->setPeriodicAdvertisingEnable(IZ)V
-Landroid/bluetooth/IBluetoothGatt;->setPeriodicAdvertisingParameters(ILandroid/bluetooth/le/PeriodicAdvertisingParameters;)V
-Landroid/bluetooth/IBluetoothGatt;->setScanResponseData(ILandroid/bluetooth/le/AdvertiseData;)V
-Landroid/bluetooth/IBluetoothGatt;->startAdvertisingSet(Landroid/bluetooth/le/AdvertisingSetParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/PeriodicAdvertisingParameters;Landroid/bluetooth/le/AdvertiseData;IILandroid/bluetooth/le/IAdvertisingSetCallback;)V
-Landroid/bluetooth/IBluetoothGatt;->startScan(ILandroid/bluetooth/le/ScanSettings;Ljava/util/List;Ljava/util/List;Ljava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->startScanForIntent(Landroid/app/PendingIntent;Landroid/bluetooth/le/ScanSettings;Ljava/util/List;Ljava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->stopAdvertisingSet(Landroid/bluetooth/le/IAdvertisingSetCallback;)V
-Landroid/bluetooth/IBluetoothGatt;->stopScan(I)V
-Landroid/bluetooth/IBluetoothGatt;->stopScanForIntent(Landroid/app/PendingIntent;Ljava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->unregAll()V
-Landroid/bluetooth/IBluetoothGatt;->unregisterScanner(I)V
-Landroid/bluetooth/IBluetoothGatt;->unregisterServer(I)V
-Landroid/bluetooth/IBluetoothGatt;->unregisterSync(Landroid/bluetooth/le/IPeriodicAdvertisingCallback;)V
-Landroid/bluetooth/IBluetoothGatt;->writeCharacteristic(ILjava/lang/String;III[B)V
-Landroid/bluetooth/IBluetoothGatt;->writeDescriptor(ILjava/lang/String;II[B)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onCharacteristicRead(Ljava/lang/String;II[B)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onCharacteristicWrite(Ljava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onClientConnectionState(IIZLjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onClientRegistered(II)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onConfigureMTU(Ljava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onConnectionUpdated(Ljava/lang/String;IIII)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onDescriptorRead(Ljava/lang/String;II[B)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onDescriptorWrite(Ljava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onExecuteWrite(Ljava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onNotify(Ljava/lang/String;I[B)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onPhyRead(Ljava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onPhyUpdate(Ljava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onReadRemoteRssi(Ljava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onSearchComplete(Ljava/lang/String;Ljava/util/List;I)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onCharacteristicRead:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onCharacteristicWrite:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onClientConnectionState:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onClientRegistered:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onConfigureMTU:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onConnectionUpdated:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onDescriptorRead:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onDescriptorWrite:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onExecuteWrite:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onNotify:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onPhyRead:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onPhyUpdate:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onReadRemoteRssi:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onSearchComplete:I
-Landroid/bluetooth/IBluetoothGattCallback;->onCharacteristicRead(Ljava/lang/String;II[B)V
-Landroid/bluetooth/IBluetoothGattCallback;->onCharacteristicWrite(Ljava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGattCallback;->onClientConnectionState(IIZLjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGattCallback;->onClientRegistered(II)V
-Landroid/bluetooth/IBluetoothGattCallback;->onConfigureMTU(Ljava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGattCallback;->onConnectionUpdated(Ljava/lang/String;IIII)V
-Landroid/bluetooth/IBluetoothGattCallback;->onDescriptorRead(Ljava/lang/String;II[B)V
-Landroid/bluetooth/IBluetoothGattCallback;->onDescriptorWrite(Ljava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGattCallback;->onExecuteWrite(Ljava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGattCallback;->onNotify(Ljava/lang/String;I[B)V
-Landroid/bluetooth/IBluetoothGattCallback;->onPhyRead(Ljava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGattCallback;->onPhyUpdate(Ljava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGattCallback;->onReadRemoteRssi(Ljava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGattCallback;->onSearchComplete(Ljava/lang/String;Ljava/util/List;I)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onCharacteristicReadRequest(Ljava/lang/String;IIZI)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onCharacteristicWriteRequest(Ljava/lang/String;IIIZZI[B)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onConnectionUpdated(Ljava/lang/String;IIII)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onDescriptorReadRequest(Ljava/lang/String;IIZI)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onDescriptorWriteRequest(Ljava/lang/String;IIIZZI[B)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onExecuteWrite(Ljava/lang/String;IZ)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onMtuChanged(Ljava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onNotificationSent(Ljava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onPhyRead(Ljava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onPhyUpdate(Ljava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onServerConnectionState(IIZLjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onServerRegistered(II)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onServiceAdded(ILandroid/bluetooth/BluetoothGattService;)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothGattServerCallback;
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onCharacteristicReadRequest:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onCharacteristicWriteRequest:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onConnectionUpdated:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onDescriptorReadRequest:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onDescriptorWriteRequest:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onExecuteWrite:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onMtuChanged:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onNotificationSent:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onPhyRead:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onPhyUpdate:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onServerConnectionState:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onServerRegistered:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onServiceAdded:I
-Landroid/bluetooth/IBluetoothGattServerCallback;->onCharacteristicReadRequest(Ljava/lang/String;IIZI)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onCharacteristicWriteRequest(Ljava/lang/String;IIIZZI[B)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onConnectionUpdated(Ljava/lang/String;IIII)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onDescriptorReadRequest(Ljava/lang/String;IIZI)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onDescriptorWriteRequest(Ljava/lang/String;IIIZZI[B)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onExecuteWrite(Ljava/lang/String;IZ)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onMtuChanged(Ljava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onNotificationSent(Ljava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onPhyRead(Ljava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onPhyUpdate(Ljava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onServerConnectionState(IIZLjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onServerRegistered(II)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onServiceAdded(ILandroid/bluetooth/BluetoothGattService;)V
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->clccResponse(IIIIZLjava/lang/String;I)V
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->connectAudio()Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->disconnectAudio()Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->getActiveDevice()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->getAudioRouteAllowed()Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->getAudioState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->isAudioConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->isAudioOn()Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->isInbandRingingEnabled()Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->phoneStateChanged(IIILjava/lang/String;I)V
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->sendVendorSpecificResultCode(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->setActiveDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->setAudioRouteAllowed(Z)V
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->setForceScoAudio(Z)V
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->startScoUsingVirtualVoiceCall()Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->startVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->stopScoUsingVirtualVoiceCall()Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->stopVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadset$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothHeadset$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_clccResponse:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_connectAudio:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_disconnectAudio:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_getActiveDevice:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_getAudioRouteAllowed:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_getAudioState:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_isAudioConnected:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_isAudioOn:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_isInbandRingingEnabled:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_phoneStateChanged:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_sendVendorSpecificResultCode:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_setActiveDevice:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_setAudioRouteAllowed:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_setForceScoAudio:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_startScoUsingVirtualVoiceCall:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_startVoiceRecognition:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_stopScoUsingVirtualVoiceCall:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_stopVoiceRecognition:I
-Landroid/bluetooth/IBluetoothHeadset;->clccResponse(IIIIZLjava/lang/String;I)V
-Landroid/bluetooth/IBluetoothHeadset;->connectAudio()Z
-Landroid/bluetooth/IBluetoothHeadset;->disconnectAudio()Z
-Landroid/bluetooth/IBluetoothHeadset;->getActiveDevice()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetoothHeadset;->getAudioRouteAllowed()Z
-Landroid/bluetooth/IBluetoothHeadset;->getAudioState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadset;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHeadset;->isAudioConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadset;->isAudioOn()Z
-Landroid/bluetooth/IBluetoothHeadset;->isInbandRingingEnabled()Z
-Landroid/bluetooth/IBluetoothHeadset;->phoneStateChanged(IIILjava/lang/String;I)V
-Landroid/bluetooth/IBluetoothHeadset;->sendVendorSpecificResultCode(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetoothHeadset;->setActiveDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadset;->setAudioRouteAllowed(Z)V
-Landroid/bluetooth/IBluetoothHeadset;->setForceScoAudio(Z)V
-Landroid/bluetooth/IBluetoothHeadset;->startScoUsingVirtualVoiceCall()Z
-Landroid/bluetooth/IBluetoothHeadset;->startVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadset;->stopScoUsingVirtualVoiceCall()Z
-Landroid/bluetooth/IBluetoothHeadset;->stopVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->acceptCall(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->connectAudio(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->dial(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;)Landroid/bluetooth/BluetoothHeadsetClientCall;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->disconnectAudio(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->enterPrivateMode(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->explicitCallTransfer(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getAudioRouteAllowed(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getAudioState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getCurrentAgEvents(Landroid/bluetooth/BluetoothDevice;)Landroid/os/Bundle;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getCurrentAgFeatures(Landroid/bluetooth/BluetoothDevice;)Landroid/os/Bundle;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getCurrentCalls(Landroid/bluetooth/BluetoothDevice;)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getLastVoiceTagNumber(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->holdCall(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->rejectCall(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->sendDTMF(Landroid/bluetooth/BluetoothDevice;B)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->setAudioRouteAllowed(Landroid/bluetooth/BluetoothDevice;Z)V
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->startVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->stopVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->terminateCall(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHeadsetClientCall;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHeadsetClient;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_acceptCall:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_connectAudio:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_dial:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_disconnectAudio:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_enterPrivateMode:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_explicitCallTransfer:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getAudioRouteAllowed:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getAudioState:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getCurrentAgEvents:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getCurrentAgFeatures:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getCurrentCalls:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getLastVoiceTagNumber:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_holdCall:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_rejectCall:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_sendDTMF:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_setAudioRouteAllowed:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_startVoiceRecognition:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_stopVoiceRecognition:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_terminateCall:I
-Landroid/bluetooth/IBluetoothHeadsetClient;->acceptCall(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->connectAudio(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->dial(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;)Landroid/bluetooth/BluetoothHeadsetClientCall;
-Landroid/bluetooth/IBluetoothHeadsetClient;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->disconnectAudio(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->enterPrivateMode(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->explicitCallTransfer(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->getAudioRouteAllowed(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->getAudioState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadsetClient;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHeadsetClient;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadsetClient;->getCurrentAgEvents(Landroid/bluetooth/BluetoothDevice;)Landroid/os/Bundle;
-Landroid/bluetooth/IBluetoothHeadsetClient;->getCurrentAgFeatures(Landroid/bluetooth/BluetoothDevice;)Landroid/os/Bundle;
-Landroid/bluetooth/IBluetoothHeadsetClient;->getCurrentCalls(Landroid/bluetooth/BluetoothDevice;)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHeadsetClient;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHeadsetClient;->getLastVoiceTagNumber(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadsetClient;->holdCall(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->rejectCall(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->sendDTMF(Landroid/bluetooth/BluetoothDevice;B)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->setAudioRouteAllowed(Landroid/bluetooth/BluetoothDevice;Z)V
-Landroid/bluetooth/IBluetoothHeadsetClient;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->startVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->stopVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->terminateCall(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHeadsetClientCall;)Z
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->answerCall()Z
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->cdmaSetSecondCallState(Z)V
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->cdmaSwapSecondCallState()V
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->getNetworkOperator()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->getSubscriberNumber()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->hangupCall()Z
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->listCurrentCalls()Z
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->processChld(I)Z
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->queryPhoneState()Z
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->sendDtmf(I)Z
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->updateBtHandsfreeAfterRadioTechnologyChange()V
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHeadsetPhone;
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_answerCall:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_cdmaSetSecondCallState:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_cdmaSwapSecondCallState:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_getNetworkOperator:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_getSubscriberNumber:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_hangupCall:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_listCurrentCalls:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_processChld:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_queryPhoneState:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_sendDtmf:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_updateBtHandsfreeAfterRadioTechnologyChange:I
-Landroid/bluetooth/IBluetoothHeadsetPhone;->answerCall()Z
-Landroid/bluetooth/IBluetoothHeadsetPhone;->cdmaSetSecondCallState(Z)V
-Landroid/bluetooth/IBluetoothHeadsetPhone;->cdmaSwapSecondCallState()V
-Landroid/bluetooth/IBluetoothHeadsetPhone;->getNetworkOperator()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadsetPhone;->getSubscriberNumber()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadsetPhone;->hangupCall()Z
-Landroid/bluetooth/IBluetoothHeadsetPhone;->listCurrentCalls()Z
-Landroid/bluetooth/IBluetoothHeadsetPhone;->processChld(I)Z
-Landroid/bluetooth/IBluetoothHeadsetPhone;->queryPhoneState()Z
-Landroid/bluetooth/IBluetoothHeadsetPhone;->sendDtmf(I)Z
-Landroid/bluetooth/IBluetoothHeadsetPhone;->updateBtHandsfreeAfterRadioTechnologyChange()V
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->connectChannelToSink(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;I)Z
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->connectChannelToSource(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;)Z
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->disconnectChannel(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;I)Z
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->getConnectedHealthDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->getHealthDeviceConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->getHealthDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->getMainChannelFd(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;)Landroid/os/ParcelFileDescriptor;
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->registerAppConfiguration(Landroid/bluetooth/BluetoothHealthAppConfiguration;Landroid/bluetooth/IBluetoothHealthCallback;)Z
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->unregisterAppConfiguration(Landroid/bluetooth/BluetoothHealthAppConfiguration;)Z
-Landroid/bluetooth/IBluetoothHealth$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothHealth$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHealth;
-Landroid/bluetooth/IBluetoothHealth$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHealth$Stub;->TRANSACTION_connectChannelToSink:I
-Landroid/bluetooth/IBluetoothHealth$Stub;->TRANSACTION_connectChannelToSource:I
-Landroid/bluetooth/IBluetoothHealth$Stub;->TRANSACTION_disconnectChannel:I
-Landroid/bluetooth/IBluetoothHealth$Stub;->TRANSACTION_getConnectedHealthDevices:I
-Landroid/bluetooth/IBluetoothHealth$Stub;->TRANSACTION_getHealthDeviceConnectionState:I
-Landroid/bluetooth/IBluetoothHealth$Stub;->TRANSACTION_getHealthDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothHealth$Stub;->TRANSACTION_getMainChannelFd:I
-Landroid/bluetooth/IBluetoothHealth$Stub;->TRANSACTION_registerAppConfiguration:I
-Landroid/bluetooth/IBluetoothHealth$Stub;->TRANSACTION_unregisterAppConfiguration:I
-Landroid/bluetooth/IBluetoothHealth;->connectChannelToSink(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;I)Z
-Landroid/bluetooth/IBluetoothHealth;->connectChannelToSource(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;)Z
-Landroid/bluetooth/IBluetoothHealth;->disconnectChannel(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;I)Z
-Landroid/bluetooth/IBluetoothHealth;->getConnectedHealthDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHealth;->getHealthDeviceConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHealth;->getHealthDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHealth;->getMainChannelFd(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;)Landroid/os/ParcelFileDescriptor;
-Landroid/bluetooth/IBluetoothHealth;->registerAppConfiguration(Landroid/bluetooth/BluetoothHealthAppConfiguration;Landroid/bluetooth/IBluetoothHealthCallback;)Z
-Landroid/bluetooth/IBluetoothHealth;->unregisterAppConfiguration(Landroid/bluetooth/BluetoothHealthAppConfiguration;)Z
-Landroid/bluetooth/IBluetoothHealthCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothHealthCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHealthCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothHealthCallback$Stub$Proxy;->onHealthAppConfigurationStatusChange(Landroid/bluetooth/BluetoothHealthAppConfiguration;I)V
-Landroid/bluetooth/IBluetoothHealthCallback$Stub$Proxy;->onHealthChannelStateChange(Landroid/bluetooth/BluetoothHealthAppConfiguration;Landroid/bluetooth/BluetoothDevice;IILandroid/os/ParcelFileDescriptor;I)V
-Landroid/bluetooth/IBluetoothHealthCallback$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothHealthCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHealthCallback;
-Landroid/bluetooth/IBluetoothHealthCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHealthCallback$Stub;->TRANSACTION_onHealthAppConfigurationStatusChange:I
-Landroid/bluetooth/IBluetoothHealthCallback$Stub;->TRANSACTION_onHealthChannelStateChange:I
-Landroid/bluetooth/IBluetoothHealthCallback;->onHealthAppConfigurationStatusChange(Landroid/bluetooth/BluetoothHealthAppConfiguration;I)V
-Landroid/bluetooth/IBluetoothHealthCallback;->onHealthChannelStateChange(Landroid/bluetooth/BluetoothHealthAppConfiguration;Landroid/bluetooth/BluetoothDevice;IILandroid/os/ParcelFileDescriptor;I)V
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->adjustVolume(I)V
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getActiveDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getDeviceMode(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getDeviceSide(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getHiSyncId(Landroid/bluetooth/BluetoothDevice;)J
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getVolume()I
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->setActiveDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->setVolume(I)V
-Landroid/bluetooth/IBluetoothHearingAid$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHearingAid;
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_adjustVolume:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_getActiveDevices:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_getDeviceMode:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_getDeviceSide:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_getHiSyncId:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_getVolume:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_setActiveDevice:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_setVolume:I
-Landroid/bluetooth/IBluetoothHearingAid;->adjustVolume(I)V
-Landroid/bluetooth/IBluetoothHearingAid;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHearingAid;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHearingAid;->getActiveDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHearingAid;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHearingAid;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHearingAid;->getDeviceMode(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHearingAid;->getDeviceSide(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHearingAid;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHearingAid;->getHiSyncId(Landroid/bluetooth/BluetoothDevice;)J
-Landroid/bluetooth/IBluetoothHearingAid;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHearingAid;->getVolume()I
-Landroid/bluetooth/IBluetoothHearingAid;->HI_SYNC_ID_INVALID:I
-Landroid/bluetooth/IBluetoothHearingAid;->MODE_BINAURAL:I
-Landroid/bluetooth/IBluetoothHearingAid;->MODE_MONAURAL:I
-Landroid/bluetooth/IBluetoothHearingAid;->setActiveDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHearingAid;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHearingAid;->setVolume(I)V
-Landroid/bluetooth/IBluetoothHearingAid;->SIDE_LEFT:I
-Landroid/bluetooth/IBluetoothHearingAid;->SIDE_RIGHT:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->getUserAppName()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->registerApp(Landroid/bluetooth/BluetoothHidDeviceAppSdpSettings;Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;Landroid/bluetooth/IBluetoothHidDeviceCallback;)Z
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->replyReport(Landroid/bluetooth/BluetoothDevice;BB[B)Z
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->reportError(Landroid/bluetooth/BluetoothDevice;B)Z
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->sendReport(Landroid/bluetooth/BluetoothDevice;I[B)Z
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->unplug(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->unregisterApp()Z
-Landroid/bluetooth/IBluetoothHidDevice$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHidDevice;
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_getUserAppName:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_registerApp:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_replyReport:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_reportError:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_sendReport:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_unplug:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_unregisterApp:I
-Landroid/bluetooth/IBluetoothHidDevice;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidDevice;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidDevice;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHidDevice;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHidDevice;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHidDevice;->getUserAppName()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHidDevice;->registerApp(Landroid/bluetooth/BluetoothHidDeviceAppSdpSettings;Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;Landroid/bluetooth/IBluetoothHidDeviceCallback;)Z
-Landroid/bluetooth/IBluetoothHidDevice;->replyReport(Landroid/bluetooth/BluetoothDevice;BB[B)Z
-Landroid/bluetooth/IBluetoothHidDevice;->reportError(Landroid/bluetooth/BluetoothDevice;B)Z
-Landroid/bluetooth/IBluetoothHidDevice;->sendReport(Landroid/bluetooth/BluetoothDevice;I[B)Z
-Landroid/bluetooth/IBluetoothHidDevice;->unplug(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidDevice;->unregisterApp()Z
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;->onAppStatusChanged(Landroid/bluetooth/BluetoothDevice;Z)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;->onConnectionStateChanged(Landroid/bluetooth/BluetoothDevice;I)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;->onGetReport(Landroid/bluetooth/BluetoothDevice;BBI)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;->onInterruptData(Landroid/bluetooth/BluetoothDevice;B[B)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;->onSetProtocol(Landroid/bluetooth/BluetoothDevice;B)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;->onSetReport(Landroid/bluetooth/BluetoothDevice;BB[B)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;->onVirtualCableUnplug(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHidDeviceCallback;
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;->TRANSACTION_onAppStatusChanged:I
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;->TRANSACTION_onConnectionStateChanged:I
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;->TRANSACTION_onGetReport:I
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;->TRANSACTION_onInterruptData:I
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;->TRANSACTION_onSetProtocol:I
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;->TRANSACTION_onSetReport:I
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;->TRANSACTION_onVirtualCableUnplug:I
-Landroid/bluetooth/IBluetoothHidDeviceCallback;->onAppStatusChanged(Landroid/bluetooth/BluetoothDevice;Z)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback;->onConnectionStateChanged(Landroid/bluetooth/BluetoothDevice;I)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback;->onGetReport(Landroid/bluetooth/BluetoothDevice;BBI)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback;->onInterruptData(Landroid/bluetooth/BluetoothDevice;B[B)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback;->onSetProtocol(Landroid/bluetooth/BluetoothDevice;B)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback;->onSetReport(Landroid/bluetooth/BluetoothDevice;BB[B)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback;->onVirtualCableUnplug(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->getIdleTime(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->getProtocolMode(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->getReport(Landroid/bluetooth/BluetoothDevice;BBI)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->sendData(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->setIdleTime(Landroid/bluetooth/BluetoothDevice;B)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->setProtocolMode(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->setReport(Landroid/bluetooth/BluetoothDevice;BLjava/lang/String;)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->virtualUnplug(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothHidHost$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHidHost;
-Landroid/bluetooth/IBluetoothHidHost$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_getIdleTime:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_getProtocolMode:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_getReport:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_sendData:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_setIdleTime:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_setProtocolMode:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_setReport:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_virtualUnplug:I
-Landroid/bluetooth/IBluetoothHidHost;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidHost;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidHost;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHidHost;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHidHost;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHidHost;->getIdleTime(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidHost;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHidHost;->getProtocolMode(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidHost;->getReport(Landroid/bluetooth/BluetoothDevice;BBI)Z
-Landroid/bluetooth/IBluetoothHidHost;->sendData(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetoothHidHost;->setIdleTime(Landroid/bluetooth/BluetoothDevice;B)Z
-Landroid/bluetooth/IBluetoothHidHost;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHidHost;->setProtocolMode(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHidHost;->setReport(Landroid/bluetooth/BluetoothDevice;BLjava/lang/String;)Z
-Landroid/bluetooth/IBluetoothHidHost;->virtualUnplug(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->bindBluetoothProfileService(ILandroid/bluetooth/IBluetoothProfileServiceConnection;)Z
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->disable(Ljava/lang/String;Z)Z
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->enable(Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->enableNoAutoConnect(Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->getAddress()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->getBluetoothGatt()Landroid/bluetooth/IBluetoothGatt;
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->getName()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->getState()I
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->isBleAppPresent()Z
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->isBleScanAlwaysAvailable()Z
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->isEnabled()Z
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->registerAdapter(Landroid/bluetooth/IBluetoothManagerCallback;)Landroid/bluetooth/IBluetooth;
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->registerStateChangeCallback(Landroid/bluetooth/IBluetoothStateChangeCallback;)V
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->unbindBluetoothProfileService(ILandroid/bluetooth/IBluetoothProfileServiceConnection;)V
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->unregisterAdapter(Landroid/bluetooth/IBluetoothManagerCallback;)V
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->unregisterStateChangeCallback(Landroid/bluetooth/IBluetoothStateChangeCallback;)V
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->updateBleAppCount(Landroid/os/IBinder;ZLjava/lang/String;)I
-Landroid/bluetooth/IBluetoothManager$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothManager$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_bindBluetoothProfileService:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_disable:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_enableNoAutoConnect:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_getAddress:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_getBluetoothGatt:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_getName:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_getState:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_isBleAppPresent:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_isBleScanAlwaysAvailable:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_isEnabled:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_registerAdapter:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_registerStateChangeCallback:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_unbindBluetoothProfileService:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_unregisterAdapter:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_unregisterStateChangeCallback:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_updateBleAppCount:I
-Landroid/bluetooth/IBluetoothManager;->bindBluetoothProfileService(ILandroid/bluetooth/IBluetoothProfileServiceConnection;)Z
-Landroid/bluetooth/IBluetoothManager;->disable(Ljava/lang/String;Z)Z
-Landroid/bluetooth/IBluetoothManager;->enable(Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetoothManager;->enableNoAutoConnect(Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetoothManager;->getAddress()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothManager;->getName()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothManager;->getState()I
-Landroid/bluetooth/IBluetoothManager;->isBleAppPresent()Z
-Landroid/bluetooth/IBluetoothManager;->isBleScanAlwaysAvailable()Z
-Landroid/bluetooth/IBluetoothManager;->isEnabled()Z
-Landroid/bluetooth/IBluetoothManager;->registerAdapter(Landroid/bluetooth/IBluetoothManagerCallback;)Landroid/bluetooth/IBluetooth;
-Landroid/bluetooth/IBluetoothManager;->unbindBluetoothProfileService(ILandroid/bluetooth/IBluetoothProfileServiceConnection;)V
-Landroid/bluetooth/IBluetoothManager;->unregisterAdapter(Landroid/bluetooth/IBluetoothManagerCallback;)V
-Landroid/bluetooth/IBluetoothManager;->updateBleAppCount(Landroid/os/IBinder;ZLjava/lang/String;)I
-Landroid/bluetooth/IBluetoothManagerCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothManagerCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothManagerCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothManagerCallback$Stub$Proxy;->onBluetoothServiceDown()V
-Landroid/bluetooth/IBluetoothManagerCallback$Stub$Proxy;->onBluetoothServiceUp(Landroid/bluetooth/IBluetooth;)V
-Landroid/bluetooth/IBluetoothManagerCallback$Stub$Proxy;->onBrEdrDown()V
-Landroid/bluetooth/IBluetoothManagerCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothManagerCallback;
-Landroid/bluetooth/IBluetoothManagerCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothManagerCallback$Stub;->TRANSACTION_onBluetoothServiceDown:I
-Landroid/bluetooth/IBluetoothManagerCallback$Stub;->TRANSACTION_onBluetoothServiceUp:I
-Landroid/bluetooth/IBluetoothManagerCallback$Stub;->TRANSACTION_onBrEdrDown:I
-Landroid/bluetooth/IBluetoothManagerCallback;->onBluetoothServiceDown()V
-Landroid/bluetooth/IBluetoothManagerCallback;->onBluetoothServiceUp(Landroid/bluetooth/IBluetooth;)V
-Landroid/bluetooth/IBluetoothManagerCallback;->onBrEdrDown()V
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->getClient()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->getState()I
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothMap$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothMap$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothMap;
-Landroid/bluetooth/IBluetoothMap$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_getClient:I
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_getState:I
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_isConnected:I
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothMap;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMap;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMap;->getClient()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetoothMap;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothMap;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothMap;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothMap;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothMap;->getState()I
-Landroid/bluetooth/IBluetoothMap;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMap;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->getUnreadMessages(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->sendMessage(Landroid/bluetooth/BluetoothDevice;[Landroid/net/Uri;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)Z
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothMapClient$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothMapClient$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothMapClient;
-Landroid/bluetooth/IBluetoothMapClient$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_getUnreadMessages:I
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_isConnected:I
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_sendMessage:I
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothMapClient;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMapClient;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMapClient;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothMapClient;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothMapClient;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothMapClient;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothMapClient;->getUnreadMessages(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMapClient;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMapClient;->sendMessage(Landroid/bluetooth/BluetoothDevice;[Landroid/net/Uri;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)Z
-Landroid/bluetooth/IBluetoothMapClient;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;->isTetheringOn()Z
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;->setBluetoothTethering(Z)V
-Landroid/bluetooth/IBluetoothPan$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothPan$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothPan;
-Landroid/bluetooth/IBluetoothPan$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothPan$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothPan$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothPan$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothPan$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothPan$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothPan$Stub;->TRANSACTION_isTetheringOn:I
-Landroid/bluetooth/IBluetoothPan$Stub;->TRANSACTION_setBluetoothTethering:I
-Landroid/bluetooth/IBluetoothPan;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothPan;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothPan;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothPan;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothPan;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothPan;->isTetheringOn()Z
-Landroid/bluetooth/IBluetoothPan;->setBluetoothTethering(Z)V
-Landroid/bluetooth/IBluetoothPbap$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothPbap$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothPbap$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothPbap$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothPbap$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothPbap$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothPbap$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothPbap$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothPbap$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothPbap$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothPbap$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothPbap$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothPbap$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothPbap;->disconnect(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothPbap;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothPbap;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothPbap;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothPbapClient$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothPbapClient$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothPbapClient;
-Landroid/bluetooth/IBluetoothPbapClient$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothPbapClient$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothPbapClient$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothPbapClient$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothPbapClient$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothPbapClient$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothPbapClient$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothPbapClient$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothPbapClient;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothPbapClient;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothPbapClient;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothPbapClient;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothPbapClient;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothPbapClient;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothPbapClient;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub$Proxy;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub$Proxy;->onServiceDisconnected(Landroid/content/ComponentName;)V
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothProfileServiceConnection;
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub;->TRANSACTION_onServiceConnected:I
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub;->TRANSACTION_onServiceDisconnected:I
-Landroid/bluetooth/IBluetoothProfileServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothProfileServiceConnection;->onServiceDisconnected(Landroid/content/ComponentName;)V
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->getClient()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->getState()I
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothSap$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothSap$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothSap;
-Landroid/bluetooth/IBluetoothSap$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_getClient:I
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_getState:I
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_isConnected:I
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothSap;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothSap;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothSap;->getClient()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetoothSap;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothSap;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothSap;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothSap;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothSap;->getState()I
-Landroid/bluetooth/IBluetoothSap;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothSap;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothSocketManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothSocketManager$Stub$Proxy;->connectSocket(Landroid/bluetooth/BluetoothDevice;ILandroid/os/ParcelUuid;II)Landroid/os/ParcelFileDescriptor;
-Landroid/bluetooth/IBluetoothSocketManager$Stub$Proxy;->createSocketChannel(ILjava/lang/String;Landroid/os/ParcelUuid;II)Landroid/os/ParcelFileDescriptor;
-Landroid/bluetooth/IBluetoothSocketManager$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothSocketManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothSocketManager$Stub$Proxy;->requestMaximumTxDataLength(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothSocketManager$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothSocketManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothSocketManager;
-Landroid/bluetooth/IBluetoothSocketManager$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothSocketManager$Stub;->TRANSACTION_connectSocket:I
-Landroid/bluetooth/IBluetoothSocketManager$Stub;->TRANSACTION_createSocketChannel:I
-Landroid/bluetooth/IBluetoothSocketManager$Stub;->TRANSACTION_requestMaximumTxDataLength:I
-Landroid/bluetooth/IBluetoothSocketManager;->connectSocket(Landroid/bluetooth/BluetoothDevice;ILandroid/os/ParcelUuid;II)Landroid/os/ParcelFileDescriptor;
-Landroid/bluetooth/IBluetoothSocketManager;->createSocketChannel(ILjava/lang/String;Landroid/os/ParcelUuid;II)Landroid/os/ParcelFileDescriptor;
-Landroid/bluetooth/IBluetoothSocketManager;->requestMaximumTxDataLength(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothStateChangeCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothStateChangeCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothStateChangeCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothStateChangeCallback$Stub$Proxy;->onBluetoothStateChange(Z)V
-Landroid/bluetooth/IBluetoothStateChangeCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/IBluetoothStateChangeCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothStateChangeCallback$Stub;->TRANSACTION_onBluetoothStateChange:I
-Landroid/bluetooth/IBluetoothStateChangeCallback;->onBluetoothStateChange(Z)V
-Landroid/bluetooth/le/AdvertiseCallback;->ADVERTISE_SUCCESS:I
-Landroid/bluetooth/le/AdvertiseData$Builder;->mIncludeDeviceName:Z
-Landroid/bluetooth/le/AdvertiseData$Builder;->mIncludeTxPowerLevel:Z
-Landroid/bluetooth/le/AdvertiseData$Builder;->mManufacturerSpecificData:Landroid/util/SparseArray;
-Landroid/bluetooth/le/AdvertiseData$Builder;->mServiceData:Ljava/util/Map;
-Landroid/bluetooth/le/AdvertiseData$Builder;->mServiceUuids:Ljava/util/List;
-Landroid/bluetooth/le/AdvertiseData;-><init>(Ljava/util/List;Landroid/util/SparseArray;Ljava/util/Map;ZZ)V
-Landroid/bluetooth/le/AdvertiseData;->mIncludeDeviceName:Z
-Landroid/bluetooth/le/AdvertiseData;->mIncludeTxPowerLevel:Z
-Landroid/bluetooth/le/AdvertiseData;->mManufacturerSpecificData:Landroid/util/SparseArray;
-Landroid/bluetooth/le/AdvertiseData;->mServiceData:Ljava/util/Map;
-Landroid/bluetooth/le/AdvertiseData;->mServiceUuids:Ljava/util/List;
-Landroid/bluetooth/le/AdvertiseSettings$Builder;->mConnectable:Z
-Landroid/bluetooth/le/AdvertiseSettings$Builder;->mMode:I
-Landroid/bluetooth/le/AdvertiseSettings$Builder;->mTimeoutMillis:I
-Landroid/bluetooth/le/AdvertiseSettings$Builder;->mTxPowerLevel:I
-Landroid/bluetooth/le/AdvertiseSettings;-><init>(IIZI)V
-Landroid/bluetooth/le/AdvertiseSettings;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/AdvertiseSettings;->LIMITED_ADVERTISING_MAX_MILLIS:I
-Landroid/bluetooth/le/AdvertiseSettings;->mAdvertiseConnectable:Z
-Landroid/bluetooth/le/AdvertiseSettings;->mAdvertiseMode:I
-Landroid/bluetooth/le/AdvertiseSettings;->mAdvertiseTimeoutMillis:I
-Landroid/bluetooth/le/AdvertiseSettings;->mAdvertiseTxPowerLevel:I
-Landroid/bluetooth/le/AdvertisingSet;-><init>(ILandroid/bluetooth/IBluetoothManager;)V
-Landroid/bluetooth/le/AdvertisingSet;->getAdvertiserId()I
-Landroid/bluetooth/le/AdvertisingSet;->getOwnAddress()V
-Landroid/bluetooth/le/AdvertisingSet;->mAdvertiserId:I
-Landroid/bluetooth/le/AdvertisingSet;->mGatt:Landroid/bluetooth/IBluetoothGatt;
-Landroid/bluetooth/le/AdvertisingSet;->setAdvertiserId(I)V
-Landroid/bluetooth/le/AdvertisingSet;->TAG:Ljava/lang/String;
-Landroid/bluetooth/le/AdvertisingSetCallback;->onOwnAddressRead(Landroid/bluetooth/le/AdvertisingSet;ILjava/lang/String;)V
-Landroid/bluetooth/le/AdvertisingSetParameters$Builder;->mConnectable:Z
-Landroid/bluetooth/le/AdvertisingSetParameters$Builder;->mIncludeTxPower:Z
-Landroid/bluetooth/le/AdvertisingSetParameters$Builder;->mInterval:I
-Landroid/bluetooth/le/AdvertisingSetParameters$Builder;->mIsAnonymous:Z
-Landroid/bluetooth/le/AdvertisingSetParameters$Builder;->mIsLegacy:Z
-Landroid/bluetooth/le/AdvertisingSetParameters$Builder;->mPrimaryPhy:I
-Landroid/bluetooth/le/AdvertisingSetParameters$Builder;->mScannable:Z
-Landroid/bluetooth/le/AdvertisingSetParameters$Builder;->mSecondaryPhy:I
-Landroid/bluetooth/le/AdvertisingSetParameters$Builder;->mTxPowerLevel:I
-Landroid/bluetooth/le/AdvertisingSetParameters;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/AdvertisingSetParameters;-><init>(ZZZZZIIII)V
-Landroid/bluetooth/le/AdvertisingSetParameters;->LIMITED_ADVERTISING_MAX_MILLIS:I
-Landroid/bluetooth/le/AdvertisingSetParameters;->mConnectable:Z
-Landroid/bluetooth/le/AdvertisingSetParameters;->mIncludeTxPower:Z
-Landroid/bluetooth/le/AdvertisingSetParameters;->mInterval:I
-Landroid/bluetooth/le/AdvertisingSetParameters;->mIsAnonymous:Z
-Landroid/bluetooth/le/AdvertisingSetParameters;->mIsLegacy:Z
-Landroid/bluetooth/le/AdvertisingSetParameters;->mPrimaryPhy:I
-Landroid/bluetooth/le/AdvertisingSetParameters;->mScannable:Z
-Landroid/bluetooth/le/AdvertisingSetParameters;->mSecondaryPhy:I
-Landroid/bluetooth/le/AdvertisingSetParameters;->mTxPowerLevel:I
-Landroid/bluetooth/le/BluetoothLeAdvertiser;-><init>(Landroid/bluetooth/IBluetoothManager;)V
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->byteLength([B)I
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->cleanup()V
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->FLAGS_FIELD_BYTES:I
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->mAdvertisingSets:Ljava/util/Map;
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->MANUFACTURER_SPECIFIC_DATA_LENGTH:I
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->MAX_ADVERTISING_DATA_BYTES:I
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->MAX_LEGACY_ADVERTISING_DATA_BYTES:I
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->mBluetoothAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->mBluetoothManager:Landroid/bluetooth/IBluetoothManager;
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->mCallbackWrappers:Ljava/util/Map;
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->mHandler:Landroid/os/Handler;
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->mLegacyAdvertisers:Ljava/util/Map;
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->OVERHEAD_BYTES_PER_FIELD:I
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->postStartFailure(Landroid/bluetooth/le/AdvertiseCallback;I)V
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->postStartSetFailure(Landroid/os/Handler;Landroid/bluetooth/le/AdvertisingSetCallback;I)V
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->postStartSuccess(Landroid/bluetooth/le/AdvertiseCallback;Landroid/bluetooth/le/AdvertiseSettings;)V
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->TAG:Ljava/lang/String;
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->totalBytes(Landroid/bluetooth/le/AdvertiseData;Z)I
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->wrap(Landroid/bluetooth/le/AdvertisingSetCallback;Landroid/os/Handler;)Landroid/bluetooth/le/IAdvertisingSetCallback;
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->wrapOldCallback(Landroid/bluetooth/le/AdvertiseCallback;Landroid/bluetooth/le/AdvertiseSettings;)Landroid/bluetooth/le/AdvertisingSetCallback;
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->flushPendingBatchResults()V
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->mBluetoothGatt:Landroid/bluetooth/IBluetoothGatt;
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->mFilters:Ljava/util/List;
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->mResultStorages:Ljava/util/List;
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->mScanCallback:Landroid/bluetooth/le/ScanCallback;
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->mScannerId:I
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->mSettings:Landroid/bluetooth/le/ScanSettings;
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->mWorkSource:Landroid/os/WorkSource;
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->onBatchScanResults(Ljava/util/List;)V
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->onFoundOrLost(ZLandroid/bluetooth/le/ScanResult;)V
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->onScanManagerErrorCallback(I)V
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->onScannerRegistered(II)V
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->onScanResult(Landroid/bluetooth/le/ScanResult;)V
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->REGISTRATION_CALLBACK_TIMEOUT_MILLIS:I
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->startRegistration()V
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->stopLeScan()V
-Landroid/bluetooth/le/BluetoothLeScanner;-><init>(Landroid/bluetooth/IBluetoothManager;)V
-Landroid/bluetooth/le/BluetoothLeScanner;->cleanup()V
-Landroid/bluetooth/le/BluetoothLeScanner;->DBG:Z
-Landroid/bluetooth/le/BluetoothLeScanner;->isHardwareResourcesAvailableForScan(Landroid/bluetooth/le/ScanSettings;)Z
-Landroid/bluetooth/le/BluetoothLeScanner;->isSettingsAndFilterComboAllowed(Landroid/bluetooth/le/ScanSettings;Ljava/util/List;)Z
-Landroid/bluetooth/le/BluetoothLeScanner;->isSettingsConfigAllowedForScan(Landroid/bluetooth/le/ScanSettings;)Z
-Landroid/bluetooth/le/BluetoothLeScanner;->mBluetoothAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/le/BluetoothLeScanner;->mBluetoothManager:Landroid/bluetooth/IBluetoothManager;
-Landroid/bluetooth/le/BluetoothLeScanner;->mHandler:Landroid/os/Handler;
-Landroid/bluetooth/le/BluetoothLeScanner;->mLeScanClients:Ljava/util/Map;
-Landroid/bluetooth/le/BluetoothLeScanner;->postCallbackError(Landroid/bluetooth/le/ScanCallback;I)V
-Landroid/bluetooth/le/BluetoothLeScanner;->postCallbackErrorOrReturn(Landroid/bluetooth/le/ScanCallback;I)I
-Landroid/bluetooth/le/BluetoothLeScanner;->startScan(Ljava/util/List;Landroid/bluetooth/le/ScanSettings;Landroid/os/WorkSource;Landroid/bluetooth/le/ScanCallback;Landroid/app/PendingIntent;Ljava/util/List;)I
-Landroid/bluetooth/le/BluetoothLeScanner;->TAG:Ljava/lang/String;
-Landroid/bluetooth/le/BluetoothLeScanner;->VDBG:Z
-Landroid/bluetooth/le/BluetoothLeUtils;-><init>()V
-Landroid/bluetooth/le/BluetoothLeUtils;->checkAdapterStateOn(Landroid/bluetooth/BluetoothAdapter;)V
-Landroid/bluetooth/le/BluetoothLeUtils;->equals(Landroid/util/SparseArray;Landroid/util/SparseArray;)Z
-Landroid/bluetooth/le/BluetoothLeUtils;->equals(Ljava/util/Map;Ljava/util/Map;)Z
-Landroid/bluetooth/le/BluetoothLeUtils;->toString(Landroid/util/SparseArray;)Ljava/lang/String;
-Landroid/bluetooth/le/BluetoothLeUtils;->toString(Ljava/util/Map;)Ljava/lang/String;
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onAdvertisingDataSet(II)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onAdvertisingEnabled(IZI)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onAdvertisingParametersUpdated(III)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onAdvertisingSetStarted(III)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onAdvertisingSetStopped(I)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onOwnAddressRead(IILjava/lang/String;)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onPeriodicAdvertisingDataSet(II)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onPeriodicAdvertisingEnabled(IZI)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onPeriodicAdvertisingParametersUpdated(II)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onScanResponseDataSet(II)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;-><init>()V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/le/IAdvertisingSetCallback;
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onAdvertisingDataSet:I
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onAdvertisingEnabled:I
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onAdvertisingParametersUpdated:I
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onAdvertisingSetStarted:I
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onAdvertisingSetStopped:I
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onOwnAddressRead:I
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onPeriodicAdvertisingDataSet:I
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onPeriodicAdvertisingEnabled:I
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onPeriodicAdvertisingParametersUpdated:I
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onScanResponseDataSet:I
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onAdvertisingDataSet(II)V
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onAdvertisingEnabled(IZI)V
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onAdvertisingParametersUpdated(III)V
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onAdvertisingSetStarted(III)V
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onAdvertisingSetStopped(I)V
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onOwnAddressRead(IILjava/lang/String;)V
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onPeriodicAdvertisingDataSet(II)V
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onPeriodicAdvertisingEnabled(IZI)V
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onPeriodicAdvertisingParametersUpdated(II)V
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onScanResponseDataSet(II)V
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub$Proxy;->onPeriodicAdvertisingReport(Landroid/bluetooth/le/PeriodicAdvertisingReport;)V
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub$Proxy;->onSyncEstablished(ILandroid/bluetooth/BluetoothDevice;IIII)V
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub$Proxy;->onSyncLost(I)V
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub;-><init>()V
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/le/IPeriodicAdvertisingCallback;
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub;->TRANSACTION_onPeriodicAdvertisingReport:I
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub;->TRANSACTION_onSyncEstablished:I
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub;->TRANSACTION_onSyncLost:I
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback;->onPeriodicAdvertisingReport(Landroid/bluetooth/le/PeriodicAdvertisingReport;)V
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback;->onSyncEstablished(ILandroid/bluetooth/BluetoothDevice;IIII)V
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback;->onSyncLost(I)V
-Landroid/bluetooth/le/IScannerCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/le/IScannerCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/le/IScannerCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/le/IScannerCallback$Stub$Proxy;->onBatchScanResults(Ljava/util/List;)V
-Landroid/bluetooth/le/IScannerCallback$Stub$Proxy;->onFoundOrLost(ZLandroid/bluetooth/le/ScanResult;)V
-Landroid/bluetooth/le/IScannerCallback$Stub$Proxy;->onScanManagerErrorCallback(I)V
-Landroid/bluetooth/le/IScannerCallback$Stub$Proxy;->onScannerRegistered(II)V
-Landroid/bluetooth/le/IScannerCallback$Stub$Proxy;->onScanResult(Landroid/bluetooth/le/ScanResult;)V
-Landroid/bluetooth/le/IScannerCallback$Stub;-><init>()V
-Landroid/bluetooth/le/IScannerCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/le/IScannerCallback;
-Landroid/bluetooth/le/IScannerCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/le/IScannerCallback$Stub;->TRANSACTION_onBatchScanResults:I
-Landroid/bluetooth/le/IScannerCallback$Stub;->TRANSACTION_onFoundOrLost:I
-Landroid/bluetooth/le/IScannerCallback$Stub;->TRANSACTION_onScanManagerErrorCallback:I
-Landroid/bluetooth/le/IScannerCallback$Stub;->TRANSACTION_onScannerRegistered:I
-Landroid/bluetooth/le/IScannerCallback$Stub;->TRANSACTION_onScanResult:I
-Landroid/bluetooth/le/IScannerCallback;->onBatchScanResults(Ljava/util/List;)V
-Landroid/bluetooth/le/IScannerCallback;->onFoundOrLost(ZLandroid/bluetooth/le/ScanResult;)V
-Landroid/bluetooth/le/IScannerCallback;->onScanManagerErrorCallback(I)V
-Landroid/bluetooth/le/IScannerCallback;->onScannerRegistered(II)V
-Landroid/bluetooth/le/IScannerCallback;->onScanResult(Landroid/bluetooth/le/ScanResult;)V
-Landroid/bluetooth/le/PeriodicAdvertisingCallback;-><init>()V
-Landroid/bluetooth/le/PeriodicAdvertisingCallback;->onPeriodicAdvertisingReport(Landroid/bluetooth/le/PeriodicAdvertisingReport;)V
-Landroid/bluetooth/le/PeriodicAdvertisingCallback;->onSyncEstablished(ILandroid/bluetooth/BluetoothDevice;IIII)V
-Landroid/bluetooth/le/PeriodicAdvertisingCallback;->onSyncLost(I)V
-Landroid/bluetooth/le/PeriodicAdvertisingCallback;->SYNC_NO_RESOURCES:I
-Landroid/bluetooth/le/PeriodicAdvertisingCallback;->SYNC_NO_RESPONSE:I
-Landroid/bluetooth/le/PeriodicAdvertisingCallback;->SYNC_SUCCESS:I
-Landroid/bluetooth/le/PeriodicAdvertisingManager;-><init>(Landroid/bluetooth/IBluetoothManager;)V
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->mBluetoothAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->mBluetoothManager:Landroid/bluetooth/IBluetoothManager;
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->mCallbackWrappers:Ljava/util/Map;
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->registerSync(Landroid/bluetooth/le/ScanResult;IILandroid/bluetooth/le/PeriodicAdvertisingCallback;)V
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->registerSync(Landroid/bluetooth/le/ScanResult;IILandroid/bluetooth/le/PeriodicAdvertisingCallback;Landroid/os/Handler;)V
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->SKIP_MAX:I
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->SKIP_MIN:I
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->SYNC_STARTING:I
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->TAG:Ljava/lang/String;
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->TIMEOUT_MAX:I
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->TIMEOUT_MIN:I
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->unregisterSync(Landroid/bluetooth/le/PeriodicAdvertisingCallback;)V
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->wrap(Landroid/bluetooth/le/PeriodicAdvertisingCallback;Landroid/os/Handler;)Landroid/bluetooth/le/IPeriodicAdvertisingCallback;
-Landroid/bluetooth/le/PeriodicAdvertisingParameters$Builder;->mIncludeTxPower:Z
-Landroid/bluetooth/le/PeriodicAdvertisingParameters$Builder;->mInterval:I
-Landroid/bluetooth/le/PeriodicAdvertisingParameters;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/PeriodicAdvertisingParameters;-><init>(ZI)V
-Landroid/bluetooth/le/PeriodicAdvertisingParameters;->INTERVAL_MAX:I
-Landroid/bluetooth/le/PeriodicAdvertisingParameters;->INTERVAL_MIN:I
-Landroid/bluetooth/le/PeriodicAdvertisingParameters;->mIncludeTxPower:Z
-Landroid/bluetooth/le/PeriodicAdvertisingParameters;->mInterval:I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;-><init>(IIIILandroid/bluetooth/le/ScanRecord;)V
-Landroid/bluetooth/le/PeriodicAdvertisingReport;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->DATA_COMPLETE:I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->DATA_INCOMPLETE_TRUNCATED:I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->getData()Landroid/bluetooth/le/ScanRecord;
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->getDataStatus()I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->getRssi()I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->getSyncHandle()I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->getTimestampNanos()J
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->getTxPower()I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->mData:Landroid/bluetooth/le/ScanRecord;
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->mDataStatus:I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->mRssi:I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->mSyncHandle:I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->mTimestampNanos:J
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->mTxPower:I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->readFromParcel(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/ResultStorageDescriptor;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/ResultStorageDescriptor;->mLength:I
-Landroid/bluetooth/le/ResultStorageDescriptor;->mOffset:I
-Landroid/bluetooth/le/ResultStorageDescriptor;->mType:I
-Landroid/bluetooth/le/ResultStorageDescriptor;->ReadFromParcel(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/ScanCallback;->NO_ERROR:I
-Landroid/bluetooth/le/ScanCallback;->SCAN_FAILED_OUT_OF_HARDWARE_RESOURCES:I
-Landroid/bluetooth/le/ScanCallback;->SCAN_FAILED_SCANNING_TOO_FREQUENTLY:I
-Landroid/bluetooth/le/ScanFilter$Builder;->mDeviceAddress:Ljava/lang/String;
-Landroid/bluetooth/le/ScanFilter$Builder;->mDeviceName:Ljava/lang/String;
-Landroid/bluetooth/le/ScanFilter$Builder;->mManufacturerData:[B
-Landroid/bluetooth/le/ScanFilter$Builder;->mManufacturerDataMask:[B
-Landroid/bluetooth/le/ScanFilter$Builder;->mManufacturerId:I
-Landroid/bluetooth/le/ScanFilter$Builder;->mServiceData:[B
-Landroid/bluetooth/le/ScanFilter$Builder;->mServiceDataMask:[B
-Landroid/bluetooth/le/ScanFilter$Builder;->mServiceDataUuid:Landroid/os/ParcelUuid;
-Landroid/bluetooth/le/ScanFilter$Builder;->mServiceUuid:Landroid/os/ParcelUuid;
-Landroid/bluetooth/le/ScanFilter$Builder;->mUuidMask:Landroid/os/ParcelUuid;
-Landroid/bluetooth/le/ScanFilter;-><init>(Ljava/lang/String;Ljava/lang/String;Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;[B[BI[B[B)V
-Landroid/bluetooth/le/ScanFilter;->EMPTY:Landroid/bluetooth/le/ScanFilter;
-Landroid/bluetooth/le/ScanFilter;->isAllFieldsEmpty()Z
-Landroid/bluetooth/le/ScanFilter;->matchesPartialData([B[B[B)Z
-Landroid/bluetooth/le/ScanFilter;->matchesServiceUuid(Ljava/util/UUID;Ljava/util/UUID;Ljava/util/UUID;)Z
-Landroid/bluetooth/le/ScanFilter;->matchesServiceUuids(Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;Ljava/util/List;)Z
-Landroid/bluetooth/le/ScanFilter;->mDeviceAddress:Ljava/lang/String;
-Landroid/bluetooth/le/ScanFilter;->mDeviceName:Ljava/lang/String;
-Landroid/bluetooth/le/ScanFilter;->mManufacturerData:[B
-Landroid/bluetooth/le/ScanFilter;->mManufacturerDataMask:[B
-Landroid/bluetooth/le/ScanFilter;->mManufacturerId:I
-Landroid/bluetooth/le/ScanFilter;->mServiceData:[B
-Landroid/bluetooth/le/ScanFilter;->mServiceDataMask:[B
-Landroid/bluetooth/le/ScanFilter;->mServiceDataUuid:Landroid/os/ParcelUuid;
-Landroid/bluetooth/le/ScanFilter;->mServiceUuid:Landroid/os/ParcelUuid;
-Landroid/bluetooth/le/ScanFilter;->mServiceUuidMask:Landroid/os/ParcelUuid;
-Landroid/bluetooth/le/ScanRecord;-><init>(Ljava/util/List;Landroid/util/SparseArray;Ljava/util/Map;IILjava/lang/String;[B)V
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_FLAGS:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_LOCAL_NAME_COMPLETE:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_LOCAL_NAME_SHORT:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_MANUFACTURER_SPECIFIC_DATA:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_SERVICE_DATA_128_BIT:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_SERVICE_DATA_16_BIT:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_SERVICE_DATA_32_BIT:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_SERVICE_UUIDS_128_BIT_COMPLETE:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_SERVICE_UUIDS_128_BIT_PARTIAL:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_SERVICE_UUIDS_16_BIT_COMPLETE:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_SERVICE_UUIDS_16_BIT_PARTIAL:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_SERVICE_UUIDS_32_BIT_COMPLETE:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_SERVICE_UUIDS_32_BIT_PARTIAL:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_TX_POWER_LEVEL:I
-Landroid/bluetooth/le/ScanRecord;->extractBytes([BII)[B
-Landroid/bluetooth/le/ScanRecord;->mAdvertiseFlags:I
-Landroid/bluetooth/le/ScanRecord;->mBytes:[B
-Landroid/bluetooth/le/ScanRecord;->mDeviceName:Ljava/lang/String;
-Landroid/bluetooth/le/ScanRecord;->mManufacturerSpecificData:Landroid/util/SparseArray;
-Landroid/bluetooth/le/ScanRecord;->mServiceData:Ljava/util/Map;
-Landroid/bluetooth/le/ScanRecord;->mServiceUuids:Ljava/util/List;
-Landroid/bluetooth/le/ScanRecord;->mTxPowerLevel:I
-Landroid/bluetooth/le/ScanRecord;->parseServiceUuid([BIIILjava/util/List;)I
-Landroid/bluetooth/le/ScanRecord;->TAG:Ljava/lang/String;
-Landroid/bluetooth/le/ScanResult;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/ScanResult;->ET_CONNECTABLE_MASK:I
-Landroid/bluetooth/le/ScanResult;->ET_LEGACY_MASK:I
-Landroid/bluetooth/le/ScanResult;->mAdvertisingSid:I
-Landroid/bluetooth/le/ScanResult;->mDevice:Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/le/ScanResult;->mEventType:I
-Landroid/bluetooth/le/ScanResult;->mPeriodicAdvertisingInterval:I
-Landroid/bluetooth/le/ScanResult;->mPrimaryPhy:I
-Landroid/bluetooth/le/ScanResult;->mRssi:I
-Landroid/bluetooth/le/ScanResult;->mScanRecord:Landroid/bluetooth/le/ScanRecord;
-Landroid/bluetooth/le/ScanResult;->mSecondaryPhy:I
-Landroid/bluetooth/le/ScanResult;->mTimestampNanos:J
-Landroid/bluetooth/le/ScanResult;->mTxPower:I
-Landroid/bluetooth/le/ScanResult;->readFromParcel(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/ScanSettings$Builder;->isValidCallbackType(I)Z
-Landroid/bluetooth/le/ScanSettings$Builder;->mCallbackType:I
-Landroid/bluetooth/le/ScanSettings$Builder;->mLegacy:Z
-Landroid/bluetooth/le/ScanSettings$Builder;->mMatchMode:I
-Landroid/bluetooth/le/ScanSettings$Builder;->mNumOfMatchesPerFilter:I
-Landroid/bluetooth/le/ScanSettings$Builder;->mPhy:I
-Landroid/bluetooth/le/ScanSettings$Builder;->mReportDelayMillis:J
-Landroid/bluetooth/le/ScanSettings$Builder;->mScanMode:I
-Landroid/bluetooth/le/ScanSettings$Builder;->mScanResultType:I
-Landroid/bluetooth/le/ScanSettings;-><init>(IIIJIIZI)V
-Landroid/bluetooth/le/ScanSettings;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/ScanSettings;->getMatchMode()I
-Landroid/bluetooth/le/ScanSettings;->getNumOfMatches()I
-Landroid/bluetooth/le/ScanSettings;->mCallbackType:I
-Landroid/bluetooth/le/ScanSettings;->mLegacy:Z
-Landroid/bluetooth/le/ScanSettings;->mMatchMode:I
-Landroid/bluetooth/le/ScanSettings;->mNumOfMatchesPerFilter:I
-Landroid/bluetooth/le/ScanSettings;->mPhy:I
-Landroid/bluetooth/le/ScanSettings;->mReportDelayMillis:J
-Landroid/bluetooth/le/ScanSettings;->mScanMode:I
-Landroid/bluetooth/le/ScanSettings;->mScanResultType:I
-Landroid/bluetooth/le/TruncatedFilter;->mFilter:Landroid/bluetooth/le/ScanFilter;
-Landroid/bluetooth/le/TruncatedFilter;->mStorageDescriptors:Ljava/util/List;
-Landroid/bluetooth/OobData;-><init>()V
-Landroid/bluetooth/OobData;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/OobData;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/OobData;->getLeBluetoothDeviceAddress()[B
-Landroid/bluetooth/OobData;->getLeSecureConnectionsConfirmation()[B
-Landroid/bluetooth/OobData;->getLeSecureConnectionsRandom()[B
-Landroid/bluetooth/OobData;->getSecurityManagerTk()[B
-Landroid/bluetooth/OobData;->mLeBluetoothDeviceAddress:[B
-Landroid/bluetooth/OobData;->mLeSecureConnectionsConfirmation:[B
-Landroid/bluetooth/OobData;->mLeSecureConnectionsRandom:[B
-Landroid/bluetooth/OobData;->mSecurityManagerTk:[B
-Landroid/bluetooth/OobData;->setLeBluetoothDeviceAddress([B)V
-Landroid/bluetooth/OobData;->setLeSecureConnectionsConfirmation([B)V
-Landroid/bluetooth/OobData;->setLeSecureConnectionsRandom([B)V
-Landroid/bluetooth/OobData;->setSecurityManagerTk([B)V
-Landroid/bluetooth/SdpMasRecord$MessageType;-><init>()V
-Landroid/bluetooth/SdpMasRecord$MessageType;->EMAIL:I
-Landroid/bluetooth/SdpMasRecord$MessageType;->MMS:I
-Landroid/bluetooth/SdpMasRecord$MessageType;->SMS_CDMA:I
-Landroid/bluetooth/SdpMasRecord$MessageType;->SMS_GSM:I
-Landroid/bluetooth/SdpMasRecord;-><init>(IIIIIILjava/lang/String;)V
-Landroid/bluetooth/SdpMasRecord;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/SdpMasRecord;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/SdpMasRecord;->getL2capPsm()I
-Landroid/bluetooth/SdpMasRecord;->getMasInstanceId()I
-Landroid/bluetooth/SdpMasRecord;->getProfileVersion()I
-Landroid/bluetooth/SdpMasRecord;->getRfcommCannelNumber()I
-Landroid/bluetooth/SdpMasRecord;->getServiceName()Ljava/lang/String;
-Landroid/bluetooth/SdpMasRecord;->getSupportedFeatures()I
-Landroid/bluetooth/SdpMasRecord;->getSupportedMessageTypes()I
-Landroid/bluetooth/SdpMasRecord;->mL2capPsm:I
-Landroid/bluetooth/SdpMasRecord;->mMasInstanceId:I
-Landroid/bluetooth/SdpMasRecord;->mProfileVersion:I
-Landroid/bluetooth/SdpMasRecord;->mRfcommChannelNumber:I
-Landroid/bluetooth/SdpMasRecord;->mServiceName:Ljava/lang/String;
-Landroid/bluetooth/SdpMasRecord;->msgSupported(I)Z
-Landroid/bluetooth/SdpMasRecord;->mSupportedFeatures:I
-Landroid/bluetooth/SdpMasRecord;->mSupportedMessageTypes:I
-Landroid/bluetooth/SdpMnsRecord;-><init>(IIIILjava/lang/String;)V
-Landroid/bluetooth/SdpMnsRecord;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/SdpMnsRecord;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/SdpMnsRecord;->getL2capPsm()I
-Landroid/bluetooth/SdpMnsRecord;->getProfileVersion()I
-Landroid/bluetooth/SdpMnsRecord;->getRfcommChannelNumber()I
-Landroid/bluetooth/SdpMnsRecord;->getServiceName()Ljava/lang/String;
-Landroid/bluetooth/SdpMnsRecord;->getSupportedFeatures()I
-Landroid/bluetooth/SdpMnsRecord;->mL2capPsm:I
-Landroid/bluetooth/SdpMnsRecord;->mProfileVersion:I
-Landroid/bluetooth/SdpMnsRecord;->mRfcommChannelNumber:I
-Landroid/bluetooth/SdpMnsRecord;->mServiceName:Ljava/lang/String;
-Landroid/bluetooth/SdpMnsRecord;->mSupportedFeatures:I
-Landroid/bluetooth/SdpOppOpsRecord;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/SdpOppOpsRecord;-><init>(Ljava/lang/String;III[B)V
-Landroid/bluetooth/SdpOppOpsRecord;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/SdpOppOpsRecord;->getFormatsList()[B
-Landroid/bluetooth/SdpOppOpsRecord;->getL2capPsm()I
-Landroid/bluetooth/SdpOppOpsRecord;->getProfileVersion()I
-Landroid/bluetooth/SdpOppOpsRecord;->getRfcommChannel()I
-Landroid/bluetooth/SdpOppOpsRecord;->getServiceName()Ljava/lang/String;
-Landroid/bluetooth/SdpOppOpsRecord;->mFormatsList:[B
-Landroid/bluetooth/SdpOppOpsRecord;->mL2capPsm:I
-Landroid/bluetooth/SdpOppOpsRecord;->mProfileVersion:I
-Landroid/bluetooth/SdpOppOpsRecord;->mRfcommChannel:I
-Landroid/bluetooth/SdpOppOpsRecord;->mServiceName:Ljava/lang/String;
-Landroid/bluetooth/SdpPseRecord;-><init>(IIIIILjava/lang/String;)V
-Landroid/bluetooth/SdpPseRecord;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/SdpPseRecord;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/SdpPseRecord;->getL2capPsm()I
-Landroid/bluetooth/SdpPseRecord;->getProfileVersion()I
-Landroid/bluetooth/SdpPseRecord;->getRfcommChannelNumber()I
-Landroid/bluetooth/SdpPseRecord;->getServiceName()Ljava/lang/String;
-Landroid/bluetooth/SdpPseRecord;->getSupportedFeatures()I
-Landroid/bluetooth/SdpPseRecord;->getSupportedRepositories()I
-Landroid/bluetooth/SdpPseRecord;->mL2capPsm:I
-Landroid/bluetooth/SdpPseRecord;->mProfileVersion:I
-Landroid/bluetooth/SdpPseRecord;->mRfcommChannelNumber:I
-Landroid/bluetooth/SdpPseRecord;->mServiceName:Ljava/lang/String;
-Landroid/bluetooth/SdpPseRecord;->mSupportedFeatures:I
-Landroid/bluetooth/SdpPseRecord;->mSupportedRepositories:I
-Landroid/bluetooth/SdpRecord;-><init>(I[B)V
-Landroid/bluetooth/SdpRecord;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/SdpRecord;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/SdpRecord;->getRawData()[B
-Landroid/bluetooth/SdpRecord;->getRawSize()I
-Landroid/bluetooth/SdpRecord;->mRawData:[B
-Landroid/bluetooth/SdpRecord;->mRawSize:I
-Landroid/bluetooth/SdpSapsRecord;-><init>(IILjava/lang/String;)V
-Landroid/bluetooth/SdpSapsRecord;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/SdpSapsRecord;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/SdpSapsRecord;->getProfileVersion()I
-Landroid/bluetooth/SdpSapsRecord;->getRfcommCannelNumber()I
-Landroid/bluetooth/SdpSapsRecord;->getServiceName()Ljava/lang/String;
-Landroid/bluetooth/SdpSapsRecord;->mProfileVersion:I
-Landroid/bluetooth/SdpSapsRecord;->mRfcommChannelNumber:I
-Landroid/bluetooth/SdpSapsRecord;->mServiceName:Ljava/lang/String;
-Landroid/bluetooth/UidTraffic;-><init>(I)V
-Landroid/bluetooth/UidTraffic;-><init>(IJJ)V
-Landroid/bluetooth/UidTraffic;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/UidTraffic;->addRxBytes(J)V
-Landroid/bluetooth/UidTraffic;->addTxBytes(J)V
-Landroid/bluetooth/UidTraffic;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/UidTraffic;->getRxBytes()J
-Landroid/bluetooth/UidTraffic;->getTxBytes()J
-Landroid/bluetooth/UidTraffic;->getUid()I
-Landroid/bluetooth/UidTraffic;->mAppUid:I
-Landroid/bluetooth/UidTraffic;->mRxBytes:J
-Landroid/bluetooth/UidTraffic;->mTxBytes:J
-Landroid/bluetooth/UidTraffic;->setRxBytes(J)V
-Landroid/bluetooth/UidTraffic;->setTxBytes(J)V
diff --git a/apex/hiddenapi/hiddenapi-max-target-p-low-priority.txt b/apex/hiddenapi/hiddenapi-max-target-p-low-priority.txt
deleted file mode 100644
index 39e3a0a261..0000000000
--- a/apex/hiddenapi/hiddenapi-max-target-p-low-priority.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Landroid/bluetooth/IBluetooth$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothA2dp$Stub;-><init>()V
diff --git a/apex/hiddenapi/hiddenapi-max-target-r-low-priority.txt b/apex/hiddenapi/hiddenapi-max-target-r-low-priority.txt
deleted file mode 100644
index 8b0b81d0d7..0000000000
--- a/apex/hiddenapi/hiddenapi-max-target-r-low-priority.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_enable:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_enable:I
diff --git a/apex/hiddenapi/hiddenapi-unsupported.txt b/apex/hiddenapi/hiddenapi-unsupported.txt
deleted file mode 100644
index 0d9ca27251..0000000000
--- a/apex/hiddenapi/hiddenapi-unsupported.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getAddress()Ljava/lang/String;
-Landroid/bluetooth/IBluetooth$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetooth;
-Landroid/bluetooth/IBluetoothA2dp$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothA2dp;
-Landroid/bluetooth/IBluetoothCallback$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothGattCallback$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothGattCallback;
-Landroid/bluetooth/IBluetoothHeadset$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHeadset;
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothManager;
-Landroid/bluetooth/IBluetoothManagerCallback$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothPbap$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothPbap;
-Landroid/bluetooth/IBluetoothStateChangeCallback$Stub;-><init>()V
diff --git a/framework/aidl-export/Android.bp b/framework/aidl-export/Android.bp
deleted file mode 100644
index 430213a14c..0000000000
--- a/framework/aidl-export/Android.bp
+++ /dev/null
@@ -1,11 +0,0 @@
-package {
- default_applicable_licenses: ["Android-Apache-2.0"],
-}
-
-filegroup {
- name: "framework-bluetooth-updatable-exported-aidl-sources",
- srcs: ["**/*.aidl"],
- visibility: [
- "//packages/modules/Bluetooth/system/binder",
- ],
-}
diff --git a/framework/api/current.txt b/framework/api/current.txt
index ce9f6e36b5..94bef497f6 100644
--- a/framework/api/current.txt
+++ b/framework/api/current.txt
@@ -437,6 +437,7 @@ package android.bluetooth {
field public static final int BITS_PER_SAMPLE_24 = 2; // 0x2
field public static final int BITS_PER_SAMPLE_32 = 4; // 0x4
field public static final int BITS_PER_SAMPLE_NONE = 0; // 0x0
+ field public static final int CHANNEL_MODE_JOINT_STEREO = 4; // 0x4
field public static final int CHANNEL_MODE_MONO = 1; // 0x1
field public static final int CHANNEL_MODE_NONE = 0; // 0x0
field public static final int CHANNEL_MODE_STEREO = 2; // 0x2
@@ -444,20 +445,29 @@ package android.bluetooth {
field public static final int CODEC_PRIORITY_DISABLED = -1; // 0xffffffff
field public static final int CODEC_PRIORITY_HIGHEST = 1000000; // 0xf4240
field @NonNull public static final android.os.Parcelable.Creator<android.bluetooth.BluetoothCodecConfig> CREATOR;
+ field public static final int SAMPLE_RATE_16000 = 64; // 0x40
field public static final int SAMPLE_RATE_176400 = 16; // 0x10
field public static final int SAMPLE_RATE_192000 = 32; // 0x20
+ field public static final int SAMPLE_RATE_24000 = 128; // 0x80
+ field public static final int SAMPLE_RATE_32000 = 256; // 0x100
field public static final int SAMPLE_RATE_44100 = 1; // 0x1
field public static final int SAMPLE_RATE_48000 = 2; // 0x2
+ field public static final int SAMPLE_RATE_8000 = 512; // 0x200
field public static final int SAMPLE_RATE_88200 = 4; // 0x4
field public static final int SAMPLE_RATE_96000 = 8; // 0x8
field public static final int SAMPLE_RATE_NONE = 0; // 0x0
field public static final int SOURCE_CODEC_TYPE_AAC = 1; // 0x1
field public static final int SOURCE_CODEC_TYPE_APTX = 2; // 0x2
+ field public static final int SOURCE_CODEC_TYPE_APTX_ADAPTIVE = 6; // 0x6
field public static final int SOURCE_CODEC_TYPE_APTX_HD = 3; // 0x3
+ field public static final int SOURCE_CODEC_TYPE_APTX_TWSP = 7; // 0x7
+ field public static final int SOURCE_CODEC_TYPE_CELT = 8; // 0x8
field public static final int SOURCE_CODEC_TYPE_INVALID = 1000000; // 0xf4240
field public static final int SOURCE_CODEC_TYPE_LC3 = 5; // 0x5
field public static final int SOURCE_CODEC_TYPE_LDAC = 4; // 0x4
+ field public static final int SOURCE_CODEC_TYPE_MAX = 6; // 0x6
field public static final int SOURCE_CODEC_TYPE_SBC = 0; // 0x0
+ field public static final int SOURCE_QVA_CODEC_TYPE_MAX = 8; // 0x8
}
public static final class BluetoothCodecConfig.Builder {
diff --git a/framework/java/android/bluetooth/BluetoothAdapter.java b/framework/java/android/bluetooth/BluetoothAdapter.java
index 0cd9254618..84a21edf68 100644
--- a/framework/java/android/bluetooth/BluetoothAdapter.java
+++ b/framework/java/android/bluetooth/BluetoothAdapter.java
@@ -86,7 +86,9 @@ import java.util.concurrent.Executor;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
-
+import java.lang.reflect.Method;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
/**
* Represents the local device Bluetooth adapter. The {@link BluetoothAdapter}
* lets you perform fundamental Bluetooth tasks, such as initiate
@@ -1016,6 +1018,7 @@ public final class BluetoothAdapter {
*/
@RequiresNoPermission
public BluetoothDevice getRemoteDevice(String address) {
+ android.util.SeempLog.record(62);
final BluetoothDevice res = new BluetoothDevice(address);
res.setAttributionSource(mAttributionSource);
return res;
@@ -1055,6 +1058,7 @@ public final class BluetoothAdapter {
*/
@RequiresNoPermission
public BluetoothDevice getRemoteDevice(byte[] address) {
+ android.util.SeempLog.record(62);
if (address == null || address.length != 6) {
throw new IllegalArgumentException("Bluetooth address must have 6 bytes");
}
@@ -1337,6 +1341,7 @@ public final class BluetoothAdapter {
@RequiresLegacyBluetoothPermission
@RequiresNoPermission
public @AdapterState int getState() {
+ android.util.SeempLog.record(63);
int state = getStateInternal();
// Consider all internal states as OFF
@@ -1434,6 +1439,7 @@ public final class BluetoothAdapter {
@RequiresBluetoothConnectPermission
@RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
public boolean enable() {
+ android.util.SeempLog.record(56);
if (isEnabled()) {
if (DBG) {
Log.d(TAG, "enable(): BT already enabled!");
@@ -1486,6 +1492,7 @@ public final class BluetoothAdapter {
@RequiresBluetoothConnectPermission
@RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
public boolean disable() {
+ android.util.SeempLog.record(57);
try {
return mManagerService.disable(mAttributionSource, true);
} catch (RemoteException e) {
@@ -1509,6 +1516,7 @@ public final class BluetoothAdapter {
android.Manifest.permission.BLUETOOTH_PRIVILEGED,
})
public boolean disable(boolean persist) {
+ android.util.SeempLog.record(57);
try {
return mManagerService.disable(mAttributionSource, persist);
@@ -2128,6 +2136,7 @@ public final class BluetoothAdapter {
@RequiresBluetoothLocationPermission
@RequiresPermission(android.Manifest.permission.BLUETOOTH_SCAN)
public boolean startDiscovery() {
+ android.util.SeempLog.record(58);
if (getState() != STATE_ON) {
return false;
}
@@ -2323,7 +2332,21 @@ public final class BluetoothAdapter {
return false;
}
-
+ /** @hide */
+ @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+ public boolean isBroadcastActive() {
+ try {
+ mServiceLock.readLock().lock();
+ if (mService != null) {
+ return mService.isBroadcastActive(mAttributionSource);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
+ return false;
+ }
/**
* Get the active devices for the BluetoothProfile specified
*
@@ -2750,6 +2773,13 @@ public final class BluetoothAdapter {
}
/**
+ * @hide
+ */
+ public void btCmdGetFunctionCallmap(boolean isdump) {
+ Log.d(TAG, "btCmdGetFunctionCallmap: " + isdump);
+ }
+
+ /**
* Return true if Hearing Aid Profile is supported.
*
* @return true if phone supports Hearing Aid Profile
@@ -2911,6 +2941,7 @@ public final class BluetoothAdapter {
@RequiresBluetoothConnectPermission
@RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
public Set<BluetoothDevice> getBondedDevices() {
+ android.util.SeempLog.record(61);
if (getState() != STATE_ON) {
return toDeviceSet(Arrays.asList());
}
@@ -3094,6 +3125,7 @@ public final class BluetoothAdapter {
@RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
@SuppressLint("AndroidFrameworkRequiresPermission")
public @ConnectionState int getProfileConnectionState(int profile) {
+ android.util.SeempLog.record(64);
if (getState() != STATE_ON) {
return STATE_DISCONNECTED;
}
@@ -3378,6 +3410,7 @@ public final class BluetoothAdapter {
@RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
public BluetoothServerSocket listenUsingInsecureRfcommWithServiceRecord(String name, UUID uuid)
throws IOException {
+ android.util.SeempLog.record(59);
return createNewRfcommSocketAndRecord(name, uuid, false, false);
}
@@ -3575,6 +3608,92 @@ public final class BluetoothAdapter {
return null;
}
+ private void closeBCProfile(BluetoothProfile proxy) {
+ Class<?> bshClass = null;
+ Method bshClose = null;
+ try {
+ bshClass = Class.forName("android.bluetooth.BluetoothSyncHelper");
+ } catch (ClassNotFoundException ex) {
+ Log.e(TAG, "no BSH: exists");
+ bshClass = null;
+ }
+ if (bshClass != null) {
+ Log.d(TAG, "Able to get BSH class handle");
+ try {
+ bshClose = bshClass.getDeclaredMethod("close", null);
+ } catch (NoSuchMethodException e) {
+ Log.e(TAG, "no BSH:isSupported method exists");
+ }
+ if (bshClose != null) {
+ try {
+ bshClose.invoke(proxy, null);
+ } catch(IllegalAccessException e) {
+ Log.e(TAG, "bshClose IllegalAccessException");
+ } catch (InvocationTargetException e) {
+ Log.e(TAG, "bshClose InvocationTargetException");
+ }
+ }
+ }
+ Log.d(TAG, "CloseBCProfile returns");
+ }
+
+ private boolean getBCProfile(Context context, BluetoothProfile.ServiceListener sl) {
+ boolean ret = true;
+ boolean isProfileSupported = false;
+ Class<?> bshClass = null;
+ Method bshSupported = null;
+ Constructor bshCons = null;
+ Object bshObj = null;
+ try {
+ bshClass = Class.forName("android.bluetooth.BluetoothSyncHelper");
+ } catch (ClassNotFoundException ex) {
+ Log.e(TAG, "no BSH: exists");
+ bshClass = null;
+ }
+ if (bshClass != null) {
+ Log.d(TAG, "Able to get BSH class handle");
+ try {
+ bshSupported = bshClass.getDeclaredMethod("isSupported", null);
+ } catch (NoSuchMethodException e) {
+ Log.e(TAG, "no BSH:isSupported method exists: gdm");
+ }
+ try {
+ bshCons =
+ bshClass.getDeclaredConstructor(
+ new Class[]{Context.class,
+ BluetoothProfile.ServiceListener.class});
+ } catch (NoSuchMethodException ex) {
+ Log.e(TAG, "bshCons: NoSuchMethodException: gdm" + ex);
+ }
+ }
+ if (bshClass != null && bshSupported != null && bshCons != null) {
+ try {
+ isProfileSupported = (boolean)bshSupported.invoke(null, null);
+ } catch(IllegalAccessException e) {
+ Log.e(TAG, "BSH:isSupported IllegalAccessException");
+ } catch (InvocationTargetException e) {
+ Log.e(TAG, "BSH:isSupported InvocationTargetException");
+ }
+ if (isProfileSupported) {
+ try {
+ bshObj = bshCons.newInstance(
+ context, sl);
+ } catch (InstantiationException ex) {
+ Log.e(TAG, "bshCons InstantiationException:" + ex);
+ } catch (IllegalAccessException ex) {
+ Log.e(TAG, "bshCons InstantiationException:" + ex);
+ } catch (InvocationTargetException ex) {
+ Log.e(TAG, "bshCons InvocationTargetException:" + ex);
+ }
+ }
+ }
+ if (bshObj == null) {
+ ret = false;
+ }
+ Log.d(TAG, "getBCService returns" + ret);
+ return ret;
+ }
+
/**
* Get the profile proxy object associated with the profile.
*
@@ -3622,6 +3741,9 @@ public final class BluetoothAdapter {
} else if (profile == BluetoothProfile.PBAP) {
BluetoothPbap pbap = new BluetoothPbap(context, listener, this);
return true;
+ } else if (profile == BluetoothProfile.DUN) {
+ BluetoothDun dun = new BluetoothDun(context, listener);
+ return true;
} else if (profile == BluetoothProfile.HEALTH) {
Log.e(TAG, "getProfileProxy(): BluetoothHealth is deprecated");
return false;
@@ -3647,12 +3769,22 @@ public final class BluetoothAdapter {
} else if (profile == BluetoothProfile.HAP_CLIENT) {
BluetoothHapClient HapClient = new BluetoothHapClient(context, listener);
return true;
+ } else if (profile == BluetoothProfile.BROADCAST) {
+ return getBroadcastProfile(context, listener);
+ } else if (profile == BluetoothProfile.BC_PROFILE) {
+ return getBCProfile(context, listener);
} else if (profile == BluetoothProfile.HEARING_AID) {
if (isHearingAidProfileSupported()) {
BluetoothHearingAid hearingAid = new BluetoothHearingAid(context, listener, this);
return true;
}
return false;
+ } else if (profile == BluetoothProfile.GROUP_CLIENT) {
+ BluetoothDeviceGroup groupClient = new BluetoothDeviceGroup(context, listener);
+ return true;
+ } else if (profile == BluetoothProfile.VCP) {
+ BluetoothVcp vcp = new BluetoothVcp(context, listener);
+ return true;
} else if (profile == BluetoothProfile.LE_AUDIO) {
BluetoothLeAudio leAudio = new BluetoothLeAudio(context, listener, this);
return true;
@@ -3726,6 +3858,10 @@ public final class BluetoothAdapter {
BluetoothPbap pbap = (BluetoothPbap) proxy;
pbap.close();
break;
+ case BluetoothProfile.DUN:
+ BluetoothDun dun = (BluetoothDun)proxy;
+ dun.close();
+ break;
case BluetoothProfile.GATT:
BluetoothGatt gatt = (BluetoothGatt) proxy;
gatt.close();
@@ -3762,6 +3898,12 @@ public final class BluetoothAdapter {
BluetoothHapClient HapClient = (BluetoothHapClient) proxy;
HapClient.close();
break;
+ case BluetoothProfile.BROADCAST:
+ closeBroadcastProfile(proxy);
+ break;
+ case BluetoothProfile.BC_PROFILE:
+ closeBCProfile(proxy);
+ break;
case BluetoothProfile.HEARING_AID:
BluetoothHearingAid hearingAid = (BluetoothHearingAid) proxy;
hearingAid.close();
@@ -3774,6 +3916,14 @@ public final class BluetoothAdapter {
BluetoothLeBroadcast leAudioBroadcast = (BluetoothLeBroadcast) proxy;
leAudioBroadcast.close();
break;
+ case BluetoothProfile.GROUP_CLIENT:
+ BluetoothDeviceGroup groupClient = (BluetoothDeviceGroup) proxy;
+ groupClient.close();
+ break;
+ case BluetoothProfile.VCP:
+ BluetoothVcp vcp = (BluetoothVcp) proxy;
+ vcp.close();
+ break;
case BluetoothProfile.VOLUME_CONTROL:
BluetoothVolumeControl vcs = (BluetoothVolumeControl) proxy;
vcs.close();
@@ -3795,6 +3945,63 @@ public final class BluetoothAdapter {
}
}
+ private boolean getBroadcastProfile(Context context,
+ BluetoothProfile.ServiceListener listener) {
+ boolean ret = true;
+ Class<?> broadcastClass = null;
+ Constructor bcastConstructor = null;
+ Object broadcastObj = null;
+ try {
+ broadcastClass = Class.forName("android.bluetooth.BluetoothBroadcast");
+ } catch (ClassNotFoundException ex) {
+ Log.e(TAG, "no BluetoothBroadcast: exists");
+ }
+ if (broadcastClass != null) {
+ try {
+ bcastConstructor =
+ broadcastClass.getDeclaredConstructor(new Class[]{Context.class,
+ BluetoothProfile.ServiceListener.class});
+ } catch (NoSuchMethodException ex) {
+ Log.e(TAG, "bcastConstructor: NoSuchMethodException: gdm" + ex);
+ }
+ }
+ if (bcastConstructor != null) {
+ try {
+ broadcastObj = bcastConstructor.newInstance(context, listener);
+ } catch (InstantiationException | IllegalAccessException |
+ InvocationTargetException ex) {
+ ex.printStackTrace();
+ }
+ }
+ if (broadcastObj == null) {
+ return false;
+ }
+ return true;
+ }
+ private void closeBroadcastProfile(BluetoothProfile proxy) {
+ Class<?> broadcastClass = null;
+ Method broadcastClose = null;
+ try {
+ broadcastClass = Class.forName("android.bluetooth.BluetootBroadcast");
+ } catch (ClassNotFoundException ex) {
+ Log.e(TAG, "no BluetoothBroadcast: exists");
+ }
+ if (broadcastClass != null) {
+ try {
+ broadcastClose = broadcastClass.getDeclaredMethod("close", null);
+ } catch (NoSuchMethodException e) {
+ Log.e(TAG, "no Broadcast:close method exists");
+ }
+ if (broadcastClose != null) {
+ try {
+ broadcastClose.invoke(proxy, null);
+ } catch(IllegalAccessException | InvocationTargetException ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+ }
+
private static final IBluetoothManagerCallback sManagerCallback =
new IBluetoothManagerCallback.Stub() {
public void onBluetoothServiceUp(IBluetooth bluetoothService) {
@@ -3890,8 +4097,10 @@ public final class BluetoothAdapter {
try {
final SynchronousResultReceiver recv =
SynchronousResultReceiver.get();
- mService.registerBluetoothConnectionCallback(mConnectionCallback,
+ if (mService != null) {
+ mService.registerBluetoothConnectionCallback(mConnectionCallback,
mAttributionSource, recv);
+ }
recv.awaitResultNoInterrupt(getSyncTimeout()).getValue(null);
} catch (RemoteException | TimeoutException e) {
Log.e(TAG, "onBluetoothServiceUp: Failed to register bluetooth"
@@ -3918,6 +4127,7 @@ public final class BluetoothAdapter {
} finally {
l.unlock();
}
+ Log.d(TAG, "onBluetoothServiceDown: Finished sending callbacks to registered clients");
}
public void onBrEdrDown() {
@@ -4150,6 +4360,22 @@ public final class BluetoothAdapter {
}
}
+ /**
+ * @hide
+ */
+ public void unregisterAdapter() {
+ try {
+ //mServiceLock.writeLock().lock();
+ if (mManagerService != null){
+ mManagerService.unregisterAdapter(mManagerCallback);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ //mServiceLock.writeLock().unlock();
+ }
+ }
+
private Set<BluetoothDevice> toDeviceSet(List<BluetoothDevice> devices) {
Set<BluetoothDevice> deviceSet = new HashSet<BluetoothDevice>(devices);
return Collections.unmodifiableSet(deviceSet);
diff --git a/framework/java/android/bluetooth/BluetoothClass.java b/framework/java/android/bluetooth/BluetoothClass.java
index 3561eeff90..ea747e1416 100755
--- a/framework/java/android/bluetooth/BluetoothClass.java
+++ b/framework/java/android/bluetooth/BluetoothClass.java
@@ -121,6 +121,11 @@ public final class BluetoothClass implements Parcelable {
public static final int LIMITED_DISCOVERABILITY = 0x002000;
/** Represent devices LE audio service */
public static final int LE_AUDIO = 0x004000;
+ /**
+ * @hide
+ */
+ public static final int GROUP = 0x008000;
+
public static final int POSITIONING = 0x010000;
public static final int NETWORKING = 0x020000;
public static final int RENDER = 0x040000;
diff --git a/framework/java/android/bluetooth/BluetoothCodecConfig.java b/framework/java/android/bluetooth/BluetoothCodecConfig.java
index 9fc9fb3411..d1fb561107 100644
--- a/framework/java/android/bluetooth/BluetoothCodecConfig.java
+++ b/framework/java/android/bluetooth/BluetoothCodecConfig.java
@@ -41,7 +41,11 @@ public final class BluetoothCodecConfig implements Parcelable {
@IntDef(prefix = "SOURCE_CODEC_TYPE_",
value = {SOURCE_CODEC_TYPE_SBC, SOURCE_CODEC_TYPE_AAC, SOURCE_CODEC_TYPE_APTX,
SOURCE_CODEC_TYPE_APTX_HD, SOURCE_CODEC_TYPE_LDAC, SOURCE_CODEC_TYPE_LC3,
- SOURCE_CODEC_TYPE_INVALID})
+ SOURCE_CODEC_TYPE_INVALID,
+ SOURCE_CODEC_TYPE_APTX_ADAPTIVE,
+ SOURCE_CODEC_TYPE_APTX_TWSP,
+ SOURCE_QVA_CODEC_TYPE_MAX
+ })
@Retention(RetentionPolicy.SOURCE)
public @interface SourceCodecType {}
@@ -85,7 +89,18 @@ public final class BluetoothCodecConfig implements Parcelable {
/**
* Represents the count of valid source codec types.
*/
- private static final int SOURCE_CODEC_TYPE_MAX = 6;
+ public static final int SOURCE_CODEC_TYPE_MAX = 6;
+
+ public static final int SOURCE_CODEC_TYPE_APTX_ADAPTIVE = SOURCE_CODEC_TYPE_MAX;
+
+ public static final int SOURCE_CODEC_TYPE_APTX_TWSP = SOURCE_CODEC_TYPE_MAX + 1;
+
+ public static final int SOURCE_QVA_CODEC_TYPE_MAX = SOURCE_CODEC_TYPE_MAX + 2;
+
+ /* CELT is not an A2DP Codec and only used to fetch encoder
+ ** format for BA usecase, moving out of a2dp codec value list
+ */
+ public static final int SOURCE_CODEC_TYPE_CELT = 8;
/** @hide */
@IntDef(prefix = "CODEC_PRIORITY_", value = {
@@ -163,6 +178,14 @@ public final class BluetoothCodecConfig implements Parcelable {
*/
public static final int SAMPLE_RATE_192000 = 0x1 << 5;
+ public static final int SAMPLE_RATE_16000 = 0x1 << 6;
+
+ public static final int SAMPLE_RATE_24000 = 0x1 << 7;
+
+ public static final int SAMPLE_RATE_32000 = 0x1 << 8;
+
+ public static final int SAMPLE_RATE_8000 = 0x1 << 9;
+
/** @hide */
@IntDef(prefix = "BITS_PER_SAMPLE_", value = {
BITS_PER_SAMPLE_NONE,
@@ -218,6 +241,7 @@ public final class BluetoothCodecConfig implements Parcelable {
* Codec channel mode STEREO.
*/
public static final int CHANNEL_MODE_STEREO = 0x1 << 1;
+ public static final int CHANNEL_MODE_JOINT_STEREO = 0x1 << 2;
private final @SourceCodecType int mCodecType;
private @CodecPriority int mCodecPriority;
@@ -463,6 +487,10 @@ public final class BluetoothCodecConfig implements Parcelable {
return "LDAC";
case SOURCE_CODEC_TYPE_LC3:
return "LC3";
+ case SOURCE_CODEC_TYPE_APTX_ADAPTIVE:
+ return "aptX Adaptive";
+ case SOURCE_CODEC_TYPE_APTX_TWSP:
+ return "aptX TWS+";
case SOURCE_CODEC_TYPE_INVALID:
return "INVALID CODEC";
default:
@@ -712,9 +740,13 @@ public final class BluetoothCodecConfig implements Parcelable {
case SOURCE_CODEC_TYPE_AAC:
case SOURCE_CODEC_TYPE_LDAC:
case SOURCE_CODEC_TYPE_LC3:
- if (mCodecSpecific1 != other.mCodecSpecific1) {
- return false;
- }
+ if (mCodecSpecific1 != other.mCodecSpecific1) {
+ return false;
+ }
+ case SOURCE_CODEC_TYPE_APTX_ADAPTIVE:
+ if (other.mCodecSpecific4 > 0) {
+ return false;
+ }
default:
return true;
}
diff --git a/framework/java/android/bluetooth/BluetoothDevice.java b/framework/java/android/bluetooth/BluetoothDevice.java
index 5c91c9480b..4abe7c4dbd 100644
--- a/framework/java/android/bluetooth/BluetoothDevice.java
+++ b/framework/java/android/bluetooth/BluetoothDevice.java
@@ -1,4 +1,39 @@
/*
+ * Copyright (C) 2017, The Linux Foundation. All rights reserved.
+ * Not a Contribution.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -225,6 +260,18 @@ public final class BluetoothDevice implements Parcelable, Attributable {
public static final String ACTION_BOND_STATE_CHANGED =
"android.bluetooth.device.action.BOND_STATE_CHANGED";
+ /**
+ * Broadcast Action: Broadcast details of IOT device when an IOT
+ * related issue is observed.
+ * <p>Always contains the extra fields {@link #EXTRA_NAME}.
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive.
+ * @hide
+ **/
+
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String ACTION_REMOTE_ISSUE_OCCURRED =
+ "org.codeaurora.intent.bluetooth.action.REMOTE_ISSUE_OCCURRED";
+
/**
* Broadcast Action: Indicates the battery level of a remote device has
* been retrieved for the first time, or changed since the last retrieval
@@ -293,6 +340,17 @@ public final class BluetoothDevice implements Parcelable, Attributable {
public static final int BATTERY_LEVEL_BLUETOOTH_OFF = -100;
/**
+ * Broadcast Action: Indicates the remote devices are TWS plus earbuds pair.
+ * <p>Always contains the extra fields {@link #EXTRA_TWS_PLUS_DEVICE1},
+ * {@link #EXTRA_TWS_PLUS_DEVICE2}.
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive.
+ * @hide
+ */
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String ACTION_TWS_PLUS_DEVICE_PAIR =
+ "android.bluetooth.device.action.TWS_PLUS_DEVICE_PAIR";
+
+ /**
* Used as a Parcelable {@link BluetoothDevice} extra field in every intent
* broadcast by this class. It contains the {@link BluetoothDevice} that
* the intent applies to.
@@ -306,6 +364,77 @@ public final class BluetoothDevice implements Parcelable, Attributable {
public static final String EXTRA_NAME = "android.bluetooth.device.extra.NAME";
/**
+ * Used as a Parcelable {@link BluetoothQualityReport} extra field in
+ * {@link #ACTION_REMOTE_ISSUE_OCCURRED} intent. It contains the {@link BluetoothQualityReport}.
+ * @hide
+ */
+ public static final String EXTRA_BQR = "android.bluetooth.qti.extra.EXTRA_BQR";
+
+ /**
+ * Used as a String extra field in {@link #ACTION_REMOTE_ISSUE_OCCURRED}
+ * intents. It contains the type of IOT issue that occurred.
+ * @hide
+ */
+ public static final String EXTRA_ISSUE_TYPE = "android.bluetooth.qti.extra.ERROR_TYPE";
+
+ /**
+ * Used as a String extra field in {@link #ACTION_REMOTE_ISSUE_OCCURRED} intents.
+ * It contains the details of details of the issue.
+ * @hide
+ */
+ public static final String EXTRA_ERROR_CODE = "android.bluetooth.qti.extra.ERROR_CODE";
+
+ /**
+ * Used as a String extra field in {@link #ACTION_REMOTE_ISSUE_OCCURRED} intents.
+ * It contains the SoC event mask when issue occurred.
+ * @hide
+ */
+ public static final String EXTRA_ERROR_EVENT_MASK = "android.bluetooth.qti.extra.ERROR_EVENT_MASK";
+
+ /**
+ * Used as a String extra field in {@link #ACTION_REMOTE_ISSUE_OCCURRED} intents.
+ * It contains the LMP Version of IOT device.
+ * @hide
+ */
+ public static final String EXTRA_LMP_VERSION = "android.bluetooth.qti.extra.EXTRA_LMP_VERSION";
+
+ /**
+ * Used as a String extra field in {@link #ACTION_REMOTE_ISSUE_OCCURRED} intents.
+ * It contains the LMP Sub Version of IOT device.
+ * @hide
+ */
+ public static final String EXTRA_LMP_SUBVER = "android.bluetooth.qti.extra.EXTRA_LMP_SUBVER";
+
+ /**
+ * Used as a String extra field in {@link #ACTION_REMOTE_ISSUE_OCCURRED} intents.
+ * It contains the Manufacturer ID of IOT device.
+ * @hide
+ */
+ public static final String EXTRA_MANUFACTURER = "android.bluetooth.qti.extra.EXTRA_MANUFACTURER";
+
+ /**
+ * Used as a String extra field in {@link #ACTION_REMOTE_ISSUE_OCCURRED} intents.
+ * It contains the Power level.
+ * @hide
+ */
+ public static final String EXTRA_POWER_LEVEL = "android.bluetooth.qti.extra.EXTRA_POWER_LEVEL";
+
+ /**
+ * Used as a String extra field in {@link #ACTION_REMOTE_ISSUE_OCCURRED} intents.
+ * It contains the Link Quality of the connection.
+ * @hide
+ */
+ public static final String EXTRA_LINK_QUALITY = "android.bluetooth.qti.extra.EXTRA_LINK_QUALITY";
+
+ /**
+ * Used as a String extra field in {@link #ACTION_REMOTE_ISSUE_OCCURRED} intents.
+ * It contains the coutnt of glitches occured since last broadcast.
+ * @hide
+ */
+ public static final String EXTRA_GLITCH_COUNT = "android.bluetooth.qti.extra.EXTRA_GLITCH_COUNT";
+
+
+ /**
* Used as an optional short extra field in {@link #ACTION_FOUND} intents.
* Contains the RSSI value of the remote device as reported by the
* Bluetooth hardware.
@@ -358,6 +487,22 @@ public final class BluetoothDevice implements Parcelable, Attributable {
"android.bluetooth.device.extra.LOW_LATENCY_BUFFER_SIZE";
/**
+ * Used as a String extra field in {@link #ACTION_TWS+_DEVICE_PAIR}
+ * intents. It contains the first TWS+ earbud address of pair.
+ * @hide
+ */
+ public static final String EXTRA_TWS_PLUS_DEVICE1 =
+ "android.bluetooth.device.extra.EXTRA_TWS_PLUS_DEVICE1";
+
+ /**
+ * Used as a String extra field in {@link #ACTION_TWS+_DEVICE_PAIR}
+ * intents. It contains the second TWS+ earbud address of pair.
+ * @hide
+ */
+ public static final String EXTRA_TWS_PLUS_DEVICE2 =
+ "android.bluetooth.device.extra.EXTRA_TWS_PLUS_DEVICE2";
+
+ /**
* Indicates the remote device is not bonded (paired).
* <p>There is no shared link key with the remote device, so communication
* (if it is allowed at all) will be unauthenticated and unencrypted.
@@ -1292,10 +1437,12 @@ public final class BluetoothDevice implements Parcelable, Attributable {
/*package*/
static IBluetooth getService() {
+ BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+ IBluetooth tService = adapter.getBluetoothService(sStateChangeCallback);
+
synchronized (BluetoothDevice.class) {
if (sService == null) {
- BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
- sService = adapter.getBluetoothService(sStateChangeCallback);
+ sService = tService;
}
}
return sService;
@@ -1306,9 +1453,10 @@ public final class BluetoothDevice implements Parcelable, Attributable {
public void onBluetoothServiceUp(IBluetooth bluetoothService)
throws RemoteException {
synchronized (BluetoothDevice.class) {
- if (sService == null) {
- sService = bluetoothService;
+ if (sService != null) {
+ Log.w(TAG, "sService is not NULL");
}
+ sService = bluetoothService;
}
}
@@ -1776,6 +1924,16 @@ public final class BluetoothDevice implements Parcelable, Attributable {
final boolean defaultValue = false;
if (service == null || !isBluetoothEnabled()) {
Log.w(TAG, "BT not enabled, createBondOutOfBand failed");
+ return false;
+ }
+ BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+ if (adapter != null &&
+ (((transport == TRANSPORT_LE || transport == TRANSPORT_AUTO)
+ && !adapter.isLeEnabled())
+ || ((transport == TRANSPORT_BREDR || transport == TRANSPORT_AUTO)
+ && !isBluetoothEnabled()))) {
+ Log.w(TAG, "creatBond() initiated in improper adapter state : " + adapter.getState()
+ + " transport = " + transport);
if (DBG) log(Log.getStackTraceString(new Throwable()));
} else if (NULL_MAC_ADDRESS.equals(mAddress)) {
Log.e(TAG, "Unable to create bond, invalid address " + mAddress);
@@ -1822,6 +1980,25 @@ public final class BluetoothDevice implements Parcelable, Attributable {
return defaultValue;
}
+ /** @hide */
+ @UnsupportedAppUsage
+ @RequiresLegacyBluetoothPermission
+ @RequiresBluetoothConnectPermission
+ @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+ public void setBondingInitiatedLocally(boolean localInitiated) {
+ final IBluetooth service = sService;
+ if (service == null) {
+ Log.w(TAG, "BT not enabled, setBondingInitiatedLocally failed");
+ return;
+ }
+ try {
+ service.setBondingInitiatedLocally(this, localInitiated, mAttributionSource);
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ }
+ return;
+ }
+
/**
* Cancel an in-progress bonding request started with {@link #createBond}.
*
@@ -1869,6 +2046,12 @@ public final class BluetoothDevice implements Parcelable, Attributable {
final boolean defaultValue = false;
if (service == null || !isBluetoothEnabled()) {
Log.e(TAG, "BT not enabled. Cannot remove Remote Device bond");
+ return false;
+ }
+ BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+ if (adapter != null && !adapter.isLeEnabled()) {
+ Log.w(TAG, "removeBond() initiated in improper adapter state : "
+ + adapter.getState());
if (DBG) log(Log.getStackTraceString(new Throwable()));
} else {
Log.i(TAG, "removeBond() for device " + getAddress()
@@ -2343,6 +2526,47 @@ public final class BluetoothDevice implements Parcelable, Attributable {
}
/**
+ * Returns whether if the device is TWS+ device.
+ *
+ * @return True if the devcie is TWS+ device.
+ * @hide
+ */
+ @RequiresLegacyBluetoothPermission
+ @RequiresBluetoothConnectPermission
+ @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+ public boolean isTwsPlusDevice() {
+ if (sService == null) {
+ Log.e(TAG, "BT not enabled. Cannot query remote device sdp records");
+ return false;
+ }
+ try {
+ return sService.isTwsPlusDevice(this, mAttributionSource);
+ } catch (RemoteException e) {Log.e(TAG, "", e);}
+ return false;
+ }
+
+ /**
+ * Get the TWS+ peer address of the remote device.
+ *
+ * @return the TWS+ peer address of the remote device if available, otherwise
+ * null.
+ * @hide
+ */
+ @RequiresLegacyBluetoothPermission
+ @RequiresBluetoothConnectPermission
+ @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+ public String getTwsPlusPeerAddress() {
+ if (sService == null) {
+ Log.e(TAG, "BT not enabled. Cannot get Remote Device name");
+ return null;
+ }
+ try {
+ return sService.getTwsPlusPeerAddress(this, mAttributionSource);
+ } catch (RemoteException e) {Log.e(TAG, "", e);}
+ return null;
+ }
+
+ /**
* Set the pin during pairing when the pairing method is {@link #PAIRING_VARIANT_PIN}
*
* @return true pin has been set false for error
@@ -3074,6 +3298,48 @@ public final class BluetoothDevice implements Parcelable, Attributable {
public BluetoothGatt connectGatt(Context context, boolean autoConnect,
BluetoothGattCallback callback, int transport,
boolean opportunistic, int phy, Handler handler) {
+ return connectGatt(context, autoConnect, callback, transport, opportunistic,
+ phy, handler, false);
+ }
+
+ /**
+ * Connect to GATT Server hosted by this device. Caller acts as GATT client.
+ * The callback is used to deliver results to Caller, such as connection status as well
+ * as any further GATT client operations.
+ * The method returns a BluetoothGatt instance. You can use BluetoothGatt to conduct
+ * GATT client operations.
+ *
+ * @param callback GATT callback handler that will receive asynchronous callbacks.
+ * @param autoConnect Whether to directly connect to the remote device (false) or to
+ * automatically connect as soon as the remote device becomes available (true).
+ * @param transport preferred transport for GATT connections to remote dual-mode devices {@link
+ * BluetoothDevice#TRANSPORT_AUTO} or {@link BluetoothDevice#TRANSPORT_BREDR} or {@link
+ * BluetoothDevice#TRANSPORT_LE}
+ * @param opportunistic Whether this GATT client is opportunistic. An opportunistic GATT client
+ * does not hold a GATT connection. It automatically disconnects when no other GATT connections
+ * are active for the remote device.
+ * @param phy preferred PHY for connections to remote LE device. Bitwise OR of any of {@link
+ * BluetoothDevice#PHY_LE_1M_MASK}, {@link BluetoothDevice#PHY_LE_2M_MASK}, an d{@link
+ * BluetoothDevice#PHY_LE_CODED_MASK}. This option does not take effect if {@code autoConnect}
+ * is set to true.
+ * @param handler The handler to use for the callback. If {@code null}, callbacks will happen on
+ * an un-specified background thread.
+ * @param eattSupport specifies whether client app needs EATT channel for client operations.
+ * If both local and remote devices support EATT and local app asks for EATT, GATT client
+ * operations will be performed using EATT channel.
+ * If either local or remote device doesn't support EATT but local App asks for EATT, GATT
+ * client operations will be performed using unenhanced ATT channel.
+ *
+ * @return A BluetoothGatt instance. You can use BluetoothGatt to conduct GATT client
+ * operations.
+ *
+ * @throws NullPointerException if callback is null
+ *
+ * @hide
+ */
+ public BluetoothGatt connectGatt(Context context, boolean autoConnect,
+ BluetoothGattCallback callback, int transport, boolean opportunistic,
+ int phy, Handler handler, boolean eattSupport) {
if (callback == null) {
throw new NullPointerException("callback is null");
}
@@ -3090,7 +3356,7 @@ public final class BluetoothDevice implements Parcelable, Attributable {
}
BluetoothGatt gatt = new BluetoothGatt(
iGatt, this, transport, opportunistic, phy, mAttributionSource);
- gatt.connect(autoConnect, callback, handler);
+ gatt.connect(autoConnect, callback, handler, eattSupport);
return gatt;
} catch (RemoteException e) {
Log.e(TAG, "", e);
@@ -3247,6 +3513,44 @@ public final class BluetoothDevice implements Parcelable, Attributable {
}
/**
+ * Returns Device type.
+ *
+ * @return device type.
+ * @hide
+ */
+ @RequiresPermission(allOf = {
+ android.Manifest.permission.BLUETOOTH_CONNECT,
+ android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+ })
+ public int getDeviceType() {
+ if (sService == null) {
+ Log.e(TAG, "getDeviceType query remote device info failed");
+ return -1;
+ }
+ try {
+ return sService.getDeviceType(this, mAttributionSource);
+ } catch (RemoteException e) {
+ Log.e(TAG, "getDeviceType fail ", e);
+ }
+ return -1;
+ }
+
+ /**
+ * Used as a String extra field in {@link #ACTION_BOND_STATE_CHANGED} intents.
+ * It contains the Group ID of IOT device.
+ * @hide
+ */
+ public static final String EXTRA_GROUP_ID = "android.bluetooth.qti.extra.GROUP_ID";
+
+ /**
+ * Used as a String extra field in {@link #ACTION_BOND_STATE_CHANGED} intents.
+ * It contains the IGNORE DEVICE flag of IOT device.
+ * @hide
+ */
+ public static final String EXTRA_IS_PRIVATE_ADDRESS =
+ "android.bluetooth.qti.extra.IS_PRIVATE_ADDRESS";
+
+ /**
* Enable or disable audio low latency for this {@link BluetoothDevice}.
*
* @param allowed true if low latency is allowed, false if low latency is disallowed.
diff --git a/framework/java/android/bluetooth/BluetoothGatt.java b/framework/java/android/bluetooth/BluetoothGatt.java
index 068188c92e..22cd999a59 100644
--- a/framework/java/android/bluetooth/BluetoothGatt.java
+++ b/framework/java/android/bluetooth/BluetoothGatt.java
@@ -12,6 +12,41 @@
* 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.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ *
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ *
*/
package android.bluetooth;
@@ -150,6 +185,27 @@ public final class BluetoothGatt implements BluetoothProfile {
public static final int CONNECTION_PRIORITY_LOW_POWER = 2;
/**
+ * Connection subrate request - Balanced.
+ *
+ * @hide
+ */
+ public static final int SUBRATE_REQ_BALANCED = 0;
+
+ /**
+ * Connection subrate request - High.
+ *
+ * @hide
+ */
+ public static final int SUBRATE_REQ_HIGH = 1;
+
+ /**
+ * Connection Subrate Request - Low Power.
+ *
+ * @hide
+ */
+ public static final int SUBRATE_REQ_LOW_POWER = 2;
+
+ /**
* No authentication required.
*
* @hide
@@ -769,6 +825,34 @@ public final class BluetoothGatt implements BluetoothProfile {
}
});
}
+
+ /**
+ * Callback invoked when the given connection's subrate is changed
+ * @hide
+ */
+ @Override
+ public void onSubrateChange(String address, int subrateFactor, int latency,
+ int contNum, int timeout, int status) {
+ Log.d(TAG, "onSubrateChange() - Device=" + address
+ + " subrateFactor=" + subrateFactor + " latency=" + latency
+ + " contNum=" + contNum + " timeout=" + timeout + " status=" + status);
+
+ if (!address.equals(mDevice.getAddress())) {
+ return;
+ }
+
+ runOrQueueCallback(new Runnable() {
+ @Override
+ public void run() {
+ final BluetoothGattCallback callback = mCallback;
+ if (callback != null) {
+ callback.onSubrateChange(BluetoothGatt.this, subrateFactor, latency,
+ contNum, timeout, status);
+ }
+ }
+ });
+ }
+
};
/* package */ BluetoothGatt(IBluetoothGatt iGatt, BluetoothDevice device, int transport,
@@ -972,9 +1056,45 @@ public final class BluetoothGatt implements BluetoothProfile {
@RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
/*package*/ boolean connect(Boolean autoConnect, BluetoothGattCallback callback,
Handler handler) {
+ return connect(autoConnect, callback, handler, false);
+ }
+
+ /**
+ * Initiate a connection to a Bluetooth GATT capable device.
+ *
+ * <p>The connection may not be established right away, but will be
+ * completed when the remote device is available. A
+ * {@link BluetoothGattCallback#onConnectionStateChange} callback will be
+ * invoked when the connection state changes as a result of this function.
+ *
+ * <p>The autoConnect parameter determines whether to actively connect to
+ * the remote device, or rather passively scan and finalize the connection
+ * when the remote device is in range/available. Generally, the first ever
+ * connection to a device should be direct (autoConnect set to false) and
+ * subsequent connections to known devices should be invoked with the
+ * autoConnect parameter set to true.
+ *
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
+ *
+ * @param device Remote device to connect to
+ * @param autoConnect Whether to directly connect to the remote device (false) or to
+ * automatically connect as soon as the remote device becomes available (true).
+ * @param eattSupport specifies whether client app needs EATT channel for client operations.
+ * If both local and remote devices support EATT and local app asks for EATT, GATT client
+ * operations will be performed using EATT channel.
+ * If either local or remote device doesn't support EATT but local App asks for EATT, GATT
+ * client operations will be performed using unenhanced ATT channel.
+ * @return true, if the connection attempt was initiated successfully
+ *
+ * @hide
+ */
+ @UnsupportedAppUsage
+ /*package*/ boolean connect(Boolean autoConnect, BluetoothGattCallback callback,
+ Handler handler, boolean eattSupport) {
if (DBG) {
Log.d(TAG,
- "connect() - device: " + mDevice.getAddress() + ", auto: " + autoConnect);
+ "connect() - device: " + mDevice.getAddress() + ", auto: " + autoConnect
+ + ", eattSupport: " + eattSupport);
}
synchronized (mStateLock) {
if (mConnState != CONN_STATE_IDLE) {
@@ -985,7 +1105,7 @@ public final class BluetoothGatt implements BluetoothProfile {
mAutoConnect = autoConnect;
- if (!registerApp(callback, handler)) {
+ if (!registerApp(callback, handler, eattSupport)) {
synchronized (mStateLock) {
mConnState = CONN_STATE_IDLE;
}
@@ -1875,6 +1995,70 @@ public final class BluetoothGatt implements BluetoothProfile {
}
/**
+ * Request LE subrate mode.
+ *
+ * <p>This function will send a LE subrate request to the
+ * remote device.
+ *
+ * @param subrateMode Request a specific subrate mode. Must be one of {@link
+ * BluetoothGatt#SUBRATE_REQ_BALANCED}, {@link BluetoothGatt#SUBRATE_REQ_HIGH}
+ * or {@link BluetoothGatt#SUBRATE_REQ_LOW_POWER}.
+ * @throws IllegalArgumentException If the parameters are outside of their specified range.
+ * @hide
+ */
+ @RequiresBluetoothConnectPermission
+ @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+ public boolean requestSubrateMode(int subrateMode) {
+ if (subrateMode < SUBRATE_REQ_BALANCED
+ || subrateMode > SUBRATE_REQ_LOW_POWER) {
+ throw new IllegalArgumentException(" Subrate Mode not within valid range");
+ }
+
+ Log.d(TAG, "requestsubrateMode() - params: " + subrateMode);
+ if (mService == null || mClientIf == 0) return false;
+
+ try {
+ mService.subrateModeRequest(
+ mClientIf, mDevice.getAddress(), subrateMode, mAttributionSource);
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Request a LE subrate request.
+ *
+ * <p>This function will send a LE subrate request to the remote device.
+ *
+ * @return true, if the request is send to the Bluetooth stack.
+ * @hide
+ */
+ public boolean bleSubrateRequest(int subrateMin, int subrateMax,
+ int maxLatency, int contNumber,
+ int supervisionTimeout) {
+ Log.d(TAG, "bleSubrateRequest() - subrateMin=" + subrateMin
+ + " subrateMax=" + (subrateMax)
+ + " maxLatency= " + maxLatency + "contNumber="
+ + contNumber + " supervisionTimeout=" + supervisionTimeout);
+ if (mService == null || mClientIf == 0) return false;
+
+ try {
+ mService.leSubrateRequest(mClientIf, mDevice.getAddress(),
+ subrateMin, subrateMax, maxLatency,
+ contNumber, supervisionTimeout,
+ mAttributionSource);
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
* @deprecated Not supported - please use {@link BluetoothManager#getConnectedDevices(int)}
* with {@link BluetoothProfile#GATT} as argument
* @throws UnsupportedOperationException
diff --git a/framework/java/android/bluetooth/BluetoothGattCallback.java b/framework/java/android/bluetooth/BluetoothGattCallback.java
index 3852d508c0..5d8b047394 100644
--- a/framework/java/android/bluetooth/BluetoothGattCallback.java
+++ b/framework/java/android/bluetooth/BluetoothGattCallback.java
@@ -12,6 +12,41 @@
* 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.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ *
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ *
*/
package android.bluetooth;
@@ -267,4 +302,22 @@ public abstract class BluetoothGattCallback {
*/
public void onServiceChanged(@NonNull BluetoothGatt gatt) {
}
+
+ /**
+ * Callback indicating LE connection's subrate parameters have changed.
+ *
+ * @param gatt GATT client involved
+ * @param subrate factor for the LE connection.
+ * @param peripheral latency for the LE connection in number of subrated connection events.
+ * Valid range is from 0 to 499
+ * @param continuation number. Valid range is from 0 to 499.
+ * @param timeout Supervision timeout for this connection, in 10ms unit. Valid range is from 10
+ * (0.1s) to 3200 (32s)
+ * @param status {@link BluetoothGatt#GATT_SUCCESS} if LE connection subrating has been changed
+ * successfully.
+ * @hide
+ */
+ public void onSubrateChange(BluetoothGatt gatt, int subrateFactor, int latency, int contNum,
+ int timeout, int status) {
+ }
}
diff --git a/framework/java/android/bluetooth/BluetoothGattServer.java b/framework/java/android/bluetooth/BluetoothGattServer.java
index d652bd8476..81933a7bb9 100644
--- a/framework/java/android/bluetooth/BluetoothGattServer.java
+++ b/framework/java/android/bluetooth/BluetoothGattServer.java
@@ -12,6 +12,41 @@
* 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.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ *
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ *
*/
package android.bluetooth;
@@ -389,6 +424,27 @@ public final class BluetoothGattServer implements BluetoothProfile {
}
}
+ /**
+ * Callback invoked when the given connection's subrate parameters are changed
+ * @hide
+ */
+ @Override
+ public void onSubrateChange(String address, int subrateFactor, int latency,
+ int contNum, int timeout, int status) {
+ Log.d(TAG, "onSubrateChange() - Device=" + address
+ + " subrateFactor=" + subrateFactor + " latency=" + latency
+ + " contNum=" + contNum + " timeout=" + timeout + " status=" + status);
+ BluetoothDevice device = mAdapter.getRemoteDevice(address);
+ if (device == null) return;
+
+ try {
+ mCallback.onSubrateChange(device, subrateFactor, latency,
+ contNum, timeout, status);
+ } catch (Exception ex) {
+ Log.w(TAG, "Unhandled exception: " + ex);
+ }
+ }
+
};
/**
diff --git a/framework/java/android/bluetooth/BluetoothGattServerCallback.java b/framework/java/android/bluetooth/BluetoothGattServerCallback.java
index 0ead5f57e8..f07ce3e13f 100644
--- a/framework/java/android/bluetooth/BluetoothGattServerCallback.java
+++ b/framework/java/android/bluetooth/BluetoothGattServerCallback.java
@@ -12,6 +12,41 @@
* 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.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ *
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ *
*/
package android.bluetooth;
@@ -199,4 +234,22 @@ public abstract class BluetoothGattServerCallback {
int status) {
}
+ /**
+ * Callback indicating the LE connection's subrate parameters were updated.
+ *
+ * @param device The remote device involved
+ * @param subrate factor for the LE connection.
+ * @param peripheral latency for the LE connection in number of subrated connection events.
+ * Valid range is from 0 to 499.
+ * @param continuation number. Valid range is from 0 to 499.
+ * @param timeout Supervision timeout for this connection, in 10ms unit. Valid range is from 10
+ * (0.1s) to 3200 (32s)
+ * @param status {@link BluetoothGatt#GATT_SUCCESS} if LE connection subrating has been changed
+ * successfully.
+ * @hide
+ */
+ public void onSubrateChange(BluetoothDevice device, int subrateFactor, int latency, int contNum,
+ int timeout, int status) {
+ }
+
}
diff --git a/framework/java/android/bluetooth/BluetoothHeadset.java b/framework/java/android/bluetooth/BluetoothHeadset.java
index dcf0ab78e0..b6f63037b1 100644
--- a/framework/java/android/bluetooth/BluetoothHeadset.java
+++ b/framework/java/android/bluetooth/BluetoothHeadset.java
@@ -43,12 +43,14 @@ import android.os.RemoteException;
import android.util.CloseGuard;
import android.util.Log;
+import com.android.internal.annotations.GuardedBy;
import com.android.modules.utils.SynchronousResultReceiver;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.Objects;
import java.util.concurrent.TimeoutException;
@@ -277,6 +279,13 @@ public final class BluetoothHeadset implements BluetoothProfile {
public static final String VENDOR_SPECIFIC_HEADSET_EVENT_XEVENT_BATTERY_LEVEL = "BATTERY";
/**
+ * Headset state when SCO audio is disconnecting.
+ *
+ * @hide
+ */
+ public static final int STATE_AUDIO_DISCONNECTING = 13;
+
+ /**
* Headset state when SCO audio is not connected.
* This state can be one of
* {@link #EXTRA_STATE} or {@link #EXTRA_PREVIOUS_STATE} of
@@ -301,6 +310,41 @@ public final class BluetoothHeadset implements BluetoothProfile {
public static final int STATE_AUDIO_CONNECTED = 12;
/**
+ * Intent used to broadcast the Battery status of TWS+ devices
+ *
+ * <p>This intent will have 2 extras:
+ * <ul>
+ * <li> {@link #EXTRA_HF_TWSP_BATTERY_STATE} - Current Battey state of TWS+
+ * device. 0 for Discharging, 1 for Charging
+ * <\li>
+ * <li> {@link #EXTRA_HF_TWSP_BATTERY_LEVEL} - Current Battey charging level
+ * in percentage of TWS+ device.
+ * <\li>
+ *
+ * @hide
+ */
+ public static final String ACTION_HF_TWSP_BATTERY_STATE_CHANGED =
+ "android.bluetooth.headset.action.HF_TWSP_BATTERY_STATE_CHANGED";
+
+ /**
+ * A int extra field in {@link #EXTRA_HF_TWSP_BATTERY_STATE}
+ * intents that contains the battery state of TWS+ device
+ *
+ * @hide
+ */
+ public static final String EXTRA_HF_TWSP_BATTERY_STATE =
+ "android.bluetooth.headset.extra.HF_TWSP_BATTERY_STATE";
+
+ /**
+ * A int extra field in {@link #EXTRA_HF_TWSP_BATTERY_LEVEL}
+ * intents that contains the value of battery level in percentage for TWS+ device
+ * @hide
+ */
+ public static final String EXTRA_HF_TWSP_BATTERY_LEVEL =
+ "android.bluetooth.headset.extra.HF_TWSP_BATTERY_LEVEL";
+
+
+ /**
* Intent used to broadcast the headset's indicator status
*
* <p>This intent will have 3 extras:
@@ -351,7 +395,8 @@ public final class BluetoothHeadset implements BluetoothProfile {
private Context mContext;
private ServiceListener mServiceListener;
- private volatile IBluetoothHeadset mService;
+ private final ReentrantReadWriteLock mServiceLock = new ReentrantReadWriteLock();
+ @GuardedBy("mServiceLock") private IBluetoothHeadset mService;
private final BluetoothAdapter mAdapter;
private final AttributionSource mAttributionSource;
@@ -402,7 +447,7 @@ public final class BluetoothHeadset implements BluetoothProfile {
private boolean doBind() {
synchronized (mConnection) {
if (mService == null) {
- if (VDBG) Log.d(TAG, "Binding service...");
+ if (DBG) Log.d(TAG, "Binding service...");
try {
return mAdapter.getBluetoothManager().bindBluetoothProfileService(
BluetoothProfile.HEADSET, mConnection);
@@ -416,15 +461,17 @@ public final class BluetoothHeadset implements BluetoothProfile {
private void doUnbind() {
synchronized (mConnection) {
+ if (DBG) Log.d(TAG, "Unbinding service...");
if (mService != null) {
- if (VDBG) Log.d(TAG, "Unbinding service...");
try {
mAdapter.getBluetoothManager().unbindBluetoothProfileService(
BluetoothProfile.HEADSET, mConnection);
} catch (RemoteException e) {
Log.e(TAG, "Unable to unbind HeadsetService", e);
} finally {
+ mServiceLock.writeLock().lock();
mService = null;
+ mServiceLock.writeLock().unlock();
}
}
}
@@ -557,24 +604,29 @@ public final class BluetoothHeadset implements BluetoothProfile {
@RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
public List<BluetoothDevice> getConnectedDevices() {
if (VDBG) log("getConnectedDevices()");
- final IBluetoothHeadset service = mService;
- final List<BluetoothDevice> defaultValue = new ArrayList<BluetoothDevice>();
- if (service == null) {
- Log.w(TAG, "Proxy not attached to service");
- if (DBG) log(Log.getStackTraceString(new Throwable()));
- } else if (isEnabled()) {
+ try {
+ mServiceLock.readLock().lock();
+ final IBluetoothHeadset service = mService;
+ final List<BluetoothDevice> defaultValue = new ArrayList<BluetoothDevice>();
+ if (service == null) {
+ Log.w(TAG, "Proxy not attached to service");
+ if (DBG) log(Log.getStackTraceString(new Throwable()));
+ } else if (isEnabled()) {
try {
- final SynchronousResultReceiver<List<BluetoothDevice>> recv =
- SynchronousResultReceiver.get();
- service.getConnectedDevicesWithAttribution(mAttributionSource, recv);
- return Attributable.setAttributionSource(
- recv.awaitResultNoInterrupt(getSyncTimeout()).getValue(defaultValue),
- mAttributionSource);
- } catch (RemoteException | TimeoutException e) {
- Log.e(TAG, e.toString() + "\n" + Log.getStackTraceString(new Throwable()));
+ final SynchronousResultReceiver<List<BluetoothDevice>> recv =
+ SynchronousResultReceiver.get();
+ service.getConnectedDevicesWithAttribution(mAttributionSource, recv);
+ return Attributable.setAttributionSource(
+ recv.awaitResultNoInterrupt(getSyncTimeout()).getValue(defaultValue),
+ mAttributionSource);
+ } catch (RemoteException | TimeoutException e) {
+ Log.e(TAG, e.toString() + "\n" + Log.getStackTraceString(new Throwable()));
+ }
}
+ return defaultValue;
+ } finally {
+ mServiceLock.readLock().unlock();
}
- return defaultValue;
}
/**
@@ -874,17 +926,23 @@ public final class BluetoothHeadset implements BluetoothProfile {
if (VDBG) log("isAudioConnected()");
final IBluetoothHeadset service = mService;
final boolean defaultValue = false;
- if (service == null) {
- Log.w(TAG, "Proxy not attached to service");
- if (DBG) log(Log.getStackTraceString(new Throwable()));
- } else if (isEnabled() && isValidDevice(device)) {
- try {
- final SynchronousResultReceiver<Boolean> recv = SynchronousResultReceiver.get();
- service.isAudioConnected(device, mAttributionSource, recv);
- return recv.awaitResultNoInterrupt(getSyncTimeout()).getValue(defaultValue);
- } catch (RemoteException | TimeoutException e) {
- Log.e(TAG, e.toString() + "\n" + Log.getStackTraceString(new Throwable()));
+ try {
+ mServiceLock.readLock().lock();
+ if (service == null) {
+ Log.w(TAG, "Proxy not attached to service");
+ if (DBG) log(Log.getStackTraceString(new Throwable()));
+ } else if (isEnabled() && isValidDevice(device)) {
+ try {
+ final SynchronousResultReceiver<Boolean> recv = SynchronousResultReceiver.get();
+ service.isAudioConnected(device, mAttributionSource, recv);
+ return recv.awaitResultNoInterrupt(getSyncTimeout()).getValue(defaultValue);
+ } catch (RemoteException | TimeoutException e) {
+ Log.e(TAG, e.toString() + "\n" + Log.getStackTraceString(new Throwable()));
+ }
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
}
+ } finally {
+ mServiceLock.readLock().unlock();
}
return defaultValue;
}
@@ -1498,17 +1556,26 @@ public final class BluetoothHeadset implements BluetoothProfile {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
if (DBG) Log.d(TAG, "Proxy object connected");
- mService = IBluetoothHeadset.Stub.asInterface(service);
- mHandler.sendMessage(mHandler.obtainMessage(
- MESSAGE_HEADSET_SERVICE_CONNECTED));
+ try {
+ mServiceLock.writeLock().lock();
+ mService = IBluetoothHeadset.Stub.asInterface(service);
+ mHandler.sendMessage(mHandler.obtainMessage(
+ MESSAGE_HEADSET_SERVICE_CONNECTED));
+ } finally {
+ mServiceLock.writeLock().unlock();
+ }
}
@Override
public void onServiceDisconnected(ComponentName className) {
if (DBG) Log.d(TAG, "Proxy object disconnected");
- doUnbind();
- mHandler.sendMessage(mHandler.obtainMessage(
- MESSAGE_HEADSET_SERVICE_DISCONNECTED));
+ try {
+ mServiceLock.writeLock().lock();
+ mHandler.sendMessage(mHandler.obtainMessage(
+ MESSAGE_HEADSET_SERVICE_DISCONNECTED));
+ } finally {
+ mServiceLock.writeLock().unlock();
+ }
}
};
@@ -1550,4 +1617,59 @@ public final class BluetoothHeadset implements BluetoothProfile {
}
}
};
+
+ /**
+ * Notify Headset of phone state change.
+ * This is a backdoor for phone app to call BluetoothHeadset since
+ * there is currently not a good way to get precise call state change outside
+ * of phone app.
+ *
+ * @hide
+ */
+ @RequiresBluetoothConnectPermission
+ @RequiresPermission(allOf = {
+ android.Manifest.permission.BLUETOOTH_CONNECT,
+ android.Manifest.permission.MODIFY_PHONE_STATE,
+ })
+ public void phoneStateChangedDsDa(int numActive, int numHeld, int callState, String number,
+ int type, String name) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled()) {
+ try {
+ service.phoneStateChangedDsDa(numActive, numHeld, callState, number, type, name,
+ mAttributionSource);
+ } catch (RemoteException e) {
+ Log.e(TAG, e.toString());
+ }
+ } else {
+ Log.w(TAG, "Proxy not attached to service");
+ if (DBG) Log.d(TAG, Log.getStackTraceString(new Throwable()));
+ }
+ }
+
+ /**
+ * Send Headset of CLCC response
+ *
+ * @hide
+ */
+ @RequiresBluetoothConnectPermission
+ @RequiresPermission(allOf = {
+ android.Manifest.permission.BLUETOOTH_CONNECT,
+ android.Manifest.permission.MODIFY_PHONE_STATE,
+ })
+ public void clccResponseDsDa(int index, int direction, int status, int mode, boolean mpty,
+ String number, int type) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled()) {
+ try {
+ service.clccResponseDsDa(index, direction, status, mode, mpty, number, type,
+ mAttributionSource);
+ } catch (RemoteException e) {
+ Log.e(TAG, e.toString());
+ }
+ } else {
+ Log.w(TAG, "Proxy not attached to service");
+ if (DBG) Log.d(TAG, Log.getStackTraceString(new Throwable()));
+ }
+ }
}
diff --git a/framework/java/android/bluetooth/BluetoothLeAudio.java b/framework/java/android/bluetooth/BluetoothLeAudio.java
index ea39b64a76..19d25043f8 100644
--- a/framework/java/android/bluetooth/BluetoothLeAudio.java
+++ b/framework/java/android/bluetooth/BluetoothLeAudio.java
@@ -62,8 +62,8 @@ import java.util.concurrent.TimeoutException;
*/
public final class BluetoothLeAudio implements BluetoothProfile, AutoCloseable {
private static final String TAG = "BluetoothLeAudio";
- private static final boolean DBG = false;
- private static final boolean VDBG = false;
+ private static final boolean DBG = true;
+ private static final boolean VDBG = true;
private final Map<Callback, Executor> mCallbackExecutorMap = new HashMap<>();
diff --git a/framework/java/android/bluetooth/BluetoothLeAudioCodecConfig.java b/framework/java/android/bluetooth/BluetoothLeAudioCodecConfig.java
index c91d13ffe0..314bb3d1ca 100644
--- a/framework/java/android/bluetooth/BluetoothLeAudioCodecConfig.java
+++ b/framework/java/android/bluetooth/BluetoothLeAudioCodecConfig.java
@@ -39,12 +39,18 @@ public final class BluetoothLeAudioCodecConfig implements Parcelable {
/** @hide */
@IntDef(prefix = "SOURCE_CODEC_TYPE_", value = {
SOURCE_CODEC_TYPE_LC3,
+ SOURCE_CODEC_TYPE_APTX_ADAPTIVE_LE,
SOURCE_CODEC_TYPE_INVALID
})
@Retention(RetentionPolicy.SOURCE)
public @interface SourceCodecType {};
public static final int SOURCE_CODEC_TYPE_LC3 = 0;
+ /**
+ * AptX Adaptive LEA Codec.
+ * @hide
+ */
+ public static final int SOURCE_CODEC_TYPE_APTX_ADAPTIVE_LE = 1;
public static final int SOURCE_CODEC_TYPE_INVALID = 1000 * 1000;
/** @hide */
@@ -74,7 +80,7 @@ public final class BluetoothLeAudioCodecConfig implements Parcelable {
/** @hide */
@IntDef(flag = true, prefix = "SAMPLE_RATE_",
value = {SAMPLE_RATE_NONE, SAMPLE_RATE_8000, SAMPLE_RATE_16000, SAMPLE_RATE_24000,
- SAMPLE_RATE_32000, SAMPLE_RATE_44100, SAMPLE_RATE_48000})
+ SAMPLE_RATE_32000, SAMPLE_RATE_44100, SAMPLE_RATE_48000, SAMPLE_RATE_96000})
@Retention(RetentionPolicy.SOURCE)
public @interface SampleRate {}
@@ -118,6 +124,12 @@ public final class BluetoothLeAudioCodecConfig implements Parcelable {
*/
public static final int SAMPLE_RATE_48000 = 0x01 << 7;
+ /**
+ * Codec sample rate 96000 Hz.
+ * @hide
+ */
+ public static final int SAMPLE_RATE_96000 = 0x01 << 9;
+
/** @hide */
@IntDef(flag = true, prefix = "BITS_PER_SAMPLE_",
value = {BITS_PER_SAMPLE_NONE, BITS_PER_SAMPLE_16, BITS_PER_SAMPLE_24,
@@ -178,9 +190,11 @@ public final class BluetoothLeAudioCodecConfig implements Parcelable {
* Bluetooth Assigned Numbers, Generic Audio,
* Supported_Frame_Durations table
*
+ * Vendor Specific frame duration starting from bit 16
* @hide */
@IntDef(flag = true, prefix = "FRAME_DURATION_",
- value = {FRAME_DURATION_NONE, FRAME_DURATION_7500, FRAME_DURATION_10000})
+ value = {FRAME_DURATION_NONE, FRAME_DURATION_7500,
+ FRAME_DURATION_10000, FRAME_DURATION_15000})
@Retention(RetentionPolicy.SOURCE)
public @interface FrameDuration {}
@@ -199,6 +213,13 @@ public final class BluetoothLeAudioCodecConfig implements Parcelable {
*/
public static final int FRAME_DURATION_10000 = 0x01 << 1;
+ /**
+ * Frame duration 15000 us.
+ * @hide
+ */
+ public static final int FRAME_DURATION_15000 = 0x01 << 16;
+
+
private final @SourceCodecType int mCodecType;
private final @CodecPriority int mCodecPriority;
private final @SampleRate int mSampleRate;
@@ -208,7 +229,10 @@ public final class BluetoothLeAudioCodecConfig implements Parcelable {
private final int mOctetsPerFrame;
private final int mMinOctetsPerFrame;
private final int mMaxOctetsPerFrame;
-
+ private final long mCodecSpecific1;
+ private final long mCodecSpecific2;
+ private final long mCodecSpecific3;
+ private final long mCodecSpecific4;
/**
* Creates a new BluetoothLeAudioCodecConfig.
@@ -222,12 +246,17 @@ public final class BluetoothLeAudioCodecConfig implements Parcelable {
* @param octetsPerFrame the octets per frame of this codec
* @param minOctetsPerFrame the minimum octets per frame of this codec
* @param maxOctetsPerFrame the maximum octets per frame of this codec
+ * @param codecSpecific1 the specific value 1
+ * @param codecSpecific2 the specific value 2
+ * @param codecSpecific3 the specific value 3
+ * @param codecSpecific4 the specific value 4
*/
private BluetoothLeAudioCodecConfig(@SourceCodecType int codecType,
@CodecPriority int codecPriority, @SampleRate int sampleRate,
@BitsPerSample int bitsPerSample, @ChannelCount int channelCount,
@FrameDuration int frameDuration, int octetsPerFrame,
- int minOctetsPerFrame, int maxOctetsPerFrame) {
+ int minOctetsPerFrame, int maxOctetsPerFrame, long codecSpecific1,
+ long codecSpecific2, long codecSpecific3, long codecSpecific4) {
mCodecType = codecType;
mCodecPriority = codecPriority;
mSampleRate = sampleRate;
@@ -237,6 +266,10 @@ public final class BluetoothLeAudioCodecConfig implements Parcelable {
mOctetsPerFrame = octetsPerFrame;
mMinOctetsPerFrame = minOctetsPerFrame;
mMaxOctetsPerFrame = maxOctetsPerFrame;
+ mCodecSpecific1 = codecSpecific1;
+ mCodecSpecific2 = codecSpecific2;
+ mCodecSpecific3 = codecSpecific3;
+ mCodecSpecific4 = codecSpecific4;
}
@Override
@@ -260,9 +293,14 @@ public final class BluetoothLeAudioCodecConfig implements Parcelable {
int octetsPerFrame = in.readInt();
int minOctetsPerFrame = in.readInt();
int maxOctetsPerFrame = in.readInt();
+ long codecSpecific1 = in.readLong();
+ long codecSpecific2 = in.readLong();
+ long codecSpecific3 = in.readLong();
+ long codecSpecific4 = in.readLong();
return new BluetoothLeAudioCodecConfig(codecType, codecPriority, sampleRate,
bitsPerSample, channelCount, frameDuration, octetsPerFrame,
- minOctetsPerFrame, maxOctetsPerFrame);
+ minOctetsPerFrame, maxOctetsPerFrame, codecSpecific1, codecSpecific2,
+ codecSpecific3, codecSpecific4);
}
public BluetoothLeAudioCodecConfig[] newArray(int size) {
@@ -281,6 +319,10 @@ public final class BluetoothLeAudioCodecConfig implements Parcelable {
out.writeInt(mOctetsPerFrame);
out.writeInt(mMinOctetsPerFrame);
out.writeInt(mMaxOctetsPerFrame);
+ out.writeLong(mCodecSpecific1);
+ out.writeLong(mCodecSpecific2);
+ out.writeLong(mCodecSpecific3);
+ out.writeLong(mCodecSpecific4);
}
@Override
@@ -290,7 +332,10 @@ public final class BluetoothLeAudioCodecConfig implements Parcelable {
+ ",mBitsPerSample:" + mBitsPerSample + ",mChannelCount:" + mChannelCount
+ ",mFrameDuration:" + mFrameDuration + ",mOctetsPerFrame:" + mOctetsPerFrame
+ ",mMinOctetsPerFrame:" + mMinOctetsPerFrame
- + ",mMaxOctetsPerFrame:" + mMaxOctetsPerFrame + "}";
+ + ",mMaxOctetsPerFrame:" + mMaxOctetsPerFrame
+ + ",mCodecSpecific1:" + mCodecSpecific1 + ",mCodecSpecific2:" + mCodecSpecific2
+ + ",mCodecSpecific3:" + mCodecSpecific3 + ",mCodecSpecific4:" + mCodecSpecific4
+ + "}";
}
/**
@@ -311,6 +356,8 @@ public final class BluetoothLeAudioCodecConfig implements Parcelable {
switch (mCodecType) {
case SOURCE_CODEC_TYPE_LC3:
return "LC3";
+ case SOURCE_CODEC_TYPE_APTX_ADAPTIVE_LE:
+ return "APTX_ADAPTIVE_LEA";
case SOURCE_CODEC_TYPE_INVALID:
return "INVALID CODEC";
default:
@@ -377,6 +424,46 @@ public final class BluetoothLeAudioCodecConfig implements Parcelable {
return mMaxOctetsPerFrame;
}
+ /**
+ * Returns the codec specific value1.
+ * As the value and usage differ for each codec, please refer to the concerned
+ * codec specification to obtain the codec specific information.
+ * @hide
+ */
+ public long getCodecSpecific1() {
+ return mCodecSpecific1;
+ }
+
+ /**
+ * Returns the codec specific value2.
+ * As the value and usage differ for each codec, please refer to the concerned
+ * codec specification to obtain the codec specific information.
+ * @hide
+ */
+ public long getCodecSpecific2() {
+ return mCodecSpecific2;
+ }
+
+ /**
+ * Returns the codec specific value3.
+ * As the value and usage differ for each codec, please refer to the concerned
+ * codec specification to obtain the codec specific information.
+ * @hide
+ */
+ public long getCodecSpecific3() {
+ return mCodecSpecific3;
+ }
+
+ /**
+ * Returns the codec specific value4.
+ * As the value and usage differ for each codec, please refer to the concerned
+ * codec specification to obtain the codec specific information.
+ * @hide
+ */
+ public long getCodecSpecific4() {
+ return mCodecSpecific4;
+ }
+
@Override
public boolean equals(@NonNull Object o) {
if (o instanceof BluetoothLeAudioCodecConfig) {
@@ -389,7 +476,11 @@ public final class BluetoothLeAudioCodecConfig implements Parcelable {
&& other.getFrameDuration() == mFrameDuration
&& other.getOctetsPerFrame() == mOctetsPerFrame
&& other.getMinOctetsPerFrame() == mMinOctetsPerFrame
- && other.getMaxOctetsPerFrame() == mMaxOctetsPerFrame);
+ && other.getMaxOctetsPerFrame() == mMaxOctetsPerFrame
+ && other.mCodecSpecific1 == mCodecSpecific1
+ && other.mCodecSpecific2 == mCodecSpecific2
+ && other.mCodecSpecific3 == mCodecSpecific3
+ && other.mCodecSpecific4 == mCodecSpecific4);
}
return false;
}
@@ -402,7 +493,8 @@ public final class BluetoothLeAudioCodecConfig implements Parcelable {
public int hashCode() {
return Objects.hash(mCodecType, mCodecPriority, mSampleRate,
mBitsPerSample, mChannelCount, mFrameDuration, mOctetsPerFrame,
- mMinOctetsPerFrame, mMaxOctetsPerFrame);
+ mMinOctetsPerFrame, mMaxOctetsPerFrame, mCodecSpecific1,
+ mCodecSpecific2, mCodecSpecific3, mCodecSpecific4);
}
/**
@@ -420,6 +512,10 @@ public final class BluetoothLeAudioCodecConfig implements Parcelable {
private int mOctetsPerFrame = 0;
private int mMinOctetsPerFrame = 0;
private int mMaxOctetsPerFrame = 0;
+ private long mCodecSpecific1 = 0;
+ private long mCodecSpecific2 = 0;
+ private long mCodecSpecific3 = 0;
+ private long mCodecSpecific4 = 0;
public Builder() {}
@@ -433,6 +529,10 @@ public final class BluetoothLeAudioCodecConfig implements Parcelable {
mOctetsPerFrame = config.getOctetsPerFrame();
mMinOctetsPerFrame = config.getMinOctetsPerFrame();
mMaxOctetsPerFrame = config.getMaxOctetsPerFrame();
+ mCodecSpecific1 = config.getCodecSpecific1();
+ mCodecSpecific2 = config.getCodecSpecific2();
+ mCodecSpecific3 = config.getCodecSpecific3();
+ mCodecSpecific4 = config.getCodecSpecific4();
}
/**
@@ -535,13 +635,62 @@ public final class BluetoothLeAudioCodecConfig implements Parcelable {
}
/**
+ * Set the codecspecific1 for Bluetooth LE audio codec config.
+ *
+ * @param codecspecific1 of this codec
+ * @return the same Builder instance
+ * @hide
+ */
+ public @NonNull Builder setCodecSpecific1(long codecSpecific1) {
+ mCodecSpecific1 = codecSpecific1;
+ return this;
+ }
+
+ /**
+ * Set the codecspecific2 for Bluetooth LE audio codec config.
+ *
+ * @param codecspecific2 of this codec
+ * @return the same Builder instance
+ * @hide
+ */
+ public @NonNull Builder setCodecSpecific2(long codecSpecific2) {
+ mCodecSpecific2 = codecSpecific2;
+ return this;
+ }
+
+ /**
+ * Set the codecspecific3 for Bluetooth LE audio codec config.
+ *
+ * @param codecspecific3 of this codec
+ * @return the same Builder instance
+ * @hide
+ */
+ public @NonNull Builder setCodecSpecific3(long codecSpecific3) {
+ mCodecSpecific3 = codecSpecific3;
+ return this;
+ }
+
+ /**
+ * Set the codecspecific4 for Bluetooth LE audio codec config.
+ *
+ * @param codecspecific4 of this codec
+ * @return the same Builder instance
+ * @hide
+ */
+ public @NonNull Builder setCodecSpecific4(long codecSpecific4) {
+ mCodecSpecific4 = codecSpecific4;
+ return this;
+ }
+
+ /**
* Build {@link BluetoothLeAudioCodecConfig}.
* @return new BluetoothLeAudioCodecConfig built
*/
public @NonNull BluetoothLeAudioCodecConfig build() {
return new BluetoothLeAudioCodecConfig(mCodecType, mCodecPriority, mSampleRate,
mBitsPerSample, mChannelCount, mFrameDuration, mOctetsPerFrame,
- mMinOctetsPerFrame, mMaxOctetsPerFrame);
+ mMinOctetsPerFrame, mMaxOctetsPerFrame, mCodecSpecific1,
+ mCodecSpecific2, mCodecSpecific3, mCodecSpecific4);
}
}
}
diff --git a/framework/java/android/bluetooth/BluetoothProfile.java b/framework/java/android/bluetooth/BluetoothProfile.java
index 5c80a9bdde..2ce4b79ad2 100644
--- a/framework/java/android/bluetooth/BluetoothProfile.java
+++ b/framework/java/android/bluetooth/BluetoothProfile.java
@@ -1,4 +1,4 @@
-/*
+ /*
* Copyright (C) 2010-2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -274,12 +274,59 @@ public interface BluetoothProfile {
int BATTERY = 30;
/**
+ * DUN
+ * @hide
+ */
+ public int DUN = 31;
+
+ /**
+ * Group Operation Profile (Client Role)
+ * @hide
+ */
+ public int GROUP_CLIENT = 32;
+
+ /**
+ * Broadcast
+ * @hide
+ */
+ public int BROADCAST = 33;
+
+ /**
+ * VCP
+ * @hide
+ */
+ public static final int VCP = 34;
+
+ /**
+ * BC_PROFILE
+ * @hide
+ */
+ public static final int BC_PROFILE = 35;
+
+ /**
+ * PC_PROFILE
+ * @hide
+ */
+ public static final int PC_PROFILE = 36;
+
+ /**
+ * CC_SERVER
+ * @hide
+ */
+ public static final int CC_SERVER = 37;
+ /**
+ * Coordinated Audio Unicast
+ * @hide
+ */
+ int COORDINATED_AUDIO_UNICAST = 38;
+
+ /**
* Max profile ID. This value should be updated whenever a new profile is added to match
* the largest value assigned to a profile.
*
* @hide
*/
- int MAX_PROFILE_ID = 30;
+ int MAX_PROFILE_ID = 38;
/**
* Default priority for devices that we try to auto-connect to and
@@ -501,6 +548,20 @@ public interface BluetoothProfile {
return "LE_AUDIO_BROADCAST_ASSISTANT";
case BATTERY:
return "BATTERY";
+ case BROADCAST:
+ return "BROADCAST";
+ case VCP:
+ return "VCP";
+ case GROUP_CLIENT:
+ return "GROUP_CLIENT";
+ case DUN:
+ return "DUN";
+ case BC_PROFILE:
+ return "BC_PROFILE";
+ case PC_PROFILE:
+ return "PC_PROFILE";
+ case CC_SERVER:
+ return "CC_SERVER";
default:
return "UNKNOWN_PROFILE";
}
diff --git a/framework/java/android/bluetooth/BluetoothSocket.java b/framework/java/android/bluetooth/BluetoothSocket.java
index bf98d97aed..c137f66cef 100644
--- a/framework/java/android/bluetooth/BluetoothSocket.java
+++ b/framework/java/android/bluetooth/BluetoothSocket.java
@@ -298,6 +298,7 @@ public final class BluetoothSocket implements Closeable {
as.mSocketOS = as.mSocket.getOutputStream();
as.mAddress = remoteAddr;
as.mDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(remoteAddr);
+ as.mPort = mPort;
return as;
}
@@ -845,5 +846,65 @@ public final class BluetoothSocket implements Closeable {
return ret;
}
+ /**
+ * setSocketOpt for the Buetooth Socket.
+ *
+ * @param optionName socket option name
+ * @param optionVal socket option value
+ * @param optionLen socket option length
+ * @return -1 on immediate error,
+ * 0 otherwise
+ * @hide
+ */
+ @UnsupportedAppUsage
+ @RequiresBluetoothConnectPermission
+ @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+ public int setSocketOpt(int optionName, byte [] optionVal, int optionLen) throws IOException {
+ int ret = 0;
+ if (mSocketState == SocketState.CLOSED) throw new IOException("socket closed");
+ IBluetooth bluetoothProxy = BluetoothAdapter.getDefaultAdapter().getBluetoothService(null);
+ if (bluetoothProxy == null) {
+ Log.e(TAG, "setSocketOpt fail, reason: bluetooth is off");
+ return -1;
+ }
+ try {
+ if(VDBG) Log.d(TAG, "setSocketOpt(), mType: " + mType + " mPort: " + mPort);
+ ret = bluetoothProxy.setSocketOpt(mType, mPort, optionName, optionVal, optionLen);
+ } catch (RemoteException e) {
+ Log.e(TAG, Log.getStackTraceString(new Throwable()));
+ return -1;
+ }
+ return ret;
+ }
+
+ /**
+ * getSocketOpt for the Buetooth Socket.
+ *
+ * @param optionName socket option name
+ * @param optionVal socket option value
+ * @return -1 on immediate error,
+ * length of returned socket option otherwise
+ * @hide
+ */
+ @UnsupportedAppUsage
+ @RequiresBluetoothConnectPermission
+ @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+ public int getSocketOpt(int optionName, byte [] optionVal) throws IOException {
+ int ret = 0;
+ if (mSocketState == SocketState.CLOSED) throw new IOException("socket closed");
+ IBluetooth bluetoothProxy = BluetoothAdapter.getDefaultAdapter().getBluetoothService(null);
+ if (bluetoothProxy == null) {
+ Log.e(TAG, "getSocketOpt fail, reason: bluetooth is off");
+ return -1;
+ }
+ try {
+ if(VDBG) Log.d(TAG, "getSocketOpt(), mType: " + mType + " mPort: " + mPort);
+ ret = bluetoothProxy.getSocketOpt(mType, mPort, optionName, optionVal);
+ } catch (RemoteException e) {
+ Log.e(TAG, Log.getStackTraceString(new Throwable()));
+ return -1;
+ }
+ return ret;
+ }
}
diff --git a/framework/java/android/bluetooth/BluetoothUuid.java b/framework/java/android/bluetooth/BluetoothUuid.java
index 63f293ae66..77e518b1d0 100644
--- a/framework/java/android/bluetooth/BluetoothUuid.java
+++ b/framework/java/android/bluetooth/BluetoothUuid.java
@@ -378,6 +378,41 @@ public final class BluetoothUuid {
public static final ParcelUuid BASE_UUID =
ParcelUuid.fromString("00000000-0000-1000-8000-00805F9B34FB");
+ /** @hide */
+ @NonNull
+ public static ParcelUuid ADVANCE_HEARINGAID_UUID =
+ ParcelUuid.fromString("00006AD2-0000-1000-8000-00805F9B34FB");
+
+ /** @hide */
+ @NonNull
+ public static ParcelUuid ADVANCE_MEDIA_T_UUID =
+ ParcelUuid.fromString("00006AD0-0000-1000-8000-00805F9B34FB");
+
+ /** @hide */
+ @NonNull
+ public static ParcelUuid ADVANCE_MEDIA_P_UUID =
+ ParcelUuid.fromString("00006AD1-0000-1000-8000-00805F9B34FB");
+
+ /** @hide */
+ @NonNull
+ public static ParcelUuid ADVANCE_MEDIA_G_UUID =
+ ParcelUuid.fromString("00006AD3-0000-1000-8000-00805F9B34FB");
+
+ /** @hide */
+ @NonNull
+ public static ParcelUuid ADVANCE_MEDIA_W_UUID =
+ ParcelUuid.fromString("2587db3c-ce70-4fc9-935f-777ab4188fd7");
+
+ /** @hide */
+ @NonNull
+ public static ParcelUuid ADVANCE_VOICE_P_UUID =
+ ParcelUuid.fromString("00006AD4-0000-1000-8000-00805F9B34FB");
+
+ /** @hide */
+ @NonNull
+ public static ParcelUuid ADVANCE_VOICE_T_UUID =
+ ParcelUuid.fromString("00006AD5-0000-1000-8000-00805F9B34FB");
+
/**
* Length of bytes for 16 bit UUID
*
diff --git a/framework/java/android/bluetooth/DeviceGroup.java b/framework/java/android/bluetooth/DeviceGroup.java
new file mode 100644
index 0000000000..0dac87f3d8
--- /dev/null
+++ b/framework/java/android/bluetooth/DeviceGroup.java
@@ -0,0 +1,177 @@
+/******************************************************************************
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+package android.bluetooth;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.ParcelUuid;
+
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.UUID;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+/**
+ * Provides Device Group details.
+ *
+ * {@see BluetoothDeviceGroup}
+ * @hide
+ *
+ */
+
+public final class DeviceGroup implements Parcelable {
+ /** Identifier of the Device Group */
+ private int mGroupId;
+ /** Size of the Device Group. */
+ private int mSize;
+ /** List of all group devices {@link BluetoothDevice} */
+ private CopyOnWriteArrayList <BluetoothDevice> mGroupDevices
+ = new CopyOnWriteArrayList<BluetoothDevice>();
+ /** Primary Service UUID which has included required Device Group service*/
+ private final ParcelUuid mIncludingSrvcUUID;
+ /** Suggests whether exclusive access can be taken for this device group */
+ private final boolean mExclusiveAccessSupport;
+
+ /**
+ * Constructor.
+ * @hide
+ */
+ public DeviceGroup(int groupId, int size, List<BluetoothDevice> groupDevices,
+ ParcelUuid includingSrvcUUID, boolean exclusiveAccessSupport) {
+ mGroupId = groupId;
+ mSize = size;
+ mGroupDevices.addAll(groupDevices);
+ mIncludingSrvcUUID = includingSrvcUUID;
+ mExclusiveAccessSupport = exclusiveAccessSupport;
+ }
+
+ public DeviceGroup(Parcel in) {
+ mGroupId = in.readInt();
+ mSize = in.readInt();
+ in.readList(mGroupDevices, BluetoothDevice.class.getClassLoader());
+ mIncludingSrvcUUID = in.readParcelable(ParcelUuid.class.getClassLoader());
+ mExclusiveAccessSupport = in.readBoolean();
+ }
+
+ /**
+ * Used to retrieve identifier of the Device Group.
+ *
+ * @return Identifier of the Device Group.
+ */
+ public int getDeviceGroupId() {
+ return mGroupId;
+ }
+
+ /**
+ * Used to know total number group devices which are part of this Device Group.
+ *
+ * @return size of the Device Group
+ */
+ public int getDeviceGroupSize() {
+ return mSize;
+ }
+
+ /**
+ * Indicates total number of group devices discovered in Group Discovery procedure.
+ *
+ * @return total group devices discovered in the Device Group.
+ */
+ public int getTotalDiscoveredGroupDevices() {
+ return mGroupDevices.size();
+ }
+
+
+ /**
+ * Used to fetch group devices of the Device Group.
+ *
+ *@return List of group devices {@link BluetoothDevice} in the Device Group.
+ */
+ public List<BluetoothDevice> getDeviceGroupMembers() {
+ return mGroupDevices;
+ }
+
+ /**
+ * Suggests primary GATT service which has included this DeviceGroup Service
+ * for this device group. If remote device is part of multiple Device Groups then
+ * this uuid cant be null. If remote device is part of only one device froup
+ * then this returned parameter can be null.
+ *
+ *@return UUID of the GATT primary Service which has included this device group.
+ */
+ public ParcelUuid getIncludingServiceUUID() {
+ return mIncludingSrvcUUID;
+ }
+
+ /**
+ * Suggests whether exclusive access is supported by this Device Group.
+ *
+ * @return true, if exclusive access operation is supported by this Device Group.
+ * Otherwise, false.
+ */
+ public boolean isExclusiveAccessSupported() {
+ return mExclusiveAccessSupport;
+ }
+
+ /**
+ * Indicates whether all devices of this Device Group are discovered.
+ *
+ * @return true, if all group devices are discovered. Otherwise, false.
+ */
+ public boolean isGroupDiscoveredCompleted() {
+ return (mSize == getTotalDiscoveredGroupDevices());
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(mGroupId);
+ dest.writeInt(mSize);
+ dest.writeList(mGroupDevices);
+ dest.writeParcelable(mIncludingSrvcUUID, 0);
+ dest.writeBoolean(mExclusiveAccessSupport);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final Parcelable.Creator<DeviceGroup> CREATOR =
+ new Parcelable.Creator<DeviceGroup>() {
+ public DeviceGroup createFromParcel(Parcel in) {
+ return new DeviceGroup(in);
+ }
+
+ public DeviceGroup[] newArray(int size) {
+ return new DeviceGroup[size];
+ }
+ };
+}
diff --git a/framework/java/android/bluetooth/le/AdvertisingSetParameters.java b/framework/java/android/bluetooth/le/AdvertisingSetParameters.java
index 5c8fae6519..9410eb7b1a 100644
--- a/framework/java/android/bluetooth/le/AdvertisingSetParameters.java
+++ b/framework/java/android/bluetooth/le/AdvertisingSetParameters.java
@@ -23,6 +23,7 @@ import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.os.Parcel;
import android.os.Parcelable;
+import android.app.ActivityThread;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -444,10 +445,20 @@ public final class AdvertisingSetParameters implements Parcelable {
* {@link AdvertisingSetParameters#TX_POWER_MEDIUM},
* or {@link AdvertisingSetParameters#TX_POWER_HIGH}.
* @throws IllegalArgumentException If the {@code txPowerLevel} is invalid.
+ * Allow tx power level to be set more than {@link AdvertisingSetParameters#TX_POWER_HIGH},
+ * if the setTxPowerLevel is invoked from com.android.bluetooth process
*/
public Builder setTxPowerLevel(int txPowerLevel) {
- if (txPowerLevel < TX_POWER_MIN || txPowerLevel > TX_POWER_MAX) {
- throw new IllegalArgumentException("unknown txPowerLevel " + txPowerLevel);
+ String packageName = ActivityThread.currentPackageName();
+ if (packageName.equals("com.android.bluetooth")) {
+ int maxPowerLevel = 20;
+ if (txPowerLevel < TX_POWER_MIN || txPowerLevel > maxPowerLevel) {
+ throw new IllegalArgumentException("invalid txPowerLevel " + txPowerLevel);
+ }
+ } else {
+ if (txPowerLevel < TX_POWER_MIN || txPowerLevel > TX_POWER_MAX) {
+ throw new IllegalArgumentException("unknown txPowerLevel " + txPowerLevel);
+ }
}
mTxPowerLevel = txPowerLevel;
return this;
diff --git a/framework/java/android/bluetooth/le/BluetoothLeScanner.java b/framework/java/android/bluetooth/le/BluetoothLeScanner.java
index 28d408ec65..7ebbcbaa4e 100644
--- a/framework/java/android/bluetooth/le/BluetoothLeScanner.java
+++ b/framework/java/android/bluetooth/le/BluetoothLeScanner.java
@@ -42,6 +42,7 @@ import android.util.Log;
import com.android.modules.utils.SynchronousResultReceiver;
+import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -264,6 +265,13 @@ public final class BluetoothLeScanner {
if (gatt == null) {
return postCallbackErrorOrReturn(callback, ScanCallback.SCAN_FAILED_INTERNAL_ERROR);
}
+
+ if ((settings.getCallbackType() == ScanSettings.CALLBACK_TYPE_SENSOR_ROUTING)
+ && (filters == null || filters.isEmpty())) {
+ ScanFilter filter = (new ScanFilter.Builder()).build();
+ filters = Arrays.asList(filter);
+ }
+
if (!isSettingsConfigAllowedForScan(settings)) {
return postCallbackErrorOrReturn(callback,
ScanCallback.SCAN_FAILED_FEATURE_UNSUPPORTED);
@@ -276,6 +284,10 @@ public final class BluetoothLeScanner {
return postCallbackErrorOrReturn(callback,
ScanCallback.SCAN_FAILED_FEATURE_UNSUPPORTED);
}
+ if (!isRoutingAllowedForScan(settings)) {
+ return postCallbackErrorOrReturn(callback,
+ ScanCallback.SCAN_FAILED_FEATURE_UNSUPPORTED);
+ }
if (callback != null) {
BleScanCallbackWrapper wrapper = new BleScanCallbackWrapper(gatt, filters,
settings, workSource, callback);
@@ -675,4 +687,14 @@ public final class BluetoothLeScanner {
}
return true;
}
+
+ private boolean isRoutingAllowedForScan(ScanSettings settings) {
+ final int callbackType = settings.getCallbackType();
+
+ if (callbackType == ScanSettings.CALLBACK_TYPE_SENSOR_ROUTING
+ && settings.getScanMode() == ScanSettings.SCAN_MODE_OPPORTUNISTIC) {
+ return false;
+ }
+ return true;
+ }
}
diff --git a/framework/java/android/bluetooth/le/BluetoothLeUtils.java b/framework/java/android/bluetooth/le/BluetoothLeUtils.java
index a600e7a62e..943ee534d5 100644
--- a/framework/java/android/bluetooth/le/BluetoothLeUtils.java
+++ b/framework/java/android/bluetooth/le/BluetoothLeUtils.java
@@ -91,6 +91,28 @@ public class BluetoothLeUtils {
}
/**
+ * Returns a string composed from a byte array.
+ */
+ static <T> String toString(byte[] data) {
+ if (data == null) {
+ return "null";
+ }
+ if (data.length == 0) {
+ return "{}";
+ }
+ StringBuilder buffer = new StringBuilder();
+ buffer.append('{');
+ for(int i=0; i < data.length; i++) {
+ buffer.append(data[i]);
+ if ((i+1) < data.length) {
+ buffer.append(", ");
+ }
+ }
+ buffer.append('}');
+ return buffer.toString();
+ }
+
+ /**
* Check whether two {@link SparseArray} equal.
*/
static boolean equals(SparseArray<byte[]> array, SparseArray<byte[]> otherArray) {
@@ -140,6 +162,25 @@ public class BluetoothLeUtils {
}
/**
+ * Check whether two byte arrays are equal.
+ */
+ static <T> boolean equals(byte[] data, byte[] otherData) {
+ if (data == otherData) {
+ return true;
+ }
+ if (data == null || otherData == null) {
+ return false;
+ }
+ if (data.length != otherData.length) {
+ return false;
+ }
+ if (!Objects.deepEquals(data, otherData)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
* Ensure Bluetooth is turned on.
*
* @throws IllegalStateException If {@code adapter} is null or Bluetooth state is not {@link
diff --git a/framework/java/android/bluetooth/le/PeriodicAdvertisingManager.java b/framework/java/android/bluetooth/le/PeriodicAdvertisingManager.java
index 7711a00740..730c64f91f 100644
--- a/framework/java/android/bluetooth/le/PeriodicAdvertisingManager.java
+++ b/framework/java/android/bluetooth/le/PeriodicAdvertisingManager.java
@@ -351,6 +351,9 @@ public final class PeriodicAdvertisingManager {
@Override
public void run() {
callback.onSyncTransferred(device, status);
+ // App can still unregister the sync until notified it's lost.
+ // Remove callback after app was notifed.
+ //mCallbackWrappers.remove(callback);
}
});
}
diff --git a/framework/java/android/bluetooth/le/ScanFilter.java b/framework/java/android/bluetooth/le/ScanFilter.java
index bf902e889a..b72e7ef31a 100644
--- a/framework/java/android/bluetooth/le/ScanFilter.java
+++ b/framework/java/android/bluetooth/le/ScanFilter.java
@@ -51,6 +51,12 @@ import java.util.UUID;
*/
public final class ScanFilter implements Parcelable {
+ /**
+ * Provide TDS data scan results for WiFi Alliance Org id
+ * @hide
+ */
+ public static final int WIFI_ALLIANCE_ORG_ID = 2;
+
@Nullable
private final String mDeviceName;
@@ -91,6 +97,15 @@ public final class ScanFilter implements Parcelable {
@Nullable
private final byte[] mAdvertisingDataMask;
+ private final int mOrgId;
+ private final int mTDSFlags;
+ private final int mTDSFlagsMask;
+ private final byte[] mWifiNANHash;
+
+ private final boolean mGroupBasedFiltering;
+
+ private static final int GROUP_DATA_LEN = 6;
+
/** @hide */
public static final ScanFilter EMPTY = new ScanFilter.Builder().build();
@@ -99,7 +114,9 @@ public final class ScanFilter implements Parcelable {
ParcelUuid serviceDataUuid, byte[] serviceData, byte[] serviceDataMask,
int manufacturerId, byte[] manufacturerData, byte[] manufacturerDataMask,
@AddressType int addressType, @Nullable byte[] irk, int advertisingDataType,
- @Nullable byte[] advertisingData, @Nullable byte[] advertisingDataMask) {
+ @Nullable byte[] advertisingData, @Nullable byte[] advertisingDataMask,
+ int orgId, int TDSFlags, int TDSFlagsMask, byte[] wifiNANHash,
+ boolean groupBasedFiltering) {
mDeviceName = name;
mServiceUuid = uuid;
mServiceUuidMask = uuidMask;
@@ -117,6 +134,11 @@ public final class ScanFilter implements Parcelable {
mAdvertisingDataType = advertisingDataType;
mAdvertisingData = advertisingData;
mAdvertisingDataMask = advertisingDataMask;
+ mOrgId = orgId;
+ mTDSFlags = TDSFlags;
+ mTDSFlagsMask = TDSFlagsMask;
+ mWifiNANHash = wifiNANHash;
+ mGroupBasedFiltering = groupBasedFiltering;
}
@Override
@@ -200,6 +222,19 @@ public final class ScanFilter implements Parcelable {
dest.writeByteArray(mAdvertisingDataMask);
}
}
+
+ dest.writeInt(mOrgId);
+ dest.writeInt(mOrgId < 0 ? 0 : 1);
+ if(mOrgId >= 0) {
+ dest.writeInt(mTDSFlags);
+ dest.writeInt(mTDSFlagsMask);
+ dest.writeInt(mWifiNANHash == null ? 0 : 1);
+ if (mWifiNANHash != null) {
+ dest.writeInt(mWifiNANHash.length);
+ dest.writeByteArray(mWifiNANHash);
+ }
+ }
+ dest.writeBoolean(mGroupBasedFiltering);
}
/**
@@ -309,6 +344,24 @@ public final class ScanFilter implements Parcelable {
advertisingDataMask);
}
+ int orgId = in.readInt();
+ if(in.readInt() == 1) {
+ int tdsFlags = in.readInt();
+ int tdsFlagsMask = in.readInt();
+ if (in.readInt() == 1) {
+ int wifiNANHashLength = in.readInt();
+ byte[] wifiNanHash = new byte[wifiNANHashLength];
+ in.readByteArray(wifiNanHash);
+ builder.setTransportDiscoveryData(orgId, tdsFlags, tdsFlagsMask,
+ wifiNanHash);
+ }
+ else {
+ builder.setTransportDiscoveryData(orgId, tdsFlags, tdsFlagsMask, null);
+ }
+ }
+
+ boolean groupBasedFiltering = in.readBoolean();
+ builder.setGroupBasedFiltering(groupBasedFiltering);
return builder.build();
}
};
@@ -405,6 +458,45 @@ public final class ScanFilter implements Parcelable {
}
/**
+ * @hide
+ * Returns the organization id. -1 if the organization id is not set.
+ */
+ public int getOrgId() {
+ return mOrgId;
+ }
+
+ /**
+ * @hide
+ * Returns the TDS flags. -1 if TDS flags is not set.
+ */
+ public int getTDSFlags() {
+ return mTDSFlags;
+ }
+
+ /**
+ * @hide
+ * Returns the TDS flags mask. -1 if TDS flags mask is not set.
+ */
+ public int getTDSFlagsMask() {
+ return mTDSFlagsMask;
+ }
+
+ /**
+ * @hide
+ */
+ public byte[] getWifiNANHash() {
+ return mWifiNANHash;
+ }
+
+ /**
+ * @hide
+ * Returns true, if Group AD Type based filtering is enabled. Otherwise, false.
+ */
+ public boolean getGroupFilteringValue() {
+ return mGroupBasedFiltering;
+ }
+
+ /**
* Returns the advertising data type of this filter.
* Returns {@link ScanRecord#DATA_TYPE_NONE} if the type is not set.
* The values of advertising data type are defined in the Bluetooth Generic Access Profile
@@ -497,6 +589,25 @@ public final class ScanFilter implements Parcelable {
}
}
+ //Transport Discovery data match
+ if(mOrgId >= 0) {
+ byte[] tdsData = scanRecord.getTDSData();
+ if ((tdsData != null) && (tdsData.length > 0)) {
+ if ((mOrgId != tdsData[0]) ||
+ ((mTDSFlags & mTDSFlagsMask) != (tdsData[1] & mTDSFlagsMask))) {
+ return false;
+ }
+ }
+ }
+
+ // Group AD Type filter match
+ if (mGroupBasedFiltering) {
+ byte [] groupIdData = scanRecord.getGroupIdentifierData();
+ if (groupIdData != null && groupIdData.length != GROUP_DATA_LEN) {
+ return false;
+ }
+ }
+
// All filters match.
return true;
}
@@ -593,7 +704,11 @@ public final class ScanFilter implements Parcelable {
+ ", mManufacturerDataMask=" + Arrays.toString(mManufacturerDataMask)
+ ", mAdvertisingDataType=" + mAdvertisingDataType + ", mAdvertisingData="
+ Arrays.toString(mAdvertisingData) + ", mAdvertisingDataMask="
- + Arrays.toString(mAdvertisingDataMask) + "]";
+ + Arrays.toString(mAdvertisingDataMask) +
+ ", mOrganizationId=" + mOrgId + ", mTDSFlags=" + mTDSFlags
+ + ", mTDSFlagsMask=" + mTDSFlagsMask
+ + ", mWifiNANHash=" + Arrays.toString(mWifiNANHash) +"]"
+ + ", mGroupBasedFiltering=" + mGroupBasedFiltering;
}
@Override
@@ -608,7 +723,10 @@ public final class ScanFilter implements Parcelable {
mServiceSolicitationUuid, mServiceSolicitationUuidMask,
mAdvertisingDataType,
Arrays.hashCode(mAdvertisingData),
- Arrays.hashCode(mAdvertisingDataMask));
+ Arrays.hashCode(mAdvertisingDataMask),
+ mServiceSolicitationUuid, mServiceSolicitationUuidMask,
+ mOrgId, mTDSFlags, mTDSFlagsMask, Arrays.hashCode(mWifiNANHash),
+ mGroupBasedFiltering);
}
@Override
@@ -635,7 +753,12 @@ public final class ScanFilter implements Parcelable {
other.mServiceSolicitationUuidMask)
&& mAdvertisingDataType == other.mAdvertisingDataType
&& Objects.deepEquals(mAdvertisingData, other.mAdvertisingData)
- && Objects.deepEquals(mAdvertisingDataMask, other.mAdvertisingDataMask);
+ && Objects.deepEquals(mAdvertisingDataMask, other.mAdvertisingDataMask)
+ && mOrgId == other.mOrgId
+ && mTDSFlags == other.mTDSFlags
+ && mTDSFlagsMask == other.mTDSFlagsMask
+ && Objects.deepEquals(mWifiNANHash, other.mWifiNANHash)
+ && mGroupBasedFiltering == other.mGroupBasedFiltering;
}
/**
@@ -681,6 +804,13 @@ public final class ScanFilter implements Parcelable {
private byte[] mAdvertisingData;
private byte[] mAdvertisingDataMask;
+ private int mOrgId = -1;
+ private int mTDSFlags = -1;
+ private int mTDSFlagsMask = -1;
+ private byte[] mWifiNANHash;
+
+ private boolean mGroupBasedFiltering;
+
/**
* Set filter on device name.
*/
@@ -987,6 +1117,38 @@ public final class ScanFilter implements Parcelable {
return this;
}
+
+ /**
+ * @hide
+ * Set filter on transport discovery data.
+ * @throws IllegalArgumentException If the {@code orgId} is invalid or {@code
+ * wifiNANhash} is not null while {@code orgId} is non-Wifi.
+ */
+ public Builder setTransportDiscoveryData(int orgId, int TDSFlags, int TDSFlagsMask,
+ byte[] wifiNANHash) {
+ if (orgId < 0) {
+ throw new IllegalArgumentException("invalid organization id");
+ }
+ if ((orgId != WIFI_ALLIANCE_ORG_ID) && (wifiNANHash != null)) {
+ throw new IllegalArgumentException("Wifi NAN Hash is not null for non-Wifi Org Id");
+ }
+ mOrgId = orgId;
+ mTDSFlags = TDSFlags;
+ mTDSFlagsMask = TDSFlagsMask;
+ mWifiNANHash = wifiNANHash;
+ return this;
+ }
+
+ /**
+ * @hide
+ * Enable filter on Group AD Type.
+ */
+ public @NonNull Builder setGroupBasedFiltering(
+ boolean enable) {
+ mGroupBasedFiltering = enable;
+ return this;
+ }
+
/**
* Set filter on advertising data with specific advertising data type.
* For any bit in the mask, set it the 1 if it needs to match the one in
@@ -1053,7 +1215,9 @@ public final class ScanFilter implements Parcelable {
mServiceSolicitationUuid, mServiceSolicitationUuidMask, mServiceDataUuid,
mServiceData, mServiceDataMask, mManufacturerId, mManufacturerData,
mManufacturerDataMask, mAddressType, mIrk, mAdvertisingDataType,
- mAdvertisingData, mAdvertisingDataMask);
+ mAdvertisingData, mAdvertisingDataMask,
+ mOrgId, mTDSFlags, mTDSFlagsMask, mWifiNANHash,
+ mGroupBasedFiltering);
}
}
}
diff --git a/framework/java/android/bluetooth/le/ScanRecord.java b/framework/java/android/bluetooth/le/ScanRecord.java
index 375df1d694..ca2fd457ad 100644
--- a/framework/java/android/bluetooth/le/ScanRecord.java
+++ b/framework/java/android/bluetooth/le/ScanRecord.java
@@ -313,6 +313,10 @@ public final class ScanRecord {
* details.
*/
public static final int DATA_TYPE_MANUFACTURER_SPECIFIC_DATA = 0xFF;
+ /**
+ * @hide
+ */
+ public static int DATA_TYPE_GROUP_AD_TYPE = 0x00;
// Flags of the advertising data.
private final int mAdvertiseFlags;
@@ -337,6 +341,12 @@ public final class ScanRecord {
private final HashMap<Integer, byte[]> mAdvertisingDataMap;
+ // Transport Discovery data.
+ private final byte[] mTDSData;
+
+ // Group Identifier Data
+ private final byte[] mGroupIdentifierData;
+
/**
* Returns the advertising flags indicating the discoverable mode and capability of the device.
* Returns -1 if the flag field is not set.
@@ -431,6 +441,22 @@ public final class ScanRecord {
}
/**
+ * @hide
+ * Returns Transport Discovery data
+ */
+ public byte[] getTDSData() {
+ return mTDSData;
+ }
+
+ /**
+ * @hide
+ * Returns Group Identifier data
+ */
+ public byte[] getGroupIdentifierData() {
+ return mGroupIdentifierData;
+ }
+
+ /**
* Returns raw bytes of scan record.
*/
public byte[] getBytes() {
@@ -463,7 +489,8 @@ public final class ScanRecord {
SparseArray<byte[]> manufacturerData,
Map<ParcelUuid, byte[]> serviceData,
int advertiseFlags, int txPowerLevel,
- String localName, HashMap<Integer, byte[]> advertisingDataMap, byte[] bytes) {
+ String localName, HashMap<Integer, byte[]> advertisingDataMap,
+ byte[] tdsData, byte[] groupIdentifierData, byte[] bytes) {
mServiceSolicitationUuids = serviceSolicitationUuids;
mServiceUuids = serviceUuids;
mManufacturerSpecificData = manufacturerData;
@@ -472,6 +499,8 @@ public final class ScanRecord {
mAdvertiseFlags = advertiseFlags;
mTxPowerLevel = txPowerLevel;
mAdvertisingDataMap = advertisingDataMap;
+ mTDSData = tdsData;
+ mGroupIdentifierData = groupIdentifierData;
mBytes = bytes;
}
@@ -503,6 +532,9 @@ public final class ScanRecord {
Map<ParcelUuid, byte[]> serviceData = new ArrayMap<ParcelUuid, byte[]>();
HashMap<Integer, byte[]> advertisingDataMap = new HashMap<Integer, byte[]>();
+ byte[] tdsData = null;
+ byte[] groupIdentifierData = null;
+
try {
while (currentPos < scanRecord.length) {
// length is unsigned int.
@@ -582,8 +614,15 @@ public final class ScanRecord {
dataLength - 2);
manufacturerData.put(manufacturerId, manufacturerDataBytes);
break;
+ case DATA_TYPE_TRANSPORT_DISCOVERY_DATA:
+ tdsData = extractBytes(scanRecord, currentPos, dataLength);
+ break;
+
default:
- // Just ignore, we don't handle such data type.
+ if (fieldType == DATA_TYPE_GROUP_AD_TYPE) {
+ Log.d(TAG, "Parsing Group Identifier data");
+ groupIdentifierData = extractBytes(scanRecord, currentPos, dataLength);
+ }
break;
}
currentPos += dataLength;
@@ -594,13 +633,13 @@ public final class ScanRecord {
}
return new ScanRecord(serviceUuids, serviceSolicitationUuids, manufacturerData,
serviceData, advertiseFlag, txPowerLevel, localName, advertisingDataMap,
- scanRecord);
+ tdsData, groupIdentifierData, scanRecord);
} catch (Exception e) {
Log.e(TAG, "unable to parse scan record: " + Arrays.toString(scanRecord));
// As the record is invalid, ignore all the parsed results for this packet
// and return an empty record with raw scanRecord bytes in results
return new ScanRecord(null, null, null, null, -1, Integer.MIN_VALUE, null,
- advertisingDataMap, scanRecord);
+ advertisingDataMap, null, null, scanRecord);
}
}
@@ -611,7 +650,8 @@ public final class ScanRecord {
+ ", mManufacturerSpecificData=" + BluetoothLeUtils.toString(
mManufacturerSpecificData)
+ ", mServiceData=" + BluetoothLeUtils.toString(mServiceData)
- + ", mTxPowerLevel=" + mTxPowerLevel + ", mDeviceName=" + mDeviceName + "]";
+ + ", mTxPowerLevel=" + mTxPowerLevel + ", mDeviceName=" + mDeviceName +
+ ", mTDSData=" + BluetoothLeUtils.toString(mTDSData) +"]";
}
// Parse service UUIDs.
diff --git a/framework/java/android/bluetooth/le/ScanResult.java b/framework/java/android/bluetooth/le/ScanResult.java
index f437d867ea..90a429460b 100644
--- a/framework/java/android/bluetooth/le/ScanResult.java
+++ b/framework/java/android/bluetooth/le/ScanResult.java
@@ -93,6 +93,7 @@ public final class ScanResult implements Parcelable, Attributable {
private int mAdvertisingSid;
private int mTxPower;
private int mPeriodicAdvertisingInterval;
+ private int mAddressType;
/**
* Constructs a new ScanResult.
@@ -117,6 +118,7 @@ public final class ScanResult implements Parcelable, Attributable {
mAdvertisingSid = SID_NOT_PRESENT;
mTxPower = 127;
mPeriodicAdvertisingInterval = 0;
+ mAddressType = -1;
}
/**
@@ -146,6 +148,42 @@ public final class ScanResult implements Parcelable, Attributable {
mPeriodicAdvertisingInterval = periodicAdvertisingInterval;
mScanRecord = scanRecord;
mTimestampNanos = timestampNanos;
+ mAddressType = -1;
+ }
+
+ /**
+ * Constructs a new ScanResult.
+ *
+ * @param device Remote Bluetooth device found.
+ * @param addressType addressType for the Scan result
+ * @param eventType Event type.
+ * @param primaryPhy Primary advertising phy.
+ * @param secondaryPhy Secondary advertising phy.
+ * @param advertisingSid Advertising set ID.
+ * @param txPower Transmit power.
+ * @param rssi Received signal strength.
+ * @param periodicAdvertisingInterval Periodic advertising interval.
+ * @param scanRecord Scan record including both advertising data and scan response data.
+ * @param timestampNanos Timestamp at which the scan result was observed.
+ * @param addressType addressType for the Scan result
+ *
+ *@hide
+ */
+ public ScanResult(BluetoothDevice device, int addressType, int eventType, int primaryPhy,
+ int secondaryPhy,
+ int advertisingSid, int txPower, int rssi, int periodicAdvertisingInterval,
+ ScanRecord scanRecord, long timestampNanos) {
+ mDevice = device;
+ mEventType = eventType;
+ mPrimaryPhy = primaryPhy;
+ mSecondaryPhy = secondaryPhy;
+ mAdvertisingSid = advertisingSid;
+ mTxPower = txPower;
+ mRssi = rssi;
+ mPeriodicAdvertisingInterval = periodicAdvertisingInterval;
+ mScanRecord = scanRecord;
+ mTimestampNanos = timestampNanos;
+ mAddressType = addressType;
}
private ScanResult(Parcel in) {
@@ -174,6 +212,7 @@ public final class ScanResult implements Parcelable, Attributable {
dest.writeInt(mAdvertisingSid);
dest.writeInt(mTxPower);
dest.writeInt(mPeriodicAdvertisingInterval);
+ dest.writeInt(mAddressType);
}
private void readFromParcel(Parcel in) {
@@ -191,6 +230,7 @@ public final class ScanResult implements Parcelable, Attributable {
mAdvertisingSid = in.readInt();
mTxPower = in.readInt();
mPeriodicAdvertisingInterval = in.readInt();
+ mAddressType = in.readInt();
}
@Override
@@ -308,6 +348,14 @@ public final class ScanResult implements Parcelable, Attributable {
return mPeriodicAdvertisingInterval;
}
+ /**
+ *
+ *@hide
+ */
+ public int getAddressType() {
+ return mAddressType;
+ }
+
@Override
public int hashCode() {
return Objects.hash(mDevice, mRssi, mScanRecord, mTimestampNanos,
@@ -333,7 +381,8 @@ public final class ScanResult implements Parcelable, Attributable {
&& mSecondaryPhy == other.mSecondaryPhy
&& mAdvertisingSid == other.mAdvertisingSid
&& mTxPower == other.mTxPower
- && mPeriodicAdvertisingInterval == other.mPeriodicAdvertisingInterval;
+ && mPeriodicAdvertisingInterval == other.mPeriodicAdvertisingInterval
+ && mAddressType == other.mAddressType;
}
@Override
diff --git a/framework/java/android/bluetooth/le/ScanSettings.java b/framework/java/android/bluetooth/le/ScanSettings.java
index 1f9d4caec5..8f99170662 100644
--- a/framework/java/android/bluetooth/le/ScanSettings.java
+++ b/framework/java/android/bluetooth/le/ScanSettings.java
@@ -96,6 +96,12 @@ public final class ScanSettings implements Parcelable {
*/
public static final int CALLBACK_TYPE_MATCH_LOST = 4;
+ /**
+ * Provide results to sensor router instead of the apps processor
+ * @hide
+ */
+ public static final int CALLBACK_TYPE_SENSOR_ROUTING = 8;
+
/**
* Determines how many advertisements to match per filter, as this is scarce hw resource
@@ -338,7 +344,8 @@ public final class ScanSettings implements Parcelable {
private boolean isValidCallbackType(int callbackType) {
if (callbackType == CALLBACK_TYPE_ALL_MATCHES
|| callbackType == CALLBACK_TYPE_FIRST_MATCH
- || callbackType == CALLBACK_TYPE_MATCH_LOST) {
+ || callbackType == CALLBACK_TYPE_MATCH_LOST
+ || callbackType == CALLBACK_TYPE_SENSOR_ROUTING) {
return true;
}
return callbackType == (CALLBACK_TYPE_FIRST_MATCH | CALLBACK_TYPE_MATCH_LOST);
diff --git a/hello_world b/hello_world
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/hello_world
diff --git a/service/Android.bp b/service/Android.bp
index ca76812d25..5e38a6e211 100644
--- a/service/Android.bp
+++ b/service/Android.bp
@@ -135,8 +135,28 @@ gensrcs {
output_extension: "srcjar",
}
-platform_compat_config
-{
- name: "bluetooth-compat-config",
- src: ":service-bluetooth-pre-jarjar",
-}
+gensrcs {
+ name: "bluetooth-proto-enums-java-gen",
+ depfile: true,
+
+ tools: [
+ "aprotoc",
+ "protoc-gen-javastream",
+ "soong_zip",
+ ],
+
+ cmd: "mkdir -p $(genDir)/$(in) " +
+ "&& $(location aprotoc) " +
+ " --plugin=$(location protoc-gen-javastream) " +
+ " --dependency_out=$(depfile) " +
+ " --javastream_out=$(genDir)/$(in) " +
+ " -Iexternal/protobuf/src " +
+ " -I . " +
+ " $(in) " +
+ "&& $(location soong_zip) -jar -o $(out) -C $(genDir)/$(in) -D $(genDir)/$(in)",
+
+ srcs: [
+ ":srcs_bluetooth_protos",
+ ],
+ output_extension: "srcjar",
+} \ No newline at end of file
diff --git a/service/java/com/android/server/bluetooth/BluetoothManagerService.java b/service/java/com/android/server/bluetooth/BluetoothManagerService.java
index 042a4353c5..5f74ecc6e5 100644
--- a/service/java/com/android/server/bluetooth/BluetoothManagerService.java
+++ b/service/java/com/android/server/bluetooth/BluetoothManagerService.java
@@ -147,6 +147,7 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
private static final int MESSAGE_DISABLE = 2;
private static final int MESSAGE_HANDLE_ENABLE_DELAYED = 3;
private static final int MESSAGE_HANDLE_DISABLE_DELAYED = 4;
+ private static final int MESSAGE_INFORM_ADAPTER_SERVICE_UP = 22;
private static final int MESSAGE_REGISTER_STATE_CHANGE_CALLBACK = 30;
private static final int MESSAGE_UNREGISTER_STATE_CHANGE_CALLBACK = 31;
private static final int MESSAGE_BLUETOOTH_SERVICE_CONNECTED = 40;
@@ -216,7 +217,9 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
private IBluetoothGatt mBluetoothGatt;
private final ReentrantReadWriteLock mBluetoothLock = new ReentrantReadWriteLock();
private boolean mBinding;
+ private int mBindingUserID;
private boolean mUnbinding;
+ private boolean mTryBindOnBindTimeout = false;
private BluetoothModeChangeHelper mBluetoothModeChangeHelper;
@@ -410,21 +413,24 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
mContext.getPackageName(), false);
synchronousOnBrEdrDown(mContext.getAttributionSource());
mEnable = false;
- mEnableExternal = false;
}
} catch (RemoteException | TimeoutException e) {
Log.e(TAG, "Unable to call onBrEdrDown", e);
} finally {
mBluetoothLock.readLock().unlock();
}
- } else if (st == BluetoothAdapter.STATE_ON) {
+ } else {
+ Log.d(TAG, "Airplane ON: sendDisableMsg");
sendDisableMsg(BluetoothProtoEnums.ENABLE_DISABLE_REASON_AIRPLANE_MODE,
mContext.getPackageName());
}
} else if (mEnableExternal) {
- sendEnableMsg(mQuietEnableExternal,
- BluetoothProtoEnums.ENABLE_DISABLE_REASON_AIRPLANE_MODE,
- mContext.getPackageName());
+ if (isBluetoothPersistedStateOn()) {
+ Log.d(TAG, "Airplane OFF: sendEnableMsg");
+ sendEnableMsg(mQuietEnableExternal,
+ BluetoothProtoEnums.ENABLE_DISABLE_REASON_AIRPLANE_MODE,
+ mContext.getPackageName());
+ }
}
}
}
@@ -520,6 +526,7 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
mBluetoothBinder = null;
mBluetoothGatt = null;
mBinding = false;
+ mTryBindOnBindTimeout = false;
mUnbinding = false;
mEnable = false;
mState = BluetoothAdapter.STATE_OFF;
@@ -929,6 +936,33 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
break;
}
}
+
+ int appCount = mBleApps.size();
+ if (DBG) {
+ Log.d(TAG, appCount + "Binder is dead,registered Ble Apps");
+ }
+
+ if (appCount == 0 && mEnable) {
+ disableBleScanMode();
+ }
+
+ if (appCount == 0) {
+ int st = BluetoothAdapter.STATE_OFF;
+ try {
+ mBluetoothLock.readLock().lock();
+ if (mBluetooth != null) {
+ st = getState();
+ }
+ if (!mEnableExternal || (st == BluetoothAdapter.STATE_BLE_ON)) {
+ if (DBG) {
+ Log.d(TAG, "Move to BT state OFF");
+ }
+ sendBrEdrDownCallback(mContext.getAttributionSource());
+ }
+ } finally {
+ mBluetoothLock.readLock().unlock();
+ }
+ }
}
public String getPackageName() {
@@ -1017,22 +1051,25 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
// Disable ble scan only mode.
private void disableBleScanMode() {
try {
- mBluetoothLock.writeLock().lock();
- if (mBluetooth != null && synchronousGetState() != BluetoothAdapter.STATE_ON) {
+ mBluetoothLock.readLock().lock();
+ if (mBluetooth != null && (synchronousGetState() != BluetoothAdapter.STATE_ON) && (!isBluetoothPersistedStateOnBluetooth())) {
if (DBG) {
Log.d(TAG, "Resetting the mEnable flag for clean disable");
}
- mEnable = false;
+ if (!mEnableExternal) {
+ mEnable = false;
+ }
}
} catch (RemoteException | TimeoutException e) {
Log.e(TAG, "getState()", e);
} finally {
- mBluetoothLock.writeLock().unlock();
+ mBluetoothLock.readLock().unlock();
}
}
private int updateBleAppCount(IBinder token, boolean enable, String packageName) {
ClientDeathRecipient r = mBleApps.get(token);
+ int st = BluetoothAdapter.STATE_OFF;
if (r == null && enable) {
ClientDeathRecipient deathRec = new ClientDeathRecipient(packageName);
try {
@@ -1052,6 +1089,7 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
Log.d(TAG, "Unregistered for death of " + packageName);
}
}
+
int appCount = mBleApps.size();
if (DBG) {
Log.d(TAG, appCount + " registered Ble Apps");
@@ -1136,12 +1174,15 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
+ " mBinding = " + mBinding + " mState = "
+ BluetoothAdapter.nameForState(mState));
}
+ /* update app count even in bt off state, if quick enableBle and
+ * disableBle during BT turning off may leave app count non zero
+ */
+ updateBleAppCount(token, false, packageName);
if (mState == BluetoothAdapter.STATE_OFF) {
Log.d(TAG, "disableBLE(): Already disabled");
return false;
}
- updateBleAppCount(token, false, packageName);
if (mState == BluetoothAdapter.STATE_BLE_ON && !isBleAppPresent()) {
if (mEnable) {
@@ -1184,16 +1225,26 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
Log.e(TAG, "onBluetoothServiceUp: mBluetooth is null!");
return;
}
- if (!mEnableExternal && !isBleAppPresent()) {
+ int st = getState();
+ if (st != BluetoothAdapter.STATE_BLE_ON) {
+ if (DBG) Log.v(TAG, "onBluetoothServiceUp: state isn't BLE_ON: " +
+ BluetoothAdapter.nameForState(st));
+ return;
+ }
+ if (!mEnableExternal && !isBleAppPresent() &&
+ !isBluetoothPersistedStateOnBluetooth()) {
Log.i(TAG, "Bluetooth was disabled while enabling BLE, disable BLE now");
mEnable = false;
synchronousOnBrEdrDown(mContext.getAttributionSource());
return;
}
- if (isBluetoothPersistedStateOnBluetooth() || !isBleAppPresent()) {
+ if (isBluetoothPersistedStateOnBluetooth() ||
+ mEnableExternal) {
// This triggers transition to STATE_ON
+ mBluetooth.updateQuietModeStatus(mQuietEnable,
+ mContext.getAttributionSource());
synchronousOnLeServiceUp(mContext.getAttributionSource());
- persistBluetoothSetting(BLUETOOTH_ON_BLUETOOTH);
+ persistBluetoothSetting(BLUETOOTH_ON_BLUETOOTH);
}
} catch (RemoteException | TimeoutException e) {
Log.e(TAG, "Unable to call onServiceUp", e);
@@ -1224,7 +1275,9 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
// Need to stay at BLE ON. Disconnect all Gatt connections
try {
final SynchronousResultReceiver recv = SynchronousResultReceiver.get();
- mBluetoothGatt.unregAll(attributionSource, recv);
+ if (mBluetoothGatt != null) {
+ mBluetoothGatt.unregAll(attributionSource, recv);
+ }
recv.awaitResultNoInterrupt(getSyncTimeout()).getValue(null);
} catch (RemoteException | TimeoutException e) {
Log.e(TAG, "Unable to disconnect all apps.", e);
@@ -1299,6 +1352,7 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
synchronized (mReceiver) {
mQuietEnableExternal = false;
mEnableExternal = true;
+
// waive WRITE_SECURE_SETTINGS permission check
sendEnableMsg(false,
BluetoothProtoEnums.ENABLE_DISABLE_REASON_APPLICATION_REQUEST, packageName);
@@ -1335,18 +1389,44 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
}
if (DBG) {
- Log.d(TAG, "disable(): mBluetooth = " + mBluetooth + " mBinding = " + mBinding);
+ Log.d(TAG, "disable(" + packageName + "): mBluetooth = "
+ + mBluetooth + " mBinding = " + mBinding);
}
synchronized (mReceiver) {
if (!isBluetoothPersistedStateOnAirplane()) {
if (persist) {
persistBluetoothSetting(BLUETOOTH_OFF);
+ mEnableExternal = false;
+ }
+ }
+ if (persist) {
+ sendDisableMsg(BluetoothProtoEnums.ENABLE_DISABLE_REASON_APPLICATION_REQUEST,
+ packageName);
+ } else {
+ /* It means disable is called by shutdown thread */
+ synchronized (this) {
+ clearBleApps();
+ }
+
+ try {
+ mBluetoothLock.readLock().lock();
+ mEnableExternal = false;
+ if (mBluetooth != null) {
+ if(getState() == BluetoothAdapter.STATE_BLE_ON) {
+ mEnable = false;
+ synchronousOnBrEdrDown(attributionSource);
+ } else {
+ sendDisableMsg(BluetoothProtoEnums.ENABLE_DISABLE_REASON_SYSTEM_BOOT,
+ packageName);
+ }
+ }
+ } catch (RemoteException | TimeoutException e) {
+ Log.e(TAG, "Unable to initiate disable", e);
+ } finally {
+ mBluetoothLock.readLock().unlock();
}
- mEnableExternal = false;
}
- sendDisableMsg(BluetoothProtoEnums.ENABLE_DISABLE_REASON_APPLICATION_REQUEST,
- packageName);
}
return true;
}
@@ -1420,6 +1500,7 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
mContext.unbindService(mConnection);
mUnbinding = false;
mBinding = false;
+ mTryBindOnBindTimeout = false;
} else {
mUnbinding = false;
}
@@ -1434,14 +1515,26 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
return mBluetoothGatt;
}
+ public boolean isBluetoothAvailableForBinding() {
+ try {
+ mBluetoothLock.readLock().lock();
+ if (mBluetooth != null && ((getState() == BluetoothAdapter.STATE_ON) ||
+ (getState() == BluetoothAdapter.STATE_TURNING_ON))) {
+ return true;
+ } else {
+ return false;
+ }
+ } finally {
+ mBluetoothLock.readLock().unlock();
+ }
+ }
+
@Override
public boolean bindBluetoothProfileService(int bluetoothProfile,
IBluetoothProfileServiceConnection proxy) {
- if (mState != BluetoothAdapter.STATE_ON) {
- if (DBG) {
- Log.d(TAG, "Trying to bind to profile: " + bluetoothProfile
- + ", while Bluetooth was disabled");
- }
+ if (isBluetoothAvailableForBinding() == false) {
+ Log.w(TAG, "bindBluetoothProfileService:Trying to bind to profile: "
+ + bluetoothProfile + ", while Bluetooth is disabled");
return false;
}
synchronized (mProfileServices) {
@@ -1468,6 +1561,8 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
mProfileServices.put(new Integer(bluetoothProfile), psc);
}
+ else
+ Log.w(TAG, "psc is not null in bindBluetoothProfileService");
}
// Introducing a delay to give the client app time to prepare
@@ -1485,16 +1580,20 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
Integer profile = new Integer(bluetoothProfile);
ProfileServiceConnections psc = mProfileServices.get(profile);
if (psc == null) {
+ Log.e(TAG, "unbindBluetoothProfileService: psc is null, returning");
return;
}
+ Log.w(TAG, "unbindBluetoothProfileService: calling psc.removeProxy");
psc.removeProxy(proxy);
if (psc.isEmpty()) {
- // All prxoies are disconnected, unbind with the service.
+ // All proxies are disconnected, unbind with the service.
try {
mContext.unbindService(psc);
} catch (IllegalArgumentException e) {
Log.e(TAG, "Unable to unbind service with intent: " + psc.mIntent, e);
}
+ Log.w(TAG, "psc.isEmpty is true, removing psc entry for profile "
+ + profile);
mProfileServices.remove(profile);
}
}
@@ -1631,6 +1730,13 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
Log.e(TAG, "Unable to connect to proxy", e);
}
} else {
+ if (isBluetoothAvailableForBinding() == false) {
+ Log.w(TAG, "addProxy: Trying to bind to profile: " + mClassName +
+ ", while Bluetooth is disabled");
+ mProxies.unregister(proxy);
+ return;
+ }
+
if (!mHandler.hasMessages(MESSAGE_BIND_PROFILE_SERVICE, this)) {
Message msg = mHandler.obtainMessage(MESSAGE_BIND_PROFILE_SERVICE);
msg.obj = this;
@@ -1649,6 +1755,9 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
Log.e(TAG, "Unable to disconnect proxy", e);
}
}
+
+ Log.w(TAG, "removing the proxy, count is "
+ + mProxies.getRegisteredCallbackCount());
} else {
Log.w(TAG, "Trying to remove a null proxy");
}
@@ -1660,7 +1769,7 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
}
private boolean isEmpty() {
- return mProxies.getRegisteredCallbackCount() == 0;
+ return (mProxies != null && mProxies.getRegisteredCallbackCount() == 0);
}
@Override
@@ -1698,13 +1807,11 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
@Override
public void onServiceDisconnected(ComponentName className) {
- if (mService == null) {
- return;
- }
+ if (mService == null) return;
try {
mService.unlinkToDeath(this, 0);
} catch (NoSuchElementException e) {
- Log.e(TAG, "error unlinking to death", e);
+ Log.e(TAG, "Unable to unlinkToDeath", e);
}
mService = null;
mClassName = null;
@@ -1736,6 +1843,12 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
Log.w(TAG, "Profile service for profile: " + mClassName + " died.");
}
onServiceDisconnected(mClassName);
+
+ if (isBluetoothAvailableForBinding() == false) {
+ Log.w(TAG, "binderDied: Trying to bind to profile: " + mClassName +
+ ", while Bluetooth is disabled");
+ return;
+ }
// Trigger rebind
Message msg = mHandler.obtainMessage(MESSAGE_BIND_PROFILE_SERVICE);
msg.obj = this;
@@ -1768,6 +1881,7 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
private void sendBluetoothServiceUpCallback() {
synchronized (mCallbacks) {
try {
+ mBluetoothLock.writeLock().lock();
int n = mCallbacks.beginBroadcast();
Log.d(TAG, "Broadcasting onBluetoothServiceUp() to " + n + " receivers.");
for (int i = 0; i < n; i++) {
@@ -1779,6 +1893,7 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
}
} finally {
mCallbacks.finishBroadcast();
+ mBluetoothLock.writeLock().unlock();
}
}
}
@@ -1865,6 +1980,67 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
return mName;
}
+ public boolean factoryReset() {
+ final int callingUid = Binder.getCallingUid();
+ final boolean callerSystem = UserHandle.getAppId(callingUid) == Process.SYSTEM_UID;
+
+ if (!callerSystem) {
+ if (!checkIfCallerIsForegroundUser()) {
+ Log.w(TAG, "factoryReset(): not allowed for non-active and non system user");
+ return false;
+ }
+
+ mContext.enforceCallingOrSelfPermission(
+ BLUETOOTH_PRIVILEGED, "Need BLUETOOTH PRIVILEGED permission");
+ }
+ persistBluetoothSetting(BLUETOOTH_ON_BLUETOOTH);
+
+ /* Wait for stable state if bluetooth is temporary state. */
+ int state = getState();
+ if (state == BluetoothAdapter.STATE_BLE_TURNING_ON
+ || state == BluetoothAdapter.STATE_TURNING_ON
+ || state == BluetoothAdapter.STATE_TURNING_OFF) {
+ if (!waitForState(Set.of(BluetoothAdapter.STATE_BLE_ON, BluetoothAdapter.STATE_ON))) {
+ return false;
+ }
+ }
+
+ // Clear registered LE apps to force shut-off
+ clearBleApps();
+ try {
+ mBluetoothLock.writeLock().lock();
+ if (mBluetooth == null) {
+ mEnable = true;
+ handleEnable(mQuietEnable);
+ } else if (state == BluetoothAdapter.STATE_OFF) {
+ mEnable = true;
+ mBluetooth.factoryReset(mContext.getAttributionSource(),
+ SynchronousResultReceiver.get());
+ handleEnable(mQuietEnable);
+ } else if (state == BluetoothAdapter.STATE_BLE_ON) {
+ addActiveLog(
+ BluetoothProtoEnums.ENABLE_DISABLE_REASON_FACTORY_RESET,
+ mContext.getPackageName(), false);
+ synchronousOnBrEdrDown(mContext.getAttributionSource());
+ mBluetooth.factoryReset(mContext.getAttributionSource(),
+ SynchronousResultReceiver.get());
+ } else if (state == BluetoothAdapter.STATE_ON) {
+ addActiveLog(
+ BluetoothProtoEnums.ENABLE_DISABLE_REASON_FACTORY_RESET,
+ mContext.getPackageName(), false);
+ handleDisable();
+ mBluetooth.factoryReset(mContext.getAttributionSource(),
+ SynchronousResultReceiver.get());
+ }
+ } catch (RemoteException | TimeoutException e) {
+ Log.e(TAG, "factoryReset(): Unable to do factoryReset.", e);
+ return false;
+ } finally {
+ mBluetoothLock.writeLock().unlock();
+ }
+ return true;
+ }
+
private class BluetoothServiceConnection implements ServiceConnection {
public void onServiceConnected(ComponentName componentName, IBinder service) {
String name = componentName.getClassName();
@@ -1874,6 +2050,7 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
Message msg = mHandler.obtainMessage(MESSAGE_BLUETOOTH_SERVICE_CONNECTED);
if (name.equals("com.android.bluetooth.btservice.AdapterService")) {
msg.arg1 = SERVICE_IBLUETOOTH;
+ mHandler.removeMessages(MESSAGE_TIMEOUT_BIND);
} else if (name.equals("com.android.bluetooth.gatt.GattService")) {
msg.arg1 = SERVICE_IBLUETOOTHGATT;
} else {
@@ -1937,6 +2114,8 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
mHandler.removeMessages(MESSAGE_TIMEOUT_BIND);
} else {
mBinding = true;
+ mBindingUserID = ActivityManager.getCurrentUser();
+ Log.d(TAG, "Binding BT service. Current user: " + mBindingUserID);
}
} else if (mBluetooth != null) {
try {
@@ -1958,7 +2137,9 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
case MESSAGE_ENABLE:
int quietEnable = msg.arg1;
- int isBle = msg.arg2;
+ int isBle = msg.arg2;
+
+ Log.d(TAG, "MESSAGE_ENABLE: isBle: " + isBle + " msg.obj : " + msg.obj);
if (mShutdownInProgress) {
Log.d(TAG, "Skip Bluetooth Enable in device shutdown process");
break;
@@ -1966,9 +2147,38 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
if (mHandler.hasMessages(MESSAGE_HANDLE_DISABLE_DELAYED)
|| mHandler.hasMessages(MESSAGE_HANDLE_ENABLE_DELAYED)) {
- // We are handling enable or disable right now, wait for it.
- mHandler.sendMessageDelayed(mHandler.obtainMessage(MESSAGE_ENABLE,
- quietEnable, isBle), ENABLE_DISABLE_DELAY_MS);
+ if (msg.obj == null) {
+ int delay = ENABLE_DISABLE_DELAY_MS;
+
+ if (mHandler.hasMessages(MESSAGE_DISABLE)) {
+ delay = ENABLE_DISABLE_DELAY_MS * 2;
+ }
+ // Keep only one MESSAGE_ENABLE and ensure it is the last one
+ // to be taken out of the queue
+ mHandler.removeMessages(MESSAGE_ENABLE);
+ // We are handling enable or disable right now, wait for it.
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(
+ MESSAGE_ENABLE, quietEnable, isBle, 1), delay);
+ Log.d(TAG, "Queue new MESSAGE_ENABLE");
+ } else {
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(
+ MESSAGE_ENABLE, quietEnable, isBle, 1), ENABLE_DISABLE_DELAY_MS);
+ Log.d(TAG, "Re-Queue previous MESSAGE_ENABLE");
+ if (mHandler.hasMessages(MESSAGE_DISABLE)) {
+ // Ensure the original order of just entering the queue
+ // if MESSAGE_DISABLE present
+ mHandler.removeMessages(MESSAGE_DISABLE);
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(
+ MESSAGE_DISABLE, 0, 1), ENABLE_DISABLE_DELAY_MS * 2);
+ Log.d(TAG, "Re-Queue previous MESSAGE_DISABLE");
+ }
+ }
+ break;
+ } else if(msg.obj == null && mHandler.hasMessages(MESSAGE_DISABLE)) {
+ mHandler.removeMessages(MESSAGE_ENABLE);
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(
+ MESSAGE_ENABLE, quietEnable, isBle, 1), ENABLE_DISABLE_DELAY_MS * 2);
+ Log.d(TAG, "MESSAGE_DISABLE exist. Queue new MESSAGE_ENABLE");
break;
}
@@ -1983,6 +2193,7 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
persistBluetoothSetting(BLUETOOTH_ON_BLUETOOTH);
}
+ mQuietEnable = (quietEnable == 1);
// Use service interface to get the exact state
try {
mBluetoothLock.readLock().lock();
@@ -1991,11 +2202,21 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
int state = synchronousGetState();
switch (state) {
case BluetoothAdapter.STATE_BLE_ON:
- if (isBle == 1) {
- Log.i(TAG, "Already at BLE_ON State");
- } else {
- Log.w(TAG, "BT Enable in BLE_ON State, going to ON");
+ if (isBluetoothPersistedStateOnBluetooth() ||
+ mEnableExternal) {
+ Log.w(TAG, "BLE_ON State:Enable from Settings or" +
+ "BT on persisted, going to ON");
+ mBluetooth.updateQuietModeStatus(mQuietEnable,
+ mContext.getAttributionSource());
synchronousOnLeServiceUp(mContext.getAttributionSource());
+ persistBluetoothSetting(BLUETOOTH_ON_BLUETOOTH);
+
+ // waive WRITE_SECURE_SETTINGS permission check
+ long callingIdentity = Binder.clearCallingIdentity();
+ Binder.restoreCallingIdentity(callingIdentity);
+ } else if (isBle == 1) {
+ Log.w(TAG, "BLE_ON State:Queued enable from ble app," +
+ " stay in ble on");
}
break;
case BluetoothAdapter.STATE_BLE_TURNING_ON:
@@ -2015,8 +2236,8 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
mBluetoothLock.readLock().unlock();
}
- mQuietEnable = (quietEnable == 1);
if (mBluetooth == null) {
+ Log.d(TAG, "MESSAGE_ENABLE: handleEnable");
handleEnable(mQuietEnable);
} else {
//
@@ -2036,6 +2257,7 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
// continuously failed to turn on itself.
//
mWaitForEnableRetry = 0;
+ Log.d(TAG, "Re-Queue MESSAGE_HANDLE_ENABLE_DELAYED");
Message enableDelayedMsg =
mHandler.obtainMessage(MESSAGE_HANDLE_ENABLE_DELAYED);
mHandler.sendMessageDelayed(enableDelayedMsg, ENABLE_DISABLE_DELAY_MS);
@@ -2045,15 +2267,45 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
case MESSAGE_DISABLE:
if (mHandler.hasMessages(MESSAGE_HANDLE_DISABLE_DELAYED) || mBinding
|| mHandler.hasMessages(MESSAGE_HANDLE_ENABLE_DELAYED)) {
- // We are handling enable or disable right now, wait for it.
- mHandler.sendMessageDelayed(mHandler.obtainMessage(MESSAGE_DISABLE),
- ENABLE_DISABLE_DELAY_MS);
+ if (msg.arg2 == 0) {
+ int delay = ENABLE_DISABLE_DELAY_MS;
+
+ if (mHandler.hasMessages(MESSAGE_ENABLE)) {
+ delay = ENABLE_DISABLE_DELAY_MS * 2;
+ }
+ // Keep only one MESSAGE_DISABLE and ensure it is the last one
+ // to be taken out of the queue
+ mHandler.removeMessages(MESSAGE_DISABLE);
+ // We are handling enable or disable right now, wait for it.
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(
+ MESSAGE_DISABLE, 0, 1), delay);
+ Log.d(TAG, "Queue new MESSAGE_DISABLE");
+ } else {
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(
+ MESSAGE_DISABLE, 0, 1), ENABLE_DISABLE_DELAY_MS);
+ Log.d(TAG, "Re-Queue previous MESSAGE_DISABLE");
+ if (mHandler.hasMessages(MESSAGE_ENABLE)) {
+ // Ensure the original order of just entering the queue
+ // if MESSAGE_DISABLE present
+ mHandler.removeMessages(MESSAGE_ENABLE);
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(
+ MESSAGE_ENABLE, mQuietEnableExternal ? 1: 0,
+ mEnableExternal ? 0:1, 1), ENABLE_DISABLE_DELAY_MS * 2);
+ Log.d(TAG, "Re-Queue previous MESSAGE_ENABLE");
+ }
+ }
+ break;
+ } else if(msg.arg2 == 0 && mHandler.hasMessages(MESSAGE_ENABLE)) {
+ mHandler.removeMessages(MESSAGE_DISABLE);
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(
+ MESSAGE_DISABLE, 0, 1), ENABLE_DISABLE_DELAY_MS * 2);
+ Log.d(TAG, "MESSAGE_ENABLE exist. Queue new MESSAGE_DISABLE");
break;
}
if (DBG) {
Log.d(TAG, "MESSAGE_DISABLE: mBluetooth = " + mBluetooth
- + ", mBinding = " + mBinding);
+ + ", mBinding = " + mBinding + " mEnable = " + mEnable);
}
mHandler.removeMessages(MESSAGE_RESTART_BLUETOOTH_SERVICE);
@@ -2062,20 +2314,51 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
Message disableDelayedMsg =
mHandler.obtainMessage(MESSAGE_HANDLE_DISABLE_DELAYED, 0, 0);
mHandler.sendMessageDelayed(disableDelayedMsg, ENABLE_DISABLE_DELAY_MS);
+ Log.d(TAG, "Re-Queue MESSAGE_HANDLE_DISABLE_DELAYED(0)");
} else {
mEnable = false;
handleDisable();
+ Log.d(TAG, "MESSAGE_DISABLE: handleDisable");
}
break;
case MESSAGE_HANDLE_ENABLE_DELAYED: {
- // The Bluetooth is turning off, wait for STATE_OFF
- if (mState != BluetoothAdapter.STATE_OFF) {
+ /* The Bluetooth is turning off, wait for STATE_OFF then restart bluetooth
+ * if ble app running, then wait for BLE ON and continue bt turn on
+ */
+ Log.d(TAG, "MESSAGE_HANDLE_ENABLE_DELAYED, mState=" +
+ BluetoothAdapter.nameForState(mState) + " mEnableExternal = "
+ + mEnableExternal + " getServiceRestartMs()="
+ + getServiceRestartMs());
+ if ((mState == BluetoothAdapter.STATE_BLE_ON) && (isBleAppPresent() ||
+ mWaitForEnableRetry > 0)) {
+ Log.d(TAG, "isBleAppPresent(): " + isBleAppPresent() +
+ " mWaitForEnableRetry=" + mWaitForEnableRetry);
+ mWaitForEnableRetry = 0;
+ if (mEnableExternal || isBluetoothPersistedStateOnBluetooth()) {
+ try {
+ mBluetoothLock.readLock().lock();
+ if (mBluetooth != null) {
+ mBluetooth.updateQuietModeStatus(mQuietEnable,
+ mContext.getAttributionSource());
+ synchronousOnLeServiceUp(mContext.getAttributionSource());
+ }
+ } catch (RemoteException | TimeoutException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mBluetoothLock.readLock().unlock();
+ }
+ } else {
+ Log.e(TAG, "BLE app running stay in BLE ON state");
+ }
+ break;
+ } else if (mState != BluetoothAdapter.STATE_OFF) {
if (mWaitForEnableRetry < MAX_WAIT_FOR_ENABLE_DISABLE_RETRIES) {
mWaitForEnableRetry++;
Message enableDelayedMsg =
mHandler.obtainMessage(MESSAGE_HANDLE_ENABLE_DELAYED);
mHandler.sendMessageDelayed(enableDelayedMsg, ENABLE_DISABLE_DELAY_MS);
+ Log.d(TAG, "Re-Queue MESSAGE_HANDLE_ENABLE_DELAYED");
break;
} else {
Log.e(TAG, "Wait for STATE_OFF timeout");
@@ -2087,6 +2370,7 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
Message restartMsg =
mHandler.obtainMessage(MESSAGE_RESTART_BLUETOOTH_SERVICE);
mHandler.sendMessageDelayed(restartMsg, getServiceRestartMs());
+ Log.d(TAG, "Queue MESSAGE_RESTART_BLUETOOTH_SERVICE");
Log.d(TAG, "Handle enable is finished");
break;
}
@@ -2095,14 +2379,25 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
boolean disabling = (msg.arg1 == 1);
Log.d(TAG, "MESSAGE_HANDLE_DISABLE_DELAYED: disabling:" + disabling);
if (!disabling) {
- // The Bluetooth is turning on, wait for STATE_ON
- if (mState != BluetoothAdapter.STATE_ON) {
+ /* if bluetooth is in BLE ON state and enable is from ble app
+ * then skip disable, else wait for complete ON or timeout.
+ */
+ if ((mState == BluetoothAdapter.STATE_BLE_ON) &&
+ !mEnableExternal &&
+ !isBluetoothPersistedStateOnBluetooth() &&
+ isBleAppPresent()) {
+ Log.w(TAG, "Enable from BLE APP, stay in BLE ON");
+ mWaitForDisableRetry = 0;
+ mEnable = false;
+ break;
+ } else if (mState != BluetoothAdapter.STATE_ON) {
if (mWaitForDisableRetry < MAX_WAIT_FOR_ENABLE_DISABLE_RETRIES) {
mWaitForDisableRetry++;
Message disableDelayedMsg = mHandler.obtainMessage(
MESSAGE_HANDLE_DISABLE_DELAYED, 0, 0);
mHandler.sendMessageDelayed(disableDelayedMsg,
ENABLE_DISABLE_DELAY_MS);
+ Log.d(TAG, "Re-Queue MESSAGE_HANDLE_DISABLE_DELAYED(0)");
break;
} else {
Log.e(TAG, "Wait for STATE_ON timeout");
@@ -2112,11 +2407,13 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
// should move forward to the next step.
mWaitForDisableRetry = 0;
mEnable = false;
+ Log.d(TAG, "MESSAGE_HANDLE_DISABLE_DELAYED: handleDisable");
handleDisable();
// Wait for state exiting STATE_ON
Message disableDelayedMsg =
mHandler.obtainMessage(MESSAGE_HANDLE_DISABLE_DELAYED, 1, 0);
mHandler.sendMessageDelayed(disableDelayedMsg, ENABLE_DISABLE_DELAY_MS);
+ Log.d(TAG, "Re-Queue MESSAGE_HANDLE_DISABLE_DELAYED(1)");
} else {
// The Bluetooth is turning off, wait for exiting STATE_ON
if (mState == BluetoothAdapter.STATE_ON) {
@@ -2126,6 +2423,7 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
MESSAGE_HANDLE_DISABLE_DELAYED, 1, 0);
mHandler.sendMessageDelayed(disableDelayedMsg,
ENABLE_DISABLE_DELAY_MS);
+ Log.d(TAG, "Re-Queue MESSAGE_HANDLE_DISABLE_DELAYED(1)");
break;
} else {
Log.e(TAG, "Wait for exiting STATE_ON timeout");
@@ -2139,16 +2437,32 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
}
case MESSAGE_RESTORE_USER_SETTING:
- if ((msg.arg1 == RESTORE_SETTING_TO_OFF) && mEnable) {
+ if (msg.arg1 == RESTORE_SETTING_TO_OFF) {
if (DBG) {
Log.d(TAG, "Restore Bluetooth state to disabled");
}
persistBluetoothSetting(BLUETOOTH_OFF);
mEnableExternal = false;
- sendDisableMsg(
- BluetoothProtoEnums.ENABLE_DISABLE_REASON_RESTORE_USER_SETTING,
- mContext.getPackageName());
- } else if ((msg.arg1 == RESTORE_SETTING_TO_ON) && !mEnable) {
+ clearBleApps();
+ try {
+ mBluetoothLock.readLock().lock();
+ mEnableExternal = false;
+ if (mBluetooth != null) {
+ if (getState() == BluetoothAdapter.STATE_BLE_ON) {
+ mEnable = false;
+ synchronousOnBrEdrDown(mContext.getAttributionSource());
+ } else {
+ sendDisableMsg(
+ BluetoothProtoEnums.ENABLE_DISABLE_REASON_RESTORE_USER_SETTING,
+ mContext.getPackageName());
+ }
+ }
+ } catch (RemoteException | TimeoutException e) {
+ Log.e(TAG, "Unable to initiate disable", e);
+ } finally {
+ mBluetoothLock.readLock().unlock();
+ }
+ } else if (msg.arg1 == RESTORE_SETTING_TO_ON) {
if (DBG) {
Log.d(TAG, "Restore Bluetooth state to enabled");
}
@@ -2160,6 +2474,11 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
mContext.getPackageName());
}
break;
+ case MESSAGE_INFORM_ADAPTER_SERVICE_UP: {
+ if (DBG) Log.d(TAG,"MESSAGE_INFORM_ADAPTER_SERVICE_UP");
+ sendBluetoothServiceUpCallback();
+ break;
+ }
case MESSAGE_REGISTER_STATE_CHANGE_CALLBACK: {
IBluetoothStateChangeCallback callback =
(IBluetoothStateChangeCallback) msg.obj;
@@ -2183,14 +2502,17 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
break;
}
case MESSAGE_BIND_PROFILE_SERVICE: {
+ Log.w(TAG, "MESSAGE_BIND_PROFILE_SERVICE");
ProfileServiceConnections psc = (ProfileServiceConnections) msg.obj;
removeMessages(MESSAGE_BIND_PROFILE_SERVICE, msg.obj);
if (psc == null) {
+ Log.w(TAG, "psc is null, breaking");
break;
}
if (msg.arg1 > 0) {
try {
mContext.unbindService(psc);
+ Log.w(TAG, "Calling psc.bindService from MESSAGE_BIND_PROFILE_SERVICE");
} catch (IllegalArgumentException e) {
Log.e(TAG, "Unable to unbind service with intent: " + psc.mIntent, e);
}
@@ -2212,10 +2534,8 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
break;
} // else must be SERVICE_IBLUETOOTH
- //Remove timeout
- mHandler.removeMessages(MESSAGE_TIMEOUT_BIND);
-
mBinding = false;
+ mTryBindOnBindTimeout = false;
mBluetoothBinder = service;
mBluetooth = IBluetooth.Stub.asInterface(service);
@@ -2238,7 +2558,9 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
Log.e(TAG, "Unable to register BluetoothCallback", e);
}
//Inform BluetoothAdapter instances that service is up
- sendBluetoothServiceUpCallback();
+ Message informMsg =
+ mHandler.obtainMessage(MESSAGE_INFORM_ADAPTER_SERVICE_UP);
+ mHandler.sendMessage(informMsg);
//Do enable request
try {
@@ -2253,7 +2575,21 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
}
if (!mEnable) {
- waitForState(Set.of(BluetoothAdapter.STATE_ON));
+ /* Wait for BLE ON or ON state ,if enable is from BLE app
+ * skip disable, else wait for on state and handle disable
+ */
+ waitForState(Set.of(BluetoothAdapter.STATE_BLE_ON,
+ BluetoothAdapter.STATE_ON));
+
+ int st = getState();
+ if ((st == BluetoothAdapter.STATE_TURNING_ON) ||
+ ((st == BluetoothAdapter.STATE_BLE_ON) &&
+ (mEnableExternal || isBluetoothPersistedStateOnBluetooth()))) {
+ waitForState(Set.of(BluetoothAdapter.STATE_ON));
+ } else if ((st == BluetoothAdapter.STATE_BLE_ON) && isBleAppPresent()) {
+ Log.e(TAG, "MESSAGE_BLUETOOTH_SERVICE_CONNECTED: ble app present");
+ break;
+ }
handleDisable();
waitForState(Set.of(BluetoothAdapter.STATE_OFF,
BluetoothAdapter.STATE_TURNING_ON,
@@ -2281,8 +2617,14 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
== BluetoothAdapter.STATE_OFF) && (mBluetooth != null) && mEnable) {
recoverBluetoothServiceFromError(false);
}
- if ((prevState == BluetoothAdapter.STATE_TURNING_ON) && (newState
- == BluetoothAdapter.STATE_BLE_ON) && (mBluetooth != null) && mEnable) {
+ if ((prevState == BluetoothAdapter.STATE_TURNING_ON) &&
+ (newState == BluetoothAdapter.STATE_OFF) &&
+ (mBluetooth != null) && mEnable) {
+ persistBluetoothSetting(BLUETOOTH_OFF);
+ }
+ if ((prevState == BluetoothAdapter.STATE_TURNING_ON) &&
+ (newState == BluetoothAdapter.STATE_BLE_ON) &&
+ (mBluetooth != null) && mEnable) {
recoverBluetoothServiceFromError(true);
}
// If we tried to enable BT while BT was in the process of shutting down,
@@ -2292,6 +2634,7 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
== BluetoothAdapter.STATE_OFF)) {
if (mEnable) {
Log.d(TAG, "Entering STATE_OFF but mEnabled is true; restarting.");
+ mHandler.removeMessages(MESSAGE_RESTART_BLUETOOTH_SERVICE);
waitForState(Set.of(BluetoothAdapter.STATE_OFF));
Message restartMsg =
mHandler.obtainMessage(MESSAGE_RESTART_BLUETOOTH_SERVICE);
@@ -2329,6 +2672,22 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
mBluetoothLock.writeLock().unlock();
}
+ // Make sure BT process exit completely
+ int[] pids = null;
+ try {
+ pids = (int[]) Class.forName("android.os.Process")
+ .getMethod("getPidsForCommands", String[].class)
+ .invoke(new String[]{ "com.android.bluetooth" });
+ } catch (Exception e) {
+ Log.e(TAG, "Error to call getPidsForCommands");
+ }
+ if (pids != null && pids.length > 0) {
+ for(int pid : pids) {
+ Log.e(TAG, "Killing BT process with PID = " + pid);
+ Process.killProcess(pid);
+ }
+ }
+
// log the unexpected crash
addCrashLog();
addActiveLog(BluetoothProtoEnums.ENABLE_DISABLE_REASON_CRASH,
@@ -2382,6 +2741,20 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
mBluetoothLock.writeLock().lock();
mBinding = false;
mBluetoothLock.writeLock().unlock();
+ // Ensure try BIND for one more time
+ if(!mTryBindOnBindTimeout) {
+ int userID = ActivityManager.getCurrentUser();
+
+ Log.d(TAG, "Current user: " + userID);
+ if (mBindingUserID == userID) {
+ Log.e(TAG, " Trying to Bind again");
+ mTryBindOnBindTimeout = true;
+ handleEnable(mQuietEnable);
+ }
+ } else {
+ Log.e(TAG, "Bind trails excedded");
+ mTryBindOnBindTimeout = false;
+ }
break;
}
case MESSAGE_TIMEOUT_UNBIND: {
@@ -2398,17 +2771,39 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
}
mHandler.removeMessages(MESSAGE_USER_SWITCHED);
- /* disable and enable BT when detect a user switch */
- if (mBluetooth != null && isEnabled()) {
- restartForReason(BluetoothProtoEnums.ENABLE_DISABLE_REASON_USER_SWITCH);
- } else if (mBinding || mBluetooth != null) {
- Message userMsg = mHandler.obtainMessage(MESSAGE_USER_SWITCHED);
- userMsg.arg2 = 1 + msg.arg2;
- // if user is switched when service is binding retry after a delay
- mHandler.sendMessageDelayed(userMsg, USER_SWITCHED_TIME_MS);
- if (DBG) {
- Log.d(TAG, "Retry MESSAGE_USER_SWITCHED " + userMsg.arg2);
+ try {
+ mBluetoothLock.writeLock().lock();
+ int state = getState();
+
+ if (mBluetooth != null && ((state == BluetoothAdapter.STATE_ON) ||
+ (state == BluetoothAdapter.STATE_BLE_ON && isBleAppPresent()))) {
+ /* disable and enable BT when detect a user switch */
+ if (state == BluetoothAdapter.STATE_ON) {
+ restartForReason(
+ BluetoothProtoEnums.ENABLE_DISABLE_REASON_USER_SWITCH);
+ } else {
+ if (DBG) {
+ Log.d(TAG, "Turn off from BLE state");
+ }
+ clearBleApps();
+ addActiveLog(BluetoothProtoEnums.ENABLE_DISABLE_REASON_USER_SWITCH,
+ mContext.getPackageName(), false);
+ mEnable = false;
+ synchronousOnBrEdrDown(mContext.getAttributionSource());
+ }
+ } else if (mBinding || mBluetooth != null) {
+ Message userMsg = mHandler.obtainMessage(MESSAGE_USER_SWITCHED);
+ userMsg.arg2 = 1 + msg.arg2;
+ // if user is switched when service is binding retry after a delay
+ mHandler.sendMessageDelayed(userMsg, USER_SWITCHED_TIME_MS);
+ if (DBG) {
+ Log.d(TAG, "Retry MESSAGE_USER_SWITCHED " + userMsg.arg2);
+ }
}
+ } catch (RemoteException | TimeoutException e) {
+ Log.e(TAG, "MESSAGE_USER_SWITCHED: Remote exception", e);
+ } finally {
+ mBluetoothLock.writeLock().unlock();
}
break;
}
@@ -2489,7 +2884,9 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
mState = BluetoothAdapter.STATE_TURNING_ON;
}
- waitForState(Set.of(BluetoothAdapter.STATE_ON));
+ /* wait for stable state BLE_ON or ON */
+ waitForState(Set.of(BluetoothAdapter.STATE_BLE_ON,
+ BluetoothAdapter.STATE_ON));
if (mState == BluetoothAdapter.STATE_TURNING_ON) {
bluetoothStateChangeHandler(mState, BluetoothAdapter.STATE_ON);
@@ -2498,28 +2895,49 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
unbindAllBluetoothProfileServices();
// disable
addActiveLog(reason, mContext.getPackageName(), false);
+
+ clearBleApps();
+
handleDisable();
// Pbap service need receive STATE_TURNING_OFF intent to close
bluetoothStateChangeHandler(BluetoothAdapter.STATE_ON,
BluetoothAdapter.STATE_TURNING_OFF);
+ /* wait for BLE_ON or OFF state. If its BLE ON state
+ * post BLE ON state to bluetoothStateChangeHandler
+ * to continue off and wait for off state
+ */
boolean didDisableTimeout =
- !waitForState(Set.of(BluetoothAdapter.STATE_OFF));
+ !waitForState(Set.of(BluetoothAdapter.STATE_BLE_ON,
+ BluetoothAdapter.STATE_OFF));
+
+ if(!didDisableTimeout) {
+ int state = getState();
+
+ if (state == BluetoothAdapter.STATE_BLE_ON) {
+ bluetoothStateChangeHandler(BluetoothAdapter.STATE_TURNING_OFF,
+ BluetoothAdapter.STATE_BLE_ON);
+ }
+ didDisableTimeout =
+ !waitForState(Set.of(BluetoothAdapter.STATE_OFF));
+ }
bluetoothStateChangeHandler(BluetoothAdapter.STATE_TURNING_OFF,
BluetoothAdapter.STATE_OFF);
sendBluetoothServiceDownCallback();
- try {
- mBluetoothLock.writeLock().lock();
- if (mBluetooth != null) {
- mBluetooth = null;
- // Unbind
- mContext.unbindService(mConnection);
+ if(!didDisableTimeout) {
+ try {
+ mBluetoothLock.writeLock().lock();
+ if (mBluetooth != null) {
+ mBluetooth = null;
+ // Unbind
+ mContext.unbindService(mConnection);
+ }
+ mBluetoothGatt = null;
+ } finally {
+ mBluetoothLock.writeLock().unlock();
}
- mBluetoothGatt = null;
- } finally {
- mBluetoothLock.writeLock().unlock();
}
//
@@ -2529,6 +2947,7 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
//
if (didDisableTimeout) {
SystemClock.sleep(3000);
+ mHandler.removeMessages(MESSAGE_BLUETOOTH_SERVICE_DISCONNECTED);
} else {
SystemClock.sleep(100);
}
@@ -2560,6 +2979,8 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
mHandler.removeMessages(MESSAGE_TIMEOUT_BIND);
} else {
mBinding = true;
+ mBindingUserID = ActivityManager.getCurrentUser();
+ Log.d(TAG, "Binding BT service. Current user: " + mBindingUserID);
}
} else if (mBluetooth != null) {
//Enable bluetooth
@@ -2641,6 +3062,7 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
intent.putExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, prevState);
intent.putExtra(BluetoothAdapter.EXTRA_STATE, newState);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+ intent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
mContext.sendBroadcastAsUser(intent, UserHandle.ALL, null, getTempAllowlistBroadcastOptions());
}
@@ -2671,9 +3093,10 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
if (newState == BluetoothAdapter.STATE_OFF) {
// If Bluetooth is off, send service down event to proxy objects, and unbind
if (DBG) {
- Log.d(TAG, "Bluetooth is complete send Service Down");
+ Log.d(TAG, "Bluetooth is complete off, send Service Down");
}
sendBluetoothServiceDownCallback();
+ sendBluetoothStateCallback(false);
unbindAndFinish();
sendBleStateChanged(prevState, newState);
@@ -2746,6 +3169,7 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
intent.putExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, prevState);
intent.putExtra(BluetoothAdapter.EXTRA_STATE, newState);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+ intent.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
mContext.sendBroadcastAsUser(intent, UserHandle.ALL, null,
getTempAllowlistBroadcastOptions());
}
@@ -2753,7 +3177,7 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
private boolean waitForState(Set<Integer> states) {
int i = 0;
- while (i < 10) {
+ while (i < 16) {
try {
mBluetoothLock.readLock().lock();
if (mBluetooth == null) {
@@ -2775,6 +3199,52 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
return false;
}
+ /* TODO(b/151672214) - Update for change from waitForOnOff -> waitForState
+ private boolean waitForMonitoredState(Set<Integer> states) {
+ int i = 0;
+ while (i < 10) {
+ synchronized(mConnection) {
+ try {
+ if (mBluetooth == null) break;
+ if (on) {
+ if (mBluetooth.getState() == BluetoothAdapter.STATE_ON) return true;
+ if (mBluetooth.getState() == BluetoothAdapter.STATE_BLE_ON) {
+ bluetoothStateChangeHandler(BluetoothAdapter.STATE_BLE_TURNING_ON,
+ BluetoothAdapter.STATE_BLE_ON);
+ if (mBluetoothGatt != null) {
+ Log.d(TAG,"GattService is connected, execute waitForState");
+ boolean ret = waitForState(states);
+ return ret;
+ } else {
+ Log.d(TAG,
+ "GattService connect in progress, return to avoid timeout");
+ return true;
+ }
+ }
+ } else if (off) {
+ if (mBluetooth.getState() == BluetoothAdapter.STATE_OFF) return true;
+ if (mBluetooth.getState() == BluetoothAdapter.STATE_BLE_ON) {
+ bluetoothStateChangeHandler(BluetoothAdapter.STATE_TURNING_OFF,
+ BluetoothAdapter.STATE_BLE_ON);
+ boolean ret = waitForState(states);
+ return ret;
+ }
+ } else {
+ if (mBluetooth.getState() != BluetoothAdapter.STATE_ON) return true;
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "getState()", e);
+ break;
+ }
+ }
+ SystemClock.sleep(300);
+ i++;
+ }
+ Log.e(TAG,"waitForMonitoredOnOff time out");
+ return false;
+ }
+ */
+
private void sendDisableMsg(int reason, String packageName) {
mHandler.sendMessage(mHandler.obtainMessage(MESSAGE_DISABLE));
addActiveLog(reason, packageName, false);
@@ -2835,29 +3305,10 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
mBluetoothLock.readLock().unlock();
}
- SystemClock.sleep(500);
-
- // disable
- addActiveLog(BluetoothProtoEnums.ENABLE_DISABLE_REASON_START_ERROR,
- mContext.getPackageName(), false);
- handleDisable();
-
waitForState(Set.of(BluetoothAdapter.STATE_OFF));
sendBluetoothServiceDownCallback();
- try {
- mBluetoothLock.writeLock().lock();
- if (mBluetooth != null) {
- mBluetooth = null;
- // Unbind
- mContext.unbindService(mConnection);
- }
- mBluetoothGatt = null;
- } finally {
- mBluetoothLock.writeLock().unlock();
- }
-
mHandler.removeMessages(MESSAGE_BLUETOOTH_STATE_CHANGE);
mState = BluetoothAdapter.STATE_OFF;
diff --git a/service/java/com/android/server/bluetooth/BluetoothModeChangeHelper.java b/service/java/com/android/server/bluetooth/BluetoothModeChangeHelper.java
index 4d3f22e5fe..dbdc466ad9 100644
--- a/service/java/com/android/server/bluetooth/BluetoothModeChangeHelper.java
+++ b/service/java/com/android/server/bluetooth/BluetoothModeChangeHelper.java
@@ -91,7 +91,8 @@ public class BluetoothModeChangeHelper {
@VisibleForTesting
public boolean isMediaProfileConnected() {
- return isA2dpConnected() || isHearingAidConnected() || isLeAudioConnected();
+ return isA2dpConnected() || isHearingAidConnected() || isLeAudioConnected() ||
+ isBroadcastActive();
}
@VisibleForTesting
@@ -158,4 +159,8 @@ public class BluetoothModeChangeHelper {
}
return leAudio.getConnectedDevices().size() > 0;
}
+
+ private boolean isBroadcastActive() {
+ return mAdapter.isBroadcastActive();
+ }
}
diff --git a/service/tests/Android.bp b/service/tests/Android.bp
index c26df884bf..f75b37f1d7 100644
--- a/service/tests/Android.bp
+++ b/service/tests/Android.bp
@@ -68,7 +68,7 @@ android_test {
jni_libs: [
// these are needed for Extended Mockito
- "libbluetooth_jni",
+ "//packages/modules/Bluetooth/android/app:libbluetooth_jni",
],
compile_multilib: "both",
@@ -79,3 +79,34 @@ android_test {
"mts-bluetooth",
],
}
+
+cc_library_shared {
+ name: "libbluetooth_jni",
+ srcs: ["jni/**/*.cpp"],
+ header_libs: [
+ "jni_headers",
+ "libbluetooth_headers",
+ ],
+ include_dirs: [
+ "packages/modules/Bluetooth/system/types",
+ ],
+ shared_libs: [
+ "libbase",
+ "libchrome",
+ "liblog",
+ "libnativehelper",
+ ],
+ static_libs: [
+ "libbluetooth-types",
+ ],
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wextra",
+ "-Wno-unused-parameter",
+ ],
+ sanitize: {
+ scs: true,
+ },
+ min_sdk_version: "current",
+}
diff --git a/system/Android.bp b/system/Android.bp
index dbb3ebc9a5..f3bbab694e 100644
--- a/system/Android.bp
+++ b/system/Android.bp
@@ -155,6 +155,7 @@ rust_protobuf {
source_stem: "facade",
host_supported: true,
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
diff --git a/system/audio_a2dp_hw/Android.bp b/system/audio_a2dp_hw/Android.bp
index 7d774806d1..56515e7b7f 100644
--- a/system/audio_a2dp_hw/Android.bp
+++ b/system/audio_a2dp_hw/Android.bp
@@ -29,6 +29,7 @@ cc_library {
"src/audio_a2dp_hw_utils.cc",
],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
shared_libs: [
diff --git a/system/audio_a2dp_hw/test/audio_a2dp_hw_test.cc b/system/audio_a2dp_hw/test/audio_a2dp_hw_test.cc
index 8fcbae5150..fdff236e8a 100644
--- a/system/audio_a2dp_hw/test/audio_a2dp_hw_test.cc
+++ b/system/audio_a2dp_hw/test/audio_a2dp_hw_test.cc
@@ -40,6 +40,10 @@ static uint32_t codec_sample_rate2value(
return 16000;
case BTAV_A2DP_CODEC_SAMPLE_RATE_24000:
return 24000;
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_32000:
+ return 32000;
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_8000:
+ return 8000;
case BTAV_A2DP_CODEC_SAMPLE_RATE_NONE:
break;
}
diff --git a/system/audio_hal_interface/aidl/codec_status_aidl.cc b/system/audio_hal_interface/aidl/codec_status_aidl.cc
index 6e63fb3929..a59b841d6a 100644
--- a/system/audio_hal_interface/aidl/codec_status_aidl.cc
+++ b/system/audio_hal_interface/aidl/codec_status_aidl.cc
@@ -489,7 +489,7 @@ bool UpdateOffloadingCapabilities(
default:
LOG(ERROR) << __func__
<< ": Unknown codec_type=" << preference.codec_type;
- return false;
+ break;
}
}
offloading_preference.clear();
@@ -575,4 +575,4 @@ bool IsCodecOffloadingEnabled(const CodecConfiguration& codec_config) {
} // namespace codec
} // namespace aidl
} // namespace audio
-} // namespace bluetooth \ No newline at end of file
+} // namespace bluetooth
diff --git a/system/audio_hal_interface/hidl/codec_status_hidl.cc b/system/audio_hal_interface/hidl/codec_status_hidl.cc
index 3a1db42326..7c0ee62122 100644
--- a/system/audio_hal_interface/hidl/codec_status_hidl.cc
+++ b/system/audio_hal_interface/hidl/codec_status_hidl.cc
@@ -507,7 +507,7 @@ bool UpdateOffloadingCapabilities(
default:
LOG(ERROR) << __func__
<< ": Unknown codec_type=" << preference.codec_type;
- return false;
+ break;
}
}
offloading_preference.clear();
diff --git a/system/audio_hearing_aid_hw/Android.bp b/system/audio_hearing_aid_hw/Android.bp
index cb5f110f23..54b8987d38 100644
--- a/system/audio_hearing_aid_hw/Android.bp
+++ b/system/audio_hearing_aid_hw/Android.bp
@@ -28,6 +28,7 @@ cc_library {
"src/audio_hearing_aid_hw_utils.cc",
],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
shared_libs: [
diff --git a/system/audio_hearing_aid_hw/test/audio_hearing_aid_hw_test.cc b/system/audio_hearing_aid_hw/test/audio_hearing_aid_hw_test.cc
index c5d0e2b4e5..8e03bebf51 100644
--- a/system/audio_hearing_aid_hw/test/audio_hearing_aid_hw_test.cc
+++ b/system/audio_hearing_aid_hw/test/audio_hearing_aid_hw_test.cc
@@ -40,8 +40,14 @@ static uint32_t codec_sample_rate2value(
return 16000;
case BTAV_A2DP_CODEC_SAMPLE_RATE_24000:
return 24000;
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_32000:
+ return 32000;
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_8000:
+ return 8000;
case BTAV_A2DP_CODEC_SAMPLE_RATE_NONE:
break;
+ default:
+ break;
}
return 0;
}
diff --git a/system/binder/Android.bp b/system/binder/Android.bp
index 475f91d25c..4a73ec3ba8 100644
--- a/system/binder/Android.bp
+++ b/system/binder/Android.bp
@@ -10,12 +10,7 @@ package {
// AIDL interface between libbluetooth-binder and framework.jar
filegroup {
name: "libbluetooth-binder-aidl",
- visibility: [
- "//frameworks/base",
- "//packages/modules/Bluetooth:__subpackages__",
- ],
srcs: [
- ":framework-bluetooth-updatable-exported-aidl-sources",
":modules-utils-synchronous-result-receiver-aidl",
"android/bluetooth/IBluetooth.aidl",
"android/bluetooth/IBluetoothA2dp.aidl",
@@ -68,5 +63,9 @@ filegroup {
"android/bluetooth/IBluetoothConnectionCallback.aidl",
"android/bluetooth/IBluetoothLeBroadcastAssistantCallback.aidl",
"android/bluetooth/IBluetoothLeBroadcastAssistant.aidl",
+ "android/bluetooth/IBluetoothDun.aidl",
+ "android/bluetooth/IBluetoothDeviceGroup.aidl",
+ "android/bluetooth/IBluetoothGroupCallback.aidl",
+ "android/bluetooth/IBluetoothVcp.aidl",
],
}
diff --git a/framework/aidl-export/android/bluetooth/BluetoothActivityEnergyInfo.aidl b/system/binder/android/bluetooth/BluetoothActivityEnergyInfo.aidl
index 141001941b..141001941b 100644
--- a/framework/aidl-export/android/bluetooth/BluetoothActivityEnergyInfo.aidl
+++ b/system/binder/android/bluetooth/BluetoothActivityEnergyInfo.aidl
diff --git a/framework/aidl-export/android/bluetooth/BluetoothDevice.aidl b/system/binder/android/bluetooth/BluetoothDevice.aidl
index 49d1803437..49d1803437 100644
--- a/framework/aidl-export/android/bluetooth/BluetoothDevice.aidl
+++ b/system/binder/android/bluetooth/BluetoothDevice.aidl
diff --git a/system/binder/android/bluetooth/BluetoothQualityReport.aidl b/system/binder/android/bluetooth/BluetoothQualityReport.aidl
new file mode 100644
index 0000000000..a00b3293b1
--- /dev/null
+++ b/system/binder/android/bluetooth/BluetoothQualityReport.aidl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2019, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package android.bluetooth;
+
+parcelable BluetoothQualityReport;
diff --git a/system/binder/android/bluetooth/DeviceGroup.aidl b/system/binder/android/bluetooth/DeviceGroup.aidl
new file mode 100644
index 0000000000..3b4260d7c5
--- /dev/null
+++ b/system/binder/android/bluetooth/DeviceGroup.aidl
@@ -0,0 +1,32 @@
+/******************************************************************************
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+package android.bluetooth;
+
+parcelable DeviceGroup; \ No newline at end of file
diff --git a/system/binder/android/bluetooth/IBluetooth.aidl b/system/binder/android/bluetooth/IBluetooth.aidl
index 68237c6b0c..43e00c2cdb 100644
--- a/system/binder/android/bluetooth/IBluetooth.aidl
+++ b/system/binder/android/bluetooth/IBluetooth.aidl
@@ -1,4 +1,38 @@
/*
+ * Copyright (C) 2018, The Linux Foundation. All rights reserved.
+ * Not a Contribution.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
* Copyright 2008, The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -266,6 +300,40 @@ interface IBluetooth
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.BLUETOOTH_PRIVILEGED})")
oneway void allowLowLatencyAudio(in boolean allowed, in BluetoothDevice device, in SynchronousResultReceiver receiver);
+ // Value Added
+
+ @UnsupportedAppUsage
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ void setBondingInitiatedLocally(in BluetoothDevice devicei, in boolean localInitiated, in AttributionSource attributionSource);
+
+ @UnsupportedAppUsage
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.BLUETOOTH_PRIVILEGED})")
+ int getDeviceType(in BluetoothDevice device, in AttributionSource attributionSource);
+
+ @UnsupportedAppUsage
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ boolean isTwsPlusDevice(in BluetoothDevice device, in AttributionSource attributionSource);
+
+ @UnsupportedAppUsage
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ String getTwsPlusPeerAddress(in BluetoothDevice device, in AttributionSource attributionSource);
+
+ @UnsupportedAppUsage
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ void updateQuietModeStatus(boolean quietMode, in AttributionSource attributionSource);
+
+ @UnsupportedAppUsage
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ int setSocketOpt(int type, int port, int optionName, in byte [] optionVal, int optionLen);
+
+ @UnsupportedAppUsage
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ int getSocketOpt(int type, int port, int optionName, out byte [] optionVal);
+
+ @UnsupportedAppUsage
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ boolean isBroadcastActive(in AttributionSource attributionSource);
+
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
oneway void startRfcommListener(String name, in ParcelUuid uuid, in PendingIntent intent, in AttributionSource attributionSource, in SynchronousResultReceiver receiver);
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
diff --git a/system/binder/android/bluetooth/IBluetoothDeviceGroup.aidl b/system/binder/android/bluetooth/IBluetoothDeviceGroup.aidl
new file mode 100644
index 0000000000..a89a8bf869
--- /dev/null
+++ b/system/binder/android/bluetooth/IBluetoothDeviceGroup.aidl
@@ -0,0 +1,73 @@
+/******************************************************************************
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+package android.bluetooth;
+
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.DeviceGroup;
+import android.content.AttributionSource;
+import android.os.ParcelUuid;
+
+import android.bluetooth.IBluetoothGroupCallback;
+
+/**
+ * API for interacting with Group Service
+ * @hide
+ */
+
+interface IBluetoothDeviceGroup {
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ void connect (in int appId, in BluetoothDevice device, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ void disconnect (in int appId, in BluetoothDevice device, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ void registerGroupClientApp(in ParcelUuid uuid, in IBluetoothGroupCallback callback,
+ in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ void unregisterGroupClientApp(in int appId, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ void startGroupDiscovery(in int appId, in int groupId, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ void stopGroupDiscovery(in int appId, in int groupId, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ List<DeviceGroup> getDiscoveredGroups(in boolean mPublicAddr, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ DeviceGroup getDeviceGroup(in int groupId, in boolean mPublicAddr, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ int getRemoteDeviceGroupId (in BluetoothDevice device, in ParcelUuid uuid,
+ in boolean mPublicAddr, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_SCAN)")
+ boolean isGroupDiscoveryInProgress(in int groupId, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.BLUETOOTH_PRIVILEGED})")
+ void setExclusiveAccess(in int appId, in int groupId, in List<BluetoothDevice> devices,
+ in int value, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.BLUETOOTH_PRIVILEGED})")
+ void getExclusiveAccessStatus(in int appId, in int groupId, in List<BluetoothDevice> devices,
+ in AttributionSource attributionSource);
+}
diff --git a/system/binder/android/bluetooth/IBluetoothDun.aidl b/system/binder/android/bluetooth/IBluetoothDun.aidl
new file mode 100644
index 0000000000..aca57c468b
--- /dev/null
+++ b/system/binder/android/bluetooth/IBluetoothDun.aidl
@@ -0,0 +1,45 @@
+/*
+*Copyright (c) 2013, 2018, The Linux Foundation. All rights reserved.
+*
+*Redistribution and use in source and binary forms, with or without
+*modification, are permitted provided that the following conditions are
+*met:
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above
+* copyright notice, this list of conditions and the following
+* disclaimer in the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of The Linux Foundation nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+*
+*THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+*WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+*MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+*ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+*BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+*CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+*SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+*WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+*OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+*IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package android.bluetooth;
+
+import android.bluetooth.BluetoothDevice;
+
+/**
+ * API for Bluetooth Dun service
+ *
+ * {@hide}
+ */
+interface IBluetoothDun {
+ // Public API
+ boolean disconnect(in BluetoothDevice device);
+ int getConnectionState(in BluetoothDevice device);
+ List<BluetoothDevice> getConnectedDevices();
+ List<BluetoothDevice> getDevicesMatchingConnectionStates(in int[] states);
+}
diff --git a/system/binder/android/bluetooth/IBluetoothGatt.aidl b/system/binder/android/bluetooth/IBluetoothGatt.aidl
index 8cc6e6d80e..75ab9d84fb 100644
--- a/system/binder/android/bluetooth/IBluetoothGatt.aidl
+++ b/system/binder/android/bluetooth/IBluetoothGatt.aidl
@@ -12,6 +12,41 @@
* 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.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ *
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ *
*/
package android.bluetooth;
@@ -177,4 +212,9 @@ oneway interface IBluetoothGatt {
void unregAll(in AttributionSource attributionSource, in SynchronousResultReceiver receiver);
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
void numHwTrackFiltersAvailable(in AttributionSource attributionSource, in SynchronousResultReceiver receiver);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ void leSubrateRequest(in int clientIf, in String address, in int subrateMin, in int subrateMax, in int maxLatency,
+ in int contNumber, in int supervisionTimeout, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ void subrateModeRequest(in int clientIf, in String address, in int subrateMode, in AttributionSource attributionSource);
}
diff --git a/system/binder/android/bluetooth/IBluetoothGattCallback.aidl b/system/binder/android/bluetooth/IBluetoothGattCallback.aidl
index a140ea98d3..dc197e143e 100644
--- a/system/binder/android/bluetooth/IBluetoothGattCallback.aidl
+++ b/system/binder/android/bluetooth/IBluetoothGattCallback.aidl
@@ -12,6 +12,41 @@
* 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.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ *
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ *
*/
package android.bluetooth;
@@ -40,4 +75,6 @@ oneway interface IBluetoothGattCallback {
void onConnectionUpdated(in String address, in int interval, in int latency,
in int timeout, in int status);
void onServiceChanged(in String address);
+ void onSubrateChange(in String address, in int subrateFactor, in int latency,
+ in int contNum, in int timeout, in int status);
}
diff --git a/system/binder/android/bluetooth/IBluetoothGattServerCallback.aidl b/system/binder/android/bluetooth/IBluetoothGattServerCallback.aidl
index 3f0ee20f2d..d9f1a764be 100644
--- a/system/binder/android/bluetooth/IBluetoothGattServerCallback.aidl
+++ b/system/binder/android/bluetooth/IBluetoothGattServerCallback.aidl
@@ -12,6 +12,41 @@
* 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.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ *
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ *
*/
package android.bluetooth;
@@ -44,4 +79,6 @@ oneway interface IBluetoothGattServerCallback {
void onPhyRead(in String address, in int txPhy, in int rxPhy, in int status);
void onConnectionUpdated(in String address, in int interval, in int latency,
in int timeout, in int status);
+ void onSubrateChange(in String address, in int subrateFactor, in int latency,
+ in int contNum, in int timeout, in int status);
}
diff --git a/system/binder/android/bluetooth/IBluetoothGroupCallback.aidl b/system/binder/android/bluetooth/IBluetoothGroupCallback.aidl
new file mode 100644
index 0000000000..0e7761f54f
--- /dev/null
+++ b/system/binder/android/bluetooth/IBluetoothGroupCallback.aidl
@@ -0,0 +1,48 @@
+/******************************************************************************
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+package android.bluetooth;
+
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.DeviceGroup;
+import android.os.ParcelUuid;
+
+/** @hide */
+interface IBluetoothGroupCallback {
+ void onConnectionStateChanged(in int state, in BluetoothDevice device);
+ void onGroupClientAppRegistered(in int status, in int appId);
+ void onGroupClientAppUnregistered(in int status);
+ void onNewGroupFound(in int groupId, in BluetoothDevice device, in ParcelUuid uuid);
+ void onGroupDiscoveryStatusChanged(in int groupId, in int status, in int reason);
+ void onGroupDeviceFound(in int groupId, in BluetoothDevice groupDevice);
+ void onExclusiveAccessChanged(in int groupId, in int accessValue, in int accessStatus,
+ in List<BluetoothDevice> devices);
+ void onExclusiveAccessAvailable(in int groupId, in BluetoothDevice device);
+ void onExclusiveAccessStatusFetched(in int groupId, in int accessValue);
+}
diff --git a/system/binder/android/bluetooth/IBluetoothHeadset.aidl b/system/binder/android/bluetooth/IBluetoothHeadset.aidl
index 3e9474c99a..4b32456184 100644
--- a/system/binder/android/bluetooth/IBluetoothHeadset.aidl
+++ b/system/binder/android/bluetooth/IBluetoothHeadset.aidl
@@ -101,4 +101,8 @@ interface IBluetoothHeadset {
oneway void isNoiseReductionSupported(in BluetoothDevice device, in AttributionSource attributionSource, in SynchronousResultReceiver receiver);
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
oneway void isVoiceRecognitionSupported(in BluetoothDevice device, in AttributionSource attributionSource, in SynchronousResultReceiver receiver);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.MODIFY_PHONE_STATE})")
+ oneway void phoneStateChangedDsDa(int numActive, int numHeld, int callState, String number, int type, String name, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.MODIFY_PHONE_STATE})")
+ void clccResponseDsDa(int index, int direction, int status, int mode, boolean mpty, String number, int type, in AttributionSource attributionSource);
}
diff --git a/system/binder/android/bluetooth/IBluetoothManager.aidl b/system/binder/android/bluetooth/IBluetoothManager.aidl
index c0cc2047fe..2e45d761f7 100644
--- a/system/binder/android/bluetooth/IBluetoothManager.aidl
+++ b/system/binder/android/bluetooth/IBluetoothManager.aidl
@@ -71,6 +71,7 @@ interface IBluetoothManager
boolean disableBle(in AttributionSource attributionSource, IBinder b);
@JavaPassthrough(annotation="@android.annotation.RequiresNoPermission")
boolean isBleAppPresent();
+ boolean factoryReset();
@JavaPassthrough(annotation="@android.annotation.RequiresNoPermission")
boolean isHearingAidProfileSupported();
}
diff --git a/system/binder/android/bluetooth/IBluetoothVcp.aidl b/system/binder/android/bluetooth/IBluetoothVcp.aidl
new file mode 100644
index 0000000000..da44711c5e
--- /dev/null
+++ b/system/binder/android/bluetooth/IBluetoothVcp.aidl
@@ -0,0 +1,50 @@
+/*
+ *Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ *Not a contribution
+ */
+
+/*
+ * Copyright 2018 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 android.bluetooth;
+
+import android.bluetooth.BluetoothDevice;
+import android.content.AttributionSource;
+
+/**
+ * APIs for Bluetooth Vcp Service
+ *
+ * @hide
+ */
+interface IBluetoothVcp {
+ // Public API
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ int getConnectionState(in BluetoothDevice device, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ int getConnectionMode(in BluetoothDevice device, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ void setAbsoluteVolume(in BluetoothDevice device, int volume, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ int getAbsoluteVolume(in BluetoothDevice device, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ void setMute (in BluetoothDevice device, in boolean enableMute, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ boolean isMute(in BluetoothDevice device, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ boolean setActiveProfile(in BluetoothDevice device, int audioType, int profile, in AttributionSource attributionSource);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
+ int getActiveProfile(int audioType, in AttributionSource attributionSource);
+}
diff --git a/system/btcore/Android.bp b/system/btcore/Android.bp
index 82ca35b658..05e83fba93 100644
--- a/system/btcore/Android.bp
+++ b/system/btcore/Android.bp
@@ -25,9 +25,6 @@ cc_defaults {
],
header_libs: ["libbluetooth_headers"],
host_supported: true,
- apex_available: [
- "com.android.bluetooth",
- ],
target: {
host_linux: {
cflags: ["-D_GNU_SOURCE"],
@@ -37,10 +34,6 @@ cc_defaults {
cc_library_static {
name: "libbtcore",
- visibility:[
- "//packages/apps/Test/connectivity/sl4n",
- "//packages/modules/Bluetooth:__subpackages__",
- ],
defaults: ["libbtcore_defaults"],
min_sdk_version: "Tiramisu"
}
diff --git a/system/btif/Android.bp b/system/btif/Android.bp
index 079d12cc04..15320b1e43 100644
--- a/system/btif/Android.bp
+++ b/system/btif/Android.bp
@@ -47,6 +47,7 @@ cc_library {
"libcutils",
],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
diff --git a/system/btif/src/btif_a2dp_audio_interface.cc b/system/btif/src/btif_a2dp_audio_interface.cc
new file mode 100644
index 0000000000..6fb0d14a4a
--- /dev/null
+++ b/system/btif/src/btif_a2dp_audio_interface.cc
@@ -0,0 +1,515 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2017 Google, Inc.
+ *
+ * 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.
+ *
+ ******************************************************************************/
+
+#define LOG_TAG "btif_a2dp_audio_interface"
+
+#include <android/hardware/bluetooth/a2dp/1.0/IBluetoothAudioHost.h>
+#include <android/hardware/bluetooth/a2dp/1.0/IBluetoothAudioOffload.h>
+#include <android/hardware/bluetooth/a2dp/1.0/types.h>
+#include <base/bind.h>
+#include <base/callback.h>
+#include <base/location.h>
+#include <hwbinder/ProcessState.h>
+#include <mutex>
+
+#include "audio_a2dp_hw/include/audio_a2dp_hw.h"
+#include "bta/av/bta_av_int.h"
+#include "bta/include/bta_av_api.h"
+#include "btif/include/btif_a2dp_source.h"
+#include "btif/include/btif_av.h"
+#include "btif/include/btif_av_co.h"
+#include "btif/include/btif_hf.h"
+#include "common/metrics.h"
+#include "common/time_util.h"
+#include "osi/include/log.h"
+#include "stack/include/a2dp_codec_api.h"
+#include "stack/include/avdt_api.h"
+#include "stack/include/btu.h" // do_in_main_thread
+
+using bluetooth::common::A2dpSessionMetrics;
+using bluetooth::common::BluetoothMetricsLogger;
+
+using android::hardware::bluetooth::a2dp::V1_0::IBluetoothAudioOffload;
+using android::hardware::bluetooth::a2dp::V1_0::IBluetoothAudioHost;
+using android::hardware::bluetooth::a2dp::V1_0::Status;
+using android::hardware::bluetooth::a2dp::V1_0::CodecConfiguration;
+using android::hardware::bluetooth::a2dp::V1_0::CodecType;
+using android::hardware::bluetooth::a2dp::V1_0::SampleRate;
+using android::hardware::bluetooth::a2dp::V1_0::BitsPerSample;
+using android::hardware::bluetooth::a2dp::V1_0::ChannelMode;
+using android::hardware::ProcessState;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::hardware::hidl_death_recipient;
+using ::android::hardware::hidl_vec;
+using ::android::sp;
+using ::android::wp;
+android::sp<IBluetoothAudioOffload> btAudio;
+
+#define CASE_RETURN_STR(const) \
+ case const: \
+ return #const;
+static uint8_t a2dp_cmd_pending = A2DP_CTRL_CMD_NONE;
+static Status mapToStatus(uint8_t resp);
+uint8_t btif_a2dp_audio_process_request(uint8_t cmd);
+
+static void btif_a2dp_audio_send_start_req();
+static void btif_a2dp_audio_send_suspend_req();
+static void btif_a2dp_audio_send_stop_req();
+static void btif_a2dp_audio_interface_init();
+static void btif_a2dp_audio_interface_deinit();
+static void btif_a2dp_audio_interface_restart_session();
+// Delay reporting
+// static void btif_a2dp_audio_send_sink_latency();
+
+class A2dpOffloadAudioStats {
+ public:
+ A2dpOffloadAudioStats() { Reset(); }
+ void Reset() {
+ std::lock_guard<std::recursive_mutex> lock(lock_);
+ ResetPreserveSession();
+ codec_index_ = -1;
+ }
+ void ResetPreserveSession() {
+ std::lock_guard<std::recursive_mutex> lock(lock_);
+ audio_start_time_ms_ = -1;
+ audio_stop_time_ms_ = -1;
+ }
+ void StoreMetrics() {
+ std::lock_guard<std::recursive_mutex> lock(lock_);
+ if (audio_start_time_ms_ < 0 || audio_stop_time_ms_ < 0) {
+ return;
+ }
+ A2dpSessionMetrics metrics;
+ metrics.codec_index = codec_index_;
+ metrics.is_a2dp_offload = true;
+ if (audio_stop_time_ms_ > audio_start_time_ms_) {
+ metrics.audio_duration_ms = audio_stop_time_ms_ - audio_start_time_ms_;
+ }
+ BluetoothMetricsLogger::GetInstance()->LogA2dpSession(metrics);
+ }
+ void LogAudioStart() {
+ std::lock_guard<std::recursive_mutex> lock(lock_);
+ audio_start_time_ms_ = bluetooth::common::time_get_os_boottime_ms();
+ }
+ void LogAudioStop() {
+ std::lock_guard<std::recursive_mutex> lock(lock_);
+ audio_stop_time_ms_ = bluetooth::common::time_get_os_boottime_ms();
+ }
+ void LogAudioStopMetricsAndReset() {
+ std::lock_guard<std::recursive_mutex> lock(lock_);
+ LogAudioStop();
+ StoreMetrics();
+ ResetPreserveSession();
+ }
+ void SetCodecIndex(int64_t codec_index) {
+ std::lock_guard<std::recursive_mutex> lock(lock_);
+ codec_index_ = codec_index;
+ }
+
+ private:
+ std::recursive_mutex lock_;
+ int64_t audio_start_time_ms_ = -1;
+ int64_t audio_stop_time_ms_ = -1;
+ int64_t codec_index_ = -1;
+};
+
+static A2dpOffloadAudioStats a2dp_offload_audio_stats;
+
+class BluetoothAudioHost : public IBluetoothAudioHost {
+ public:
+ Return<void> startStream() override {
+ btif_a2dp_audio_send_start_req();
+ return Void();
+ }
+ Return<void> suspendStream() override {
+ btif_a2dp_audio_send_suspend_req();
+ return Void();
+ }
+ Return<void> stopStream() override {
+ btif_a2dp_audio_send_stop_req();
+ return Void();
+ }
+
+ // TODO : Delay reporting
+ /* Return<void> a2dp_get_sink_latency() {
+ LOG_INFO("%s:start ", __func__);
+ btif_a2dp_audio_send_sink_latency();
+ return Void();
+ }*/
+};
+
+class BluetoothAudioDeathRecipient : public hidl_death_recipient {
+ public:
+ void serviceDied(
+ uint64_t /*cookie*/,
+ const wp<::android::hidl::base::V1_0::IBase>& /*who*/) override {
+ LOG_ERROR("%s", __func__);
+ // Restart the session on the correct thread
+ do_in_main_thread(FROM_HERE,
+ base::Bind(&btif_a2dp_audio_interface_restart_session));
+ }
+};
+sp<BluetoothAudioDeathRecipient> bluetoothAudioDeathRecipient =
+ new BluetoothAudioDeathRecipient();
+
+static Status mapToStatus(uint8_t resp) {
+ switch (resp) {
+ case A2DP_CTRL_ACK_SUCCESS:
+ return Status::SUCCESS;
+ break;
+ case A2DP_CTRL_ACK_PENDING:
+ return Status::PENDING;
+ break;
+ case A2DP_CTRL_ACK_FAILURE:
+ case A2DP_CTRL_ACK_INCALL_FAILURE:
+ case A2DP_CTRL_ACK_DISCONNECT_IN_PROGRESS:
+ return Status::FAILURE;
+ default:
+ APPL_TRACE_WARNING("%s: unknown status recevied :%d", __func__, resp);
+ return Status::FAILURE;
+ break;
+ }
+}
+
+static void btif_a2dp_get_codec_configuration(
+ CodecConfiguration* p_codec_info) {
+ LOG_INFO("%s", __func__);
+ tBT_A2DP_OFFLOAD a2dp_offload;
+ A2dpCodecConfig* a2dpCodecConfig = bta_av_get_a2dp_current_codec();
+ if (!a2dpCodecConfig) {
+ APPL_TRACE_ERROR("%s: failed to get current a2dp codec config", __func__);
+ return;
+ }
+
+ a2dpCodecConfig->getCodecSpecificConfig(&a2dp_offload);
+ btav_a2dp_codec_config_t codec_config;
+ codec_config = a2dpCodecConfig->getCodecConfig();
+ a2dp_offload_audio_stats.SetCodecIndex(a2dpCodecConfig->codecIndex());
+ switch (codec_config.codec_type) {
+ case BTAV_A2DP_CODEC_INDEX_SOURCE_SBC:
+ p_codec_info->codecType =
+ (::android::hardware::bluetooth::a2dp::V1_0::CodecType)
+ BTA_AV_CODEC_TYPE_SBC;
+ p_codec_info->codecSpecific.sbcData.codecParameters =
+ a2dp_offload.codec_info[0];
+ LOG_INFO(" %s: codec parameters =%d", __func__,
+ a2dp_offload.codec_info[0]);
+ p_codec_info->codecSpecific.sbcData.minBitpool =
+ a2dp_offload.codec_info[1];
+ p_codec_info->codecSpecific.sbcData.maxBitpool =
+ a2dp_offload.codec_info[2];
+ break;
+ case BTAV_A2DP_CODEC_INDEX_SOURCE_AAC:
+ p_codec_info->codecType =
+ (::android::hardware::bluetooth::a2dp::V1_0::CodecType)
+ BTA_AV_CODEC_TYPE_AAC;
+ break;
+ case BTAV_A2DP_CODEC_INDEX_SOURCE_APTX:
+ p_codec_info->codecType =
+ (::android::hardware::bluetooth::a2dp::V1_0::CodecType)
+ BTA_AV_CODEC_TYPE_APTX;
+ break;
+ case BTAV_A2DP_CODEC_INDEX_SOURCE_APTX_HD:
+ p_codec_info->codecType =
+ (::android::hardware::bluetooth::a2dp::V1_0::CodecType)
+ BTA_AV_CODEC_TYPE_APTXHD;
+ break;
+ case BTAV_A2DP_CODEC_INDEX_SOURCE_LDAC:
+ p_codec_info->codecType =
+ (::android::hardware::bluetooth::a2dp::V1_0::CodecType)
+ BTA_AV_CODEC_TYPE_LDAC;
+ p_codec_info->codecSpecific.ldacData.bitrateIndex =
+ a2dp_offload.codec_info[6];
+ break;
+ default:
+ APPL_TRACE_ERROR("%s: Unknown Codec type :%d ", __func__,
+ codec_config.codec_type);
+ }
+
+ // Obtain the MTU
+ RawAddress peer_addr = btif_av_source_active_peer();
+ tA2DP_ENCODER_INIT_PEER_PARAMS peer_param;
+ bta_av_co_get_peer_params(peer_addr, &peer_param);
+ int effectiveMtu = a2dpCodecConfig->getEffectiveMtu();
+ if (effectiveMtu > 0 && effectiveMtu < peer_param.peer_mtu) {
+ p_codec_info->peerMtu = effectiveMtu;
+ } else {
+ p_codec_info->peerMtu = peer_param.peer_mtu;
+ }
+ LOG_INFO("%s: peer MTU: %d effective MTU: %d result MTU: %d", __func__,
+ peer_param.peer_mtu, effectiveMtu, p_codec_info->peerMtu);
+
+ p_codec_info->sampleRate =
+ (::android::hardware::bluetooth::a2dp::V1_0::SampleRate)
+ codec_config.sample_rate;
+ p_codec_info->bitsPerSample =
+ (::android::hardware::bluetooth::a2dp::V1_0::BitsPerSample)
+ codec_config.bits_per_sample;
+ p_codec_info->channelMode =
+ (::android::hardware::bluetooth::a2dp::V1_0::ChannelMode)
+ codec_config.channel_mode;
+ p_codec_info->encodedAudioBitrate = a2dpCodecConfig->getTrackBitRate();
+}
+
+static void btif_a2dp_audio_interface_init() {
+ LOG_INFO("%s", __func__);
+
+ btAudio = IBluetoothAudioOffload::getService();
+ CHECK(btAudio != nullptr);
+
+ auto death_link = btAudio->linkToDeath(bluetoothAudioDeathRecipient, 0);
+ if (!death_link.isOk()) {
+ LOG_ERROR("%s: Cannot observe the Bluetooth Audio HAL's death", __func__);
+ }
+
+ LOG_INFO("%s: IBluetoothAudioOffload::getService() returned %p (%s)",
+ __func__, btAudio.get(), (btAudio->isRemote() ? "remote" : "local"));
+
+ LOG_INFO("%s:Init returned", __func__);
+}
+
+static void btif_a2dp_audio_interface_deinit() {
+ LOG_INFO("%s: start", __func__);
+ if (btAudio != nullptr) {
+ auto death_unlink = btAudio->unlinkToDeath(bluetoothAudioDeathRecipient);
+ if (!death_unlink.isOk()) {
+ LOG_ERROR("%s: Error unlinking death observer from Bluetooth Audio HAL",
+ __func__);
+ }
+ }
+ btAudio = nullptr;
+}
+
+void btif_a2dp_audio_interface_start_session() {
+ LOG_INFO("%s", __func__);
+ BluetoothMetricsLogger::GetInstance()->LogBluetoothSessionStart(
+ bluetooth::common::CONNECTION_TECHNOLOGY_TYPE_BREDR, 0);
+ a2dp_offload_audio_stats.Reset();
+ btif_a2dp_audio_interface_init();
+ CHECK(btAudio != nullptr);
+ CodecConfiguration codec_info;
+ btif_a2dp_get_codec_configuration(&codec_info);
+ android::sp<IBluetoothAudioHost> host_if = new BluetoothAudioHost();
+ btAudio->startSession(host_if, codec_info);
+}
+
+void btif_a2dp_audio_interface_end_session() {
+ LOG_INFO("%s", __func__);
+ a2dp_offload_audio_stats.LogAudioStopMetricsAndReset();
+ BluetoothMetricsLogger::GetInstance()->LogBluetoothSessionEnd(
+ bluetooth::common::DISCONNECT_REASON_UNKNOWN, 0);
+ a2dp_offload_audio_stats.Reset();
+ if (btAudio == nullptr) return;
+ auto ret = btAudio->endSession();
+ if (!ret.isOk()) {
+ LOG_ERROR("HAL server is dead");
+ }
+ btif_a2dp_audio_interface_deinit();
+}
+
+// Conditionally restart the session only if it was started before
+static void btif_a2dp_audio_interface_restart_session() {
+ LOG_INFO("%s", __func__);
+ if (btAudio == nullptr) {
+ LOG_INFO("%s: nothing to restart - session was not started", __func__);
+ return;
+ }
+ btAudio = nullptr;
+ btif_a2dp_audio_interface_start_session();
+}
+
+void btif_a2dp_audio_on_started(tBTA_AV_STATUS status) {
+ LOG_INFO("%s: status = %d", __func__, status);
+ if (btAudio != nullptr) {
+ if (a2dp_cmd_pending == A2DP_CTRL_CMD_START) {
+ if (status != A2DP_CTRL_ACK_PENDING) {
+ a2dp_cmd_pending = A2DP_CTRL_CMD_NONE;
+ }
+ LOG_INFO("%s: calling method onStarted", __func__);
+ auto hal_status = mapToStatus(status);
+ btAudio->streamStarted(hal_status);
+ if (hal_status == Status::SUCCESS) {
+ a2dp_offload_audio_stats.LogAudioStart();
+ }
+ }
+ }
+}
+
+void btif_a2dp_audio_on_suspended(tBTA_AV_STATUS status) {
+ LOG_INFO("%s: status = %d", __func__, status);
+ if (btAudio != nullptr) {
+ if (a2dp_cmd_pending == A2DP_CTRL_CMD_SUSPEND) {
+ if (status != A2DP_CTRL_ACK_PENDING) {
+ a2dp_cmd_pending = A2DP_CTRL_CMD_NONE;
+ }
+ LOG_INFO("calling method onSuspended");
+ auto hal_status = mapToStatus(status);
+ btAudio->streamSuspended(hal_status);
+ if (hal_status == Status::SUCCESS) {
+ a2dp_offload_audio_stats.LogAudioStopMetricsAndReset();
+ }
+ }
+ }
+}
+
+void btif_a2dp_audio_on_stopped(tBTA_AV_STATUS status) {
+ LOG_INFO("%s: status = %d", __func__, status);
+ if (btAudio != nullptr && a2dp_cmd_pending == A2DP_CTRL_CMD_START) {
+ a2dp_cmd_pending = A2DP_CTRL_CMD_NONE;
+ LOG_INFO("%s: Remote disconnected when start under progress", __func__);
+ btAudio->streamStarted(mapToStatus(A2DP_CTRL_ACK_DISCONNECT_IN_PROGRESS));
+ a2dp_offload_audio_stats.LogAudioStopMetricsAndReset();
+ }
+}
+void btif_a2dp_audio_send_start_req() {
+ LOG_INFO("%s", __func__);
+ uint8_t resp;
+ resp = btif_a2dp_audio_process_request(A2DP_CTRL_CMD_START);
+ if (btAudio != nullptr) {
+ auto status = mapToStatus(resp);
+ auto ret = btAudio->streamStarted(status);
+ if (status == Status::SUCCESS) {
+ a2dp_offload_audio_stats.LogAudioStart();
+ }
+ if (!ret.isOk()) LOG_ERROR("HAL server died");
+ }
+}
+void btif_a2dp_audio_send_suspend_req() {
+ LOG_INFO("%s", __func__);
+ uint8_t resp;
+ resp = btif_a2dp_audio_process_request(A2DP_CTRL_CMD_SUSPEND);
+ if (btAudio != nullptr) {
+ auto status = mapToStatus(resp);
+ auto ret = btAudio->streamSuspended(status);
+ if (status == Status::SUCCESS) {
+ a2dp_offload_audio_stats.LogAudioStopMetricsAndReset();
+ }
+ if (!ret.isOk()) LOG_ERROR("HAL server died");
+ }
+}
+
+void btif_a2dp_audio_send_stop_req() {
+ LOG_INFO("%s", __func__);
+ btif_a2dp_audio_process_request(A2DP_CTRL_CMD_STOP);
+ a2dp_offload_audio_stats.LogAudioStopMetricsAndReset();
+}
+
+/*void btif_a2dp_audio_send_sink_latency()
+{
+ LOG_INFO("%s", __func__);
+ uint16_t sink_latency = btif_av_get_sink_latency();
+ if (btAudio != nullptr) {
+ auto ret = btAudio->a2dp_on_get_sink_latency(sink_latency);
+ if (!ret.isOk()) LOG_ERROR("server died");
+ }
+}*/
+
+uint8_t btif_a2dp_audio_process_request(uint8_t cmd) {
+ LOG_INFO("%s: cmd: %s", __func__,
+ audio_a2dp_hw_dump_ctrl_event((tA2DP_CTRL_CMD)cmd));
+ uint8_t status;
+ switch (cmd) {
+ case A2DP_CTRL_CMD_START:
+ /*
+ * Don't send START request to stack while we are in a call.
+ * Some headsets such as "Sony MW600", don't allow AVDTP START
+ * while in a call, and respond with BAD_STATE.
+ */
+ if (!bluetooth::headset::IsCallIdle()) {
+ APPL_TRACE_WARNING("%s: A2DP command %s failed as call state is busy",
+ __func__,
+ audio_a2dp_hw_dump_ctrl_event((tA2DP_CTRL_CMD)cmd));
+ status = A2DP_CTRL_ACK_INCALL_FAILURE;
+ break;
+ }
+ if (btif_av_stream_started_ready()) {
+ /*
+ * Already started, setup audio data channel listener and ACK
+ * back immediately.
+ */
+ status = A2DP_CTRL_ACK_SUCCESS;
+ break;
+ }
+ if (btif_av_stream_ready()) {
+ /*
+ * Post start event and wait for audio path to open.
+ * If we are the source, the ACK will be sent after the start
+ * procedure is completed, othewise send it now.
+ */
+ btif_av_stream_start();
+ if (btif_av_get_peer_sep() == AVDT_TSEP_SRC) {
+ status = A2DP_CTRL_ACK_SUCCESS;
+ break;
+ }
+ /*Return pending and ack when start stream cfm received from remote*/
+ status = A2DP_CTRL_ACK_PENDING;
+ break;
+ }
+
+ APPL_TRACE_WARNING("%s: A2DP command %s while AV stream is not ready",
+ __func__,
+ audio_a2dp_hw_dump_ctrl_event((tA2DP_CTRL_CMD)cmd));
+ status = A2DP_CTRL_ACK_FAILURE;
+ break;
+
+ case A2DP_CTRL_CMD_STOP:
+ if (btif_av_get_peer_sep() == AVDT_TSEP_SNK &&
+ !btif_a2dp_source_is_streaming()) {
+ /* We are already stopped, just ack back */
+ status = A2DP_CTRL_ACK_SUCCESS;
+ break;
+ }
+ btif_av_stream_stop(RawAddress::kEmpty);
+ status = A2DP_CTRL_ACK_SUCCESS;
+ break;
+
+ case A2DP_CTRL_CMD_SUSPEND:
+ /* Local suspend */
+ if (btif_av_stream_started_ready()) {
+ btif_av_stream_suspend();
+ status = A2DP_CTRL_ACK_PENDING;
+ break;
+ }
+ /* If we are not in started state, just ack back ok and let
+ * audioflinger close the channel. This can happen if we are
+ * remotely suspended, clear REMOTE SUSPEND flag.
+ */
+ btif_av_clear_remote_suspend_flag();
+ status = A2DP_CTRL_ACK_SUCCESS;
+ break;
+
+ case A2DP_CTRL_CMD_OFFLOAD_START:
+ btif_av_stream_start_offload();
+ status = A2DP_CTRL_ACK_PENDING;
+ break;
+
+ default:
+ APPL_TRACE_ERROR("UNSUPPORTED CMD (%d)", cmd);
+ status = A2DP_CTRL_ACK_FAILURE;
+ break;
+ }
+ LOG_INFO("a2dp-ctrl-cmd : %s DONE returning status %d",
+ audio_a2dp_hw_dump_ctrl_event((tA2DP_CTRL_CMD)cmd), status);
+ if (status == A2DP_CTRL_ACK_PENDING) {
+ a2dp_cmd_pending = cmd;
+ } else {
+ a2dp_cmd_pending = A2DP_CTRL_CMD_NONE;
+ }
+ return status;
+}
diff --git a/system/btif/src/btif_ble_advertiser.cc b/system/btif/src/btif_ble_advertiser.cc
index 973091e59f..2c89edd42d 100644
--- a/system/btif/src/btif_ble_advertiser.cc
+++ b/system/btif/src/btif_ble_advertiser.cc
@@ -244,6 +244,16 @@ class BleAdvertiserInterfaceImpl : public BleAdvertiserInterface {
std::move(data), jni_thread_wrapper(FROM_HERE, cb)));
}
+ void CreateBIG(int advertiser_id, CreateBIGParameters create_big_params,
+ CreateBIGCallback cb) override {
+ VLOG(1) << __func__ << " advertiser_id: " << +advertiser_id;
+ }
+
+ void TerminateBIG(int advertiser_id, int big_handle, int reason,
+ TerminateBIGCallback cb) override {
+ VLOG(1) << __func__ << "big_handle: " << +big_handle;
+ }
+
void SetPeriodicAdvertisingEnable(int advertiser_id, bool enable,
StatusCallback cb) override {
VLOG(1) << __func__ << " advertiser_id: " << +advertiser_id
diff --git a/system/btif/src/btif_ble_scanner.cc b/system/btif/src/btif_ble_scanner.cc
index 16ef35a559..557d956aeb 100644
--- a/system/btif/src/btif_ble_scanner.cc
+++ b/system/btif/src/btif_ble_scanner.cc
@@ -28,6 +28,7 @@
#include <string.h>
#include <unordered_set>
+#include <vector>
#include "advertise_data_parser.h"
#include "bta_api.h"
@@ -292,7 +293,7 @@ class BleScannerInterfaceImpl : public BleScannerInterface {
jni_thread_wrapper(FROM_HERE, std::move(cb))));
}
- void SetScanParameters(int scanner_id, int scan_interval, int scan_window,
+ void SetScanParameters(int scanner_id, std::vector<uint32_t> scan_interval, std::vector<uint32_t> scan_window,
Callback cb) override {
do_in_main_thread(
FROM_HERE, base::Bind(&BTM_BleSetScanParams, scan_interval, scan_window,
@@ -358,6 +359,12 @@ class BleScannerInterfaceImpl : public BleScannerInterface {
jni_thread_wrapper(FROM_HERE, std::move(sync_lost_cb))));
}
+ void StartSync(uint8_t sid, RawAddress address, uint16_t skip,
+ uint16_t timeout, StartSyncCb start_cb, SyncReportCb report_cb,
+ SyncLostCb lost_cb) override {
+ BTIF_TRACE_DEBUG("%s :", __func__);
+ }
+
void StopSync(uint16_t handle) override {
LOG_DEBUG("handle: %d", handle);
const controller_t* controller = controller_get_interface();
@@ -403,6 +410,12 @@ class BleScannerInterfaceImpl : public BleScannerInterface {
jni_thread_wrapper(FROM_HERE, std::move(sync_transfer_cb))));
}
+ void TransferSync(RawAddress address, uint16_t service_data,
+ uint16_t sync_handle, SyncTransferCb cb) override {
+ BTIF_TRACE_DEBUG("%s :", __func__);
+ }
+
+
void TransferSetInfo(RawAddress address, uint16_t service_data,
uint8_t adv_handle, int pa_source) override {
LOG_DEBUG("address: %s", address.ToString().c_str());
@@ -424,6 +437,11 @@ class BleScannerInterfaceImpl : public BleScannerInterface {
jni_thread_wrapper(FROM_HERE, std::move(sync_transfer_cb))));
}
+ void TransferSetInfo(RawAddress address, uint16_t service_data,
+ uint8_t adv_handle, SyncTransferCb cb) override {
+ BTIF_TRACE_DEBUG("%s :", __func__);
+ }
+
void SyncTxParameters(RawAddress addr, uint8_t mode, uint16_t skip,
uint16_t timeout, int reg_id) override {
LOG_DEBUG("address: %s", addr.ToString().c_str());
@@ -444,6 +462,11 @@ class BleScannerInterfaceImpl : public BleScannerInterface {
jni_thread_wrapper(FROM_HERE, std::move(start_sync_cb))));
}
+ void SyncTxParameters(RawAddress addr, uint8_t mode,
+ uint16_t skip, uint16_t timeout,StartSyncCb cb) {
+ BTIF_TRACE_DEBUG("%s :", __func__);
+ }
+
ScanningCallbacks* callbacks_ = nullptr;
};
diff --git a/system/btif/src/btif_gatt_client.cc b/system/btif/src/btif_gatt_client.cc
index ae8962e5ec..905179d560 100644
--- a/system/btif/src/btif_gatt_client.cc
+++ b/system/btif/src/btif_gatt_client.cc
@@ -14,6 +14,40 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ *
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ *
******************************************************************************/
/*******************************************************************************
@@ -684,6 +718,14 @@ static bt_status_t btif_gattc_test_command(int command,
return btif_gattc_test_command_impl(command, &params);
}
+bt_status_t btif_gattc_subrate_request(const RawAddress& bd_addr,
+ int subrate_min, int subrate_max,
+ int max_latency, int cont_num,
+ int sup_timeout) {
+ CHECK_BTGATT_INIT();
+ return BT_STATUS_SUCCESS;
+}
+
} // namespace
const btgatt_client_interface_t btgattClientInterface = {
@@ -709,4 +751,5 @@ const btgatt_client_interface_t btgattClientInterface = {
btif_gattc_set_preferred_phy,
btif_gattc_read_phy,
btif_gattc_test_command,
- btif_gattc_get_gatt_db};
+ btif_gattc_get_gatt_db,
+ btif_gattc_subrate_request};
diff --git a/system/conf/bt_did.conf b/system/conf/bt_did.conf
index 631cc6df34..4c9f4de882 100644
--- a/system/conf/bt_did.conf
+++ b/system/conf/bt_did.conf
@@ -7,7 +7,8 @@ primaryRecord = true
# Vendor ID '0xFFFF' indicates no Device ID Service Record is present in the device
# 0x000F = Broadcom Corporation (default)
-#vendorId = 0x000F
+# 0x001D = Qualcomm
+vendorId = 0x001D
# Vendor ID Source
# 0x0001 = Bluetooth SIG assigned Device ID Vendor ID value (default)
diff --git a/system/conf/bt_stack.conf b/system/conf/bt_stack.conf
index d1e7756408..be3f648497 100644
--- a/system/conf/bt_stack.conf
+++ b/system/conf/bt_stack.conf
@@ -34,7 +34,7 @@ TRC_HID_DEV=2
# See libchrome/base/logging.h for description on how to configure your logs.
# sample configuration:
#LoggingV=--v=0
-#LoggingVModule=--vmodule=*/btm/*=1,btm_ble_multi*=2,btif_*=1
+#LoggingVModule=--vmodule=*/btm/*=1,btm_ble_multi*=2,btif_*=1,*/bta/gatt/*=1,*/stack/gatt/*=1,*/stack/smp/*=1
# PTS testing helpers
@@ -53,6 +53,21 @@ TRC_HID_DEV=2
# PTS AVRCP Test mode
#PTS_AvrcpTest=true
+# Enable LE non-conn adv mode
+# valid value: true, false
+#PTS_EnableNonConnAdvMode=true
+
+# Enable LE conn, non discoverable adv mode
+# valid value: true, false
+#PTS_EnableConnNonDiscAdvMode=true
+
+# Disable LE security request
+#PTS_DisableSecRequest=true
+
+# Enable Fresh LE pairing
+#PTS_EnableFreshPairing=true
+
+
# SMP Certification Failure Cases
# Set any of the following SMP error values (from smp_api_types.h)
# to induce pairing failues for various PTS SMP test cases.
@@ -63,8 +78,58 @@ TRC_HID_DEV=2
# SMP_PAIR_AUTH_FAIL = 3
# SMP_CONFIRM_VALUE_ERR = 4
# SMP_PAIR_NOT_SUPPORT = 5
+# SMP_ENC_KEY_SIZE = 6
# SMP_PAIR_FAIL_UNKNOWN = 8
# SMP_REPEATED_ATTEMPTS = 9
# SMP_NUMERIC_COMPAR_FAIL = 12
#PTS_SmpFailureCase=0
+# To Disable Encryption, set PTS_LeDisableEncryp to 1
+#PTS_LeDisableEncryp=0
+
+# To Disable Encryption, set PTS_DisableH7Support to 1
+#PTS_DisableH7Support=0
+
+# L2cap LE Certification Failure Cases
+# Set any of the following L2cap LE error values (from l2cdefs.h)
+# to induce pairing failues for various PTS L2cap LE test cases.
+# Setting PTS_L2capLeInsuffEnc to 0 means normal operation.
+# Failure modes:
+#
+# L2CAP_LE_RESULT_INSUFFICIENT_AUTHENTICATION = 5
+# L2CAP_LE_RESULT_INSUFFICIENT_AUTHORIZATION = 6
+# L2CAP_LE_RESULT_INSUFFICIENT_ENCRYP_KEY_SIZE = 7
+# L2CAP_LE_RESULT_INSUFFICIENT_ENCRYP = 8
+#PTS_L2capLeInsuffEnc=0
+
+# SMP Certification Invalid Public Key Cases
+# Invalid Public Key types:
+#
+# Set Public Key y-coordinate to be 0 and DHKey to be 0
+# PTS_GenerateInvalidPublicKey = 1
+
+# Set Public Key y-coordinate to be 0
+# PTS_GenerateInvalidPublicKey = 2
+#
+# Flip one bit of Public Key y-coordinate
+# PTS_GenerateInvalidPublicKey = 3
+#
+# Set Public Key coordinates (0, 0) and DHKey to be 0
+# PTS_GenerateInvalidPublicKey = 4
+
+# BREDR pairing Certification Cases
+# Set any of the following auth values (from btm_api_types.h)
+# to induce differen pairing cases for PTS test cases.
+# BTM_AUTH_SP_NO 0 MITM Protection Not Required - non-bonding
+# BTM_AUTH_SP_YES 1 MITM Protection Required - non-bonding
+# BTM_AUTH_AP_NO 2 MITM Protection Not Required - dedicated-bonding
+# BTM_AUTH_AP_YES 3 MITM Protection Required - dedicated-bonding
+# BTM_AUTH_SPGB_NO 4 MITM Protection Not Required - General-bonding
+# BTM_AUTH_SPGB_YES 5 MITM Protection Required - General-bonding
+# PTS_BredrAuthReq=3
+
+# BREDR secure connection host support disable
+# PTS_BredrSecConnHostSupportDisable = true
+
+# BREDR invalid encryption key size simulation
+# PTS_BredrInvalidEncryKeysize=6
diff --git a/system/embdrv/lc3/Android.bp b/system/embdrv/lc3/Android.bp
index 68c97244ff..353f7651de 100644
--- a/system/embdrv/lc3/Android.bp
+++ b/system/embdrv/lc3/Android.bp
@@ -12,6 +12,7 @@ cc_library_static {
host_supported: true,
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth"
],
defaults: ["fluoride_defaults"],
diff --git a/system/gd/Android.bp b/system/gd/Android.bp
index de8a8a7bea..8eca557cf7 100644
--- a/system/gd/Android.bp
+++ b/system/gd/Android.bp
@@ -609,6 +609,7 @@ rust_library {
"liblog_rust",
],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
diff --git a/system/gd/dumpsys/Android.bp b/system/gd/dumpsys/Android.bp
index 0241b008cc..5606d56bb9 100644
--- a/system/gd/dumpsys/Android.bp
+++ b/system/gd/dumpsys/Android.bp
@@ -143,6 +143,7 @@ cc_library {
"BluetoothGeneratedDumpsysBundledSchema_cc",
],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
diff --git a/system/gd/hci/le_scanning_manager.cc b/system/gd/hci/le_scanning_manager.cc
index bc804981a9..8fd87913fc 100644
--- a/system/gd/hci/le_scanning_manager.cc
+++ b/system/gd/hci/le_scanning_manager.cc
@@ -1525,8 +1525,8 @@ void LeScanningManager::Scan(bool start) {
}
void LeScanningManager::SetScanParameters(
- ScannerId scanner_id, LeScanType scan_type, uint16_t scan_interval, uint16_t scan_window) {
- CallOn(pimpl_.get(), &impl::set_scan_parameters, scanner_id, scan_type, scan_interval, scan_window);
+ ScannerId scanner_id, LeScanType scan_type, std::vector<uint32_t> scan_interval, std::vector<uint32_t> scan_window) {
+ CallOn(pimpl_.get(), &impl::set_scan_parameters, scanner_id, scan_type, scan_interval[0], scan_window[0]);
}
void LeScanningManager::ScanFilterEnable(bool enable) {
diff --git a/system/gd/hci/le_scanning_manager.h b/system/gd/hci/le_scanning_manager.h
index d1288e169f..e98e4f3055 100644
--- a/system/gd/hci/le_scanning_manager.h
+++ b/system/gd/hci/le_scanning_manager.h
@@ -52,7 +52,7 @@ class LeScanningManager : public bluetooth::Module {
virtual void Scan(bool start);
virtual void SetScanParameters(
- ScannerId scanner_id, LeScanType scan_type, uint16_t scan_interval, uint16_t scan_window);
+ ScannerId scanner_id, LeScanType scan_type, std::vector<uint32_t> scan_interval, std::vector<uint32_t> scan_window);
/* Scan filter */
virtual void ScanFilterEnable(bool enable);
diff --git a/system/gd/hci/le_scanning_manager_mock.h b/system/gd/hci/le_scanning_manager_mock.h
index a8890764ca..af7c202a85 100644
--- a/system/gd/hci/le_scanning_manager_mock.h
+++ b/system/gd/hci/le_scanning_manager_mock.h
@@ -52,7 +52,8 @@ class MockLeScanningManager : public LeScanningManager {
MOCK_METHOD(void, RegisterScanner, (const Uuid));
MOCK_METHOD(void, Unregister, (ScannerId));
MOCK_METHOD(void, Scan, (bool));
- MOCK_METHOD(void, SetScanParameters, (ScannerId, LeScanType, uint16_t, uint16_t));
+ MOCK_METHOD(void, SetScanParameters,
+ (ScannerId, LeScanType, std::vector<uint32_t>, std::vector<uint32_t>));
MOCK_METHOD(void, ScanFilterEnable, (bool));
MOCK_METHOD(void, ScanFilterParameterSetup, (ApcfAction, uint8_t, AdvertisingFilterParameter));
MOCK_METHOD(void, ScanFilterAdd, (uint8_t, std::vector<AdvertisingPacketContentFilterCommand>));
diff --git a/system/gd/proto/Android.bp b/system/gd/proto/Android.bp
index 1e256e671c..6bb3f26f9e 100644
--- a/system/gd/proto/Android.bp
+++ b/system/gd/proto/Android.bp
@@ -18,6 +18,7 @@ java_library_static {
"bluetooth/bluetoothKeystore/keystore.proto",
],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
@@ -36,6 +37,7 @@ cc_library_static {
"bluetooth/bluetoothKeystore/keystore.proto",
],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
@@ -54,6 +56,7 @@ cc_library_static {
"bluetooth/bluetoothKeystore/keystore.proto",
],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
diff --git a/system/gd/rust/common/Android.bp b/system/gd/rust/common/Android.bp
index 31b6ea82ce..26a006892f 100644
--- a/system/gd/rust/common/Android.bp
+++ b/system/gd/rust/common/Android.bp
@@ -41,6 +41,7 @@ rust_library {
"libpaste",
],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
diff --git a/system/gd/rust/facade/Android.bp b/system/gd/rust/facade/Android.bp
index 82b79567d0..3d4d0b9705 100644
--- a/system/gd/rust/facade/Android.bp
+++ b/system/gd/rust/facade/Android.bp
@@ -59,6 +59,7 @@ rust_library {
"libcxx",
],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
diff --git a/system/gd/rust/gddi/Android.bp b/system/gd/rust/gddi/Android.bp
index b6cff426fc..91713ac48c 100644
--- a/system/gd/rust/gddi/Android.bp
+++ b/system/gd/rust/gddi/Android.bp
@@ -16,6 +16,7 @@ rust_library {
proc_macros: ["libgddi_macros"],
rustlibs: ["libtokio"],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
diff --git a/system/gd/rust/shim/Android.bp b/system/gd/rust/shim/Android.bp
index 7521f45792..91e91e1c96 100644
--- a/system/gd/rust/shim/Android.bp
+++ b/system/gd/rust/shim/Android.bp
@@ -60,6 +60,7 @@ rust_ffi_static {
name: "libbt_shim_ffi",
defaults: ["libbt_shim_defaults"],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
@@ -98,6 +99,7 @@ cc_library_static {
],
host_supported: true,
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
@@ -115,6 +117,7 @@ cc_library_static {
],
host_supported: true,
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
@@ -131,6 +134,7 @@ cc_library_static {
generated_headers: ["libbt_shim_bridge_header", "cxx-bridge-header"],
host_supported: true,
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
@@ -141,6 +145,7 @@ cc_library_headers {
local_include_dirs: ["callbacks"],
host_supported: true,
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
diff --git a/system/gd/rust/stack/Android.bp b/system/gd/rust/stack/Android.bp
index 37d71369fa..fe6c527d66 100644
--- a/system/gd/rust/stack/Android.bp
+++ b/system/gd/rust/stack/Android.bp
@@ -36,6 +36,7 @@ rust_library {
"libnum_derive",
],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
@@ -116,6 +117,7 @@ cc_library_static {
"libutils",
],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
diff --git a/system/gd/rust/topshim/src/profiles/gatt.rs b/system/gd/rust/topshim/src/profiles/gatt.rs
index d615a85b35..ba9f2b19e4 100644
--- a/system/gd/rust/topshim/src/profiles/gatt.rs
+++ b/system/gd/rust/topshim/src/profiles/gatt.rs
@@ -1656,6 +1656,7 @@ impl Gatt {
// TODO(b/200073464): Remove these.
services_removed_cb: None,
services_added_cb: None,
+ subrate_chg_cb: None,
});
let mut gatt_server_callbacks = Box::new(btgatt_server_callbacks_t {
@@ -1675,6 +1676,7 @@ impl Gatt {
mtu_changed_cb: Some(gs_mtu_changed_cb),
phy_updated_cb: Some(gs_phy_updated_cb),
conn_updated_cb: Some(gs_conn_updated_cb),
+ subrate_chg_cb : None,
});
let mut gatt_scanner_callbacks = Box::new(btgatt_scanner_callbacks_t {
diff --git a/system/include/Android.bp b/system/include/Android.bp
index cfe5897f33..e534530233 100644
--- a/system/include/Android.bp
+++ b/system/include/Android.bp
@@ -30,11 +30,6 @@ cc_library_headers {
cc_library_headers {
name: "libbluetooth_headers",
defaults: ["libchrome_support_defaults"],
- visibility:[
- "//packages/apps/Test/connectivity/sl4n",
- "//packages/modules/Bluetooth:__subpackages__",
- "//vendor:__subpackages__",
- ],
header_libs: [
"avrcp_headers",
"libbluetooth-types-header",
diff --git a/system/include/hardware/ble_advertiser.h b/system/include/hardware/ble_advertiser.h
index 603b98f085..892b856a09 100644
--- a/system/include/hardware/ble_advertiser.h
+++ b/system/include/hardware/ble_advertiser.h
@@ -38,6 +38,20 @@ struct AdvertiseParameters {
int8_t own_address_type;
};
+struct CreateBIGParameters {
+ uint8_t adv_handle;
+ uint8_t num_bis;
+ uint32_t sdu_int;
+ uint16_t max_sdu;
+ uint16_t max_transport_latency;
+ uint8_t rtn;
+ uint8_t phy;
+ uint8_t packing;
+ uint8_t framing;
+ uint8_t encryption;
+ std::vector<uint8_t> broadcast_code;
+};
+
struct PeriodicAdvertisingParameters {
uint8_t enable;
uint16_t min_interval;
@@ -84,7 +98,15 @@ class BleAdvertiserInterface {
uint8_t /* status */)>;
using ParametersCallback =
base::Callback<void(uint8_t /* status */, int8_t /* tx_power */)>;
-
+ using CreateBIGCallback = base::Callback<void(uint8_t /*adv_inst_id*/,
+ uint8_t /*status*/, uint8_t /*big_handle*/, uint32_t /*big_sync_delay*/,
+ uint32_t /*transport_latency_big*/, uint8_t /*phy*/, uint8_t /*nse*/,
+ uint8_t /*bn*/, uint8_t /*pto*/, uint8_t /*irc*/, uint16_t /*max_pdu*/,
+ uint16_t /*iso_int*/, uint8_t /*num_bis*/,
+ std::vector<uint16_t> /*conn_handle_list*/)>;
+ using TerminateBIGCallback =
+ base::Callback<void(uint8_t /* status */, uint8_t /* advertiser_id */,
+ uint8_t /* big_handle */, uint8_t /* reason */)>;
/** Registers an advertiser with the stack */
virtual void RegisterAdvertiser(IdStatusCallback) = 0;
@@ -134,6 +156,14 @@ class BleAdvertiserInterface {
std::vector<uint8_t> data,
StatusCallback cb) = 0;
+ virtual void CreateBIG(
+ int advertiser_id, CreateBIGParameters create_big_params,
+ CreateBIGCallback cb) = 0;
+
+ virtual void TerminateBIG(
+ int advertiser_id, int big_handle, int reason,
+ TerminateBIGCallback cb) = 0;
+
virtual void SetPeriodicAdvertisingEnable(int advertiser_id, bool enable,
StatusCallback cb) = 0;
virtual void RegisterCallbacks(AdvertisingCallbacks* callbacks) = 0;
diff --git a/system/include/hardware/ble_scanner.h b/system/include/hardware/ble_scanner.h
index 71531386fe..f214dbb5c0 100644
--- a/system/include/hardware/ble_scanner.h
+++ b/system/include/hardware/ble_scanner.h
@@ -156,8 +156,9 @@ class BleScannerInterface {
virtual void ScanFilterEnable(bool enable, EnableCallback cb) = 0;
/** Sets the LE scan interval and window in units of N*0.625 msec */
- virtual void SetScanParameters(int scanner_id, int scan_interval,
- int scan_window, Callback cb) = 0;
+ virtual void SetScanParameters(int scanner_id, std::vector<uint32_t> scan_interval,
+ std::vector<uint32_t> scan_window,
+ Callback cb) = 0;
/* Configure the batchscan storage */
virtual void BatchscanConfigStorage(int client_if, int batch_scan_full_max,
@@ -176,6 +177,19 @@ class BleScannerInterface {
/* Read out batchscan reports */
virtual void BatchscanReadReports(int client_if, int scan_mode) = 0;
+ using StartSyncCb =
+ base::Callback<void(uint8_t status, uint16_t sync_handle,
+ uint8_t advertising_sid, uint8_t address_type,
+ RawAddress address, uint8_t phy, uint16_t interval)>;
+ using SyncReportCb =
+ base::Callback<void(uint16_t sync_handle, int8_t tx_power, int8_t rssi,
+ uint8_t status, std::vector<uint8_t> data)>;
+ using SyncLostCb = base::Callback<void(uint16_t sync_handle)>;
+
+ virtual void StartSync(uint8_t sid, RawAddress address, uint16_t skip,
+ uint16_t timeout, StartSyncCb start_cb,
+ SyncReportCb report_cb, SyncLostCb lost_cb) = 0;
+
virtual void StartSync(uint8_t sid, RawAddress address, uint16_t skip,
uint16_t timeout, int reg_id) = 0;
virtual void StopSync(uint16_t handle) = 0;
@@ -184,6 +198,16 @@ class BleScannerInterface {
virtual void CancelCreateSync(uint8_t sid, RawAddress address) = 0;
+ using SyncTransferCb =
+ base::Callback<void(uint8_t /*status*/, RawAddress /*addr*/)>;
+
+ virtual void TransferSync(RawAddress address, uint16_t service_data,
+ uint16_t sync_handle, SyncTransferCb cb) = 0;
+ virtual void TransferSetInfo(RawAddress address, uint16_t service_data,
+ uint8_t adv_handle, SyncTransferCb cb) = 0;
+ virtual void SyncTxParameters(RawAddress addr, uint8_t mode, uint16_t skip,
+ uint16_t timeout, StartSyncCb start_cb) = 0;
+
virtual void TransferSync(RawAddress address, uint16_t service_data,
uint16_t sync_handle, int pa_source) = 0;
virtual void TransferSetInfo(RawAddress address, uint16_t service_data,
diff --git a/system/include/hardware/bt_av.h b/system/include/hardware/bt_av.h
index 8a7234b9df..3fe99a9fba 100644
--- a/system/include/hardware/bt_av.h
+++ b/system/include/hardware/bt_av.h
@@ -55,10 +55,16 @@ typedef enum {
BTAV_A2DP_CODEC_INDEX_SOURCE_APTX,
BTAV_A2DP_CODEC_INDEX_SOURCE_APTX_HD,
BTAV_A2DP_CODEC_INDEX_SOURCE_LDAC,
-
+ BTAV_A2DP_CODEC_INDEX_SOURCE_LC3,
BTAV_A2DP_CODEC_INDEX_SOURCE_MAX,
+ BTAV_A2DP_CODEC_INDEX_SOURCE_APTX_ADAPTIVE =
+ BTAV_A2DP_CODEC_INDEX_SOURCE_MAX,
+ BTAV_A2DP_CODEC_INDEX_SOURCE_APTX_TWS,
+
+ BTAV_A2DP_QVA_CODEC_INDEX_SOURCE_MAX,
- BTAV_A2DP_CODEC_INDEX_SINK_MIN = BTAV_A2DP_CODEC_INDEX_SOURCE_MAX,
+ BTAV_A2DP_CODEC_INDEX_SINK_MIN =
+ BTAV_A2DP_QVA_CODEC_INDEX_SOURCE_MAX,
// Add an entry for each sink codec here
BTAV_A2DP_CODEC_INDEX_SINK_SBC = BTAV_A2DP_CODEC_INDEX_SINK_MIN,
@@ -93,7 +99,9 @@ typedef enum {
BTAV_A2DP_CODEC_SAMPLE_RATE_176400 = 0x1 << 4,
BTAV_A2DP_CODEC_SAMPLE_RATE_192000 = 0x1 << 5,
BTAV_A2DP_CODEC_SAMPLE_RATE_16000 = 0x1 << 6,
- BTAV_A2DP_CODEC_SAMPLE_RATE_24000 = 0x1 << 7
+ BTAV_A2DP_CODEC_SAMPLE_RATE_24000 = 0x1 << 7,
+ BTAV_A2DP_CODEC_SAMPLE_RATE_32000 = 0x1 << 8,
+ BTAV_A2DP_CODEC_SAMPLE_RATE_8000 = 0x1 << 9
} btav_a2dp_codec_sample_rate_t;
typedef enum {
@@ -152,9 +160,18 @@ typedef struct {
case BTAV_A2DP_CODEC_INDEX_SOURCE_APTX_HD:
codec_name_str = "aptX HD";
break;
+ case BTAV_A2DP_CODEC_INDEX_SOURCE_LC3:
+ codec_name_str = "LC3";
+ break;
+ case BTAV_A2DP_CODEC_INDEX_SOURCE_APTX_ADAPTIVE:
+ codec_name_str = "aptX Adaptive";
+ break;
case BTAV_A2DP_CODEC_INDEX_SOURCE_LDAC:
codec_name_str = "LDAC";
break;
+ case BTAV_A2DP_CODEC_INDEX_SOURCE_APTX_TWS:
+ codec_name_str = "aptX TWS";
+ break;
case BTAV_A2DP_CODEC_INDEX_SINK_SBC:
codec_name_str = "SBC (Sink)";
break;
diff --git a/system/include/hardware/bt_common_types.h b/system/include/hardware/bt_common_types.h
index 9d9a454825..8bd01c4812 100644
--- a/system/include/hardware/bt_common_types.h
+++ b/system/include/hardware/bt_common_types.h
@@ -104,6 +104,10 @@ struct ApcfCommand {
std::vector<uint8_t> data;
std::vector<uint8_t> data_mask;
std::array<uint8_t, 16> irk; // 128 bit/16 octet IRK
+ uint8_t org_id;
+ uint8_t tds_flags;
+ uint8_t tds_flags_mask;
+ bool group_filter_enabled;
};
#endif /* ANDROID_INCLUDE_BT_COMMON_TYPES_H */
diff --git a/system/include/hardware/bt_gatt_client.h b/system/include/hardware/bt_gatt_client.h
index 9e73facbef..18c554d1d2 100644
--- a/system/include/hardware/bt_gatt_client.h
+++ b/system/include/hardware/bt_gatt_client.h
@@ -12,6 +12,41 @@
* 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.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ *
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ *
*/
#ifndef ANDROID_INCLUDE_BT_GATT_CLIENT_H
@@ -143,7 +178,7 @@ typedef void (*read_descriptor_callback)(int conn_id, int status,
/** Callback invoked in response to write_descriptor */
typedef void (*write_descriptor_callback)(int conn_id, int status,
uint16_t handle, uint16_t len,
- const uint8_t* value);
+ const uint8_t* value);
/** Callback triggered in response to read_remote_rssi */
typedef void (*read_remote_rssi_callback)(int client_if, const RawAddress& bda,
@@ -186,6 +221,13 @@ typedef void (*conn_updated_callback)(int conn_id, uint16_t interval,
/** Callback when services are changed */
typedef void (*service_changed_callback)(int conn_id);
+/** Callback invoked when the subrate change event for a given connection
+ * is received */
+typedef void (*subrate_change_callback)(int conn_id, uint16_t subrate_factor,
+ uint16_t latency, uint16_t cont_num,
+ uint16_t timeout, uint8_t status);
+
+
typedef struct {
register_client_callback register_client_cb;
connect_callback open_cb;
@@ -207,6 +249,7 @@ typedef struct {
phy_updated_callback phy_updated_cb;
conn_updated_callback conn_updated_cb;
service_changed_callback service_changed_cb;
+ subrate_change_callback subrate_chg_cb;
} btgatt_client_callbacks_t;
/** Represents the standard BT-GATT client interface. */
@@ -312,6 +355,12 @@ typedef struct {
/** Get gatt db content */
bt_status_t (*get_gatt_db)(int conn_id);
+ /** Request a BLE subrate request procedure */
+ bt_status_t (*subrate_request)(const RawAddress& bd_addr,
+ int subrate_min, int subrate_max,
+ int max_latency, int cont_num,
+ int timeout);
+
} btgatt_client_interface_t;
__END_DECLS
diff --git a/system/include/hardware/bt_gatt_server.h b/system/include/hardware/bt_gatt_server.h
index 0e9b03942b..82a93c556b 100644
--- a/system/include/hardware/bt_gatt_server.h
+++ b/system/include/hardware/bt_gatt_server.h
@@ -12,6 +12,41 @@
* 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.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ *
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ *
*/
#ifndef ANDROID_INCLUDE_BT_GATT_SERVER_H
@@ -117,6 +152,13 @@ typedef void (*phy_updated_callback)(int conn_id, uint8_t tx_phy,
typedef void (*conn_updated_callback)(int conn_id, uint16_t interval,
uint16_t latency, uint16_t timeout,
uint8_t status);
+
+/** Callback invoked when the connection's subrate parameters for a given connection
+ * changes */
+typedef void (*subrate_change_callback)(int conn_id, uint16_t subrate_factor,
+ uint16_t latency, uint16_t cont_num,
+ uint16_t timeout, uint8_t status);
+
typedef struct {
register_server_callback register_server_cb;
connection_callback connection_cb;
@@ -134,6 +176,7 @@ typedef struct {
mtu_changed_callback mtu_changed_cb;
phy_updated_callback phy_updated_cb;
conn_updated_callback conn_updated_cb;
+ subrate_change_callback subrate_chg_cb;
} btgatt_server_callbacks_t;
/** Represents the standard BT-GATT server interface. */
diff --git a/system/main/Android.bp b/system/main/Android.bp
index 8f8a245a09..142f2a5c57 100644
--- a/system/main/Android.bp
+++ b/system/main/Android.bp
@@ -61,11 +61,6 @@ cc_library_static {
cc_library {
name: "libbluetooth",
- visibility: [
- "//cts/hostsidetests:__subpackages__",
- "//packages/modules/Bluetooth:__subpackages__",
- "//vendor:__subpackages__",
- ],
defaults: ["fluoride_full_defaults"],
header_libs: ["libbluetooth_headers"],
export_header_lib_headers: ["libbluetooth_headers"],
@@ -103,9 +98,6 @@ cc_library {
sanitize: {
scs: true,
},
- apex_available: [
- "com.android.bluetooth",
- ],
host_supported: true,
min_sdk_version: "30",
}
diff --git a/system/main/shim/ble_scanner_interface_impl.h b/system/main/shim/ble_scanner_interface_impl.h
index 770d08520e..963435184c 100644
--- a/system/main/shim/ble_scanner_interface_impl.h
+++ b/system/main/shim/ble_scanner_interface_impl.h
@@ -52,7 +52,8 @@ class BleScannerInterfaceImpl : public ::BleScannerInterface,
FilterConfigCallback cb) override;
void ScanFilterClear(int filter_index, FilterConfigCallback cb) override;
void ScanFilterEnable(bool enable, EnableCallback cb) override;
- void SetScanParameters(int scanner_id, int scan_interval, int scan_window,
+ void SetScanParameters(int scanner_id, std::vector<uint32_t> scan_interval,
+ std::vector<uint32_t> scan_window,
Callback cb) override;
void BatchscanConfigStorage(int client_if, int batch_scan_full_max,
int batch_scan_trunc_max,
@@ -64,6 +65,9 @@ class BleScannerInterfaceImpl : public ::BleScannerInterface,
void BatchscanReadReports(int client_if, int scan_mode) override;
void StartSync(uint8_t sid, RawAddress address, uint16_t skip,
uint16_t timeout, int reg_id) override;
+ void StartSync(uint8_t sid, RawAddress address, uint16_t skip,
+ uint16_t timeout, StartSyncCb start_cb, SyncReportCb report_cb,
+ SyncLostCb lost_cb) override;
void StopSync(uint16_t handle) override;
void CancelCreateSync(uint8_t sid, RawAddress address) override;
void TransferSync(RawAddress address, uint16_t service_data,
@@ -73,6 +77,13 @@ class BleScannerInterfaceImpl : public ::BleScannerInterface,
void SyncTxParameters(RawAddress addr, uint8_t mode, uint16_t skip,
uint16_t timeout, int reg_id) override;
+ void TransferSync(RawAddress address, uint16_t service_data,
+ uint16_t sync_handle, SyncTransferCb cb) override;
+ void TransferSetInfo(RawAddress address, uint16_t service_data,
+ uint8_t adv_handle, SyncTransferCb cb) override;
+ void SyncTxParameters(RawAddress addr, uint8_t mode, uint16_t skip,
+ uint16_t timeout, StartSyncCb start_cb) override;
+
// bluetooth::hci::ScanningCallback
void RegisterCallbacks(ScanningCallbacks* callbacks);
void OnScannerRegistered(const bluetooth::hci::Uuid app_uuid,
diff --git a/system/main/shim/btm_api.h b/system/main/shim/btm_api.h
index c1dd4be659..91dc6b6f14 100644
--- a/system/main/shim/btm_api.h
+++ b/system/main/shim/btm_api.h
@@ -1673,7 +1673,7 @@ tBTM_CONTRL_STATE BTM_PM_ReadControllerState(void);
* This function is called to set scan parameters. |cb| is called with operation
* status
**/
-void BTM_BleSetScanParams(uint32_t scan_interval, uint32_t scan_window,
+void BTM_BleSetScanParams(std::vector<uint32_t> scan_interval, std::vector<uint32_t> scan_window,
tBLE_SCAN_MODE scan_type,
base::Callback<void(uint8_t)> cb);
diff --git a/system/main/shim/le_advertising_manager.cc b/system/main/shim/le_advertising_manager.cc
index dc8f81a832..78a3806084 100644
--- a/system/main/shim/le_advertising_manager.cc
+++ b/system/main/shim/le_advertising_manager.cc
@@ -378,6 +378,12 @@ class BleAdvertiserInterfaceImpl : public BleAdvertiserInterface,
advertiser_id, address_type, raw_address));
}
+ void CreateBIG(int advertiser_id, CreateBIGParameters create_big_params,
+ CreateBIGCallback cb) {}
+
+ void TerminateBIG(int advertiser_id, int big_handle, int reason,
+ TerminateBIGCallback cb) {}
+
AdvertisingCallbacks* advertising_callbacks_;
private:
diff --git a/system/main/shim/le_scanning_manager.cc b/system/main/shim/le_scanning_manager.cc
index 18ba1eabb3..892a49eb78 100644
--- a/system/main/shim/le_scanning_manager.cc
+++ b/system/main/shim/le_scanning_manager.cc
@@ -240,11 +240,15 @@ void BleScannerInterfaceImpl::ScanFilterEnable(bool enable, EnableCallback cb) {
base::Bind(cb, action, btm_status_value(BTM_SUCCESS)));
}
+
/** Sets the LE scan interval and window in units of N*0.625 msec */
void BleScannerInterfaceImpl::SetScanParameters(int scanner_id,
- int scan_interval,
- int scan_window, Callback cb) {
+ std::vector<uint32_t> scan_interval,
+ std::vector<uint32_t> scan_window,
+ Callback cb) {
LOG(INFO) << __func__ << " in shim layer";
+ // TODO(b/233390764) Uncomment the following code.
+ /*
tBTM_BLE_INQ_CB* p_cb = &btm_cb.ble_ctr_cb.inq_var;
if (BTM_BLE_ISVALID_PARAM(scan_interval, BTM_BLE_SCAN_INT_MIN,
BTM_BLE_EXT_SCAN_INT_MAX) &&
@@ -254,6 +258,7 @@ void BleScannerInterfaceImpl::SetScanParameters(int scanner_id,
p_cb->scan_interval = scan_interval;
p_cb->scan_window = scan_window;
}
+ */
// use active scan
auto scan_type = static_cast<bluetooth::hci::LeScanType>(0x01);
@@ -327,6 +332,14 @@ void BleScannerInterfaceImpl::StartSync(uint8_t sid, RawAddress address,
sid, ToAddressWithType(address, address_type), skip, timeout, reg_id);
}
+void BleScannerInterfaceImpl::StartSync(uint8_t sid, RawAddress address,
+ uint16_t skip, uint16_t timeout,
+ StartSyncCb start_cb,
+ SyncReportCb report_cb,
+ SyncLostCb lost_cb) {
+ LOG(INFO) << __func__ << " in shim layer";
+}
+
void BleScannerInterfaceImpl::StopSync(uint16_t handle) {
LOG(INFO) << __func__ << " in shim layer";
bluetooth::shim::GetScanning()->StopSync(handle);
@@ -355,6 +368,13 @@ void BleScannerInterfaceImpl::TransferSync(RawAddress address,
ToGdAddress(address), service_data, sync_handle, pa_source);
}
+void BleScannerInterfaceImpl::TransferSync(RawAddress address,
+ uint16_t service_data,
+ uint16_t sync_handle,
+ SyncTransferCb cb) {
+ LOG(INFO) << __func__ << " in shim layer";
+}
+
void BleScannerInterfaceImpl::TransferSetInfo(RawAddress address,
uint16_t service_data,
uint8_t adv_handle,
@@ -372,6 +392,13 @@ void BleScannerInterfaceImpl::TransferSetInfo(RawAddress address,
ToGdAddress(address), service_data, adv_handle, pa_source);
}
+void BleScannerInterfaceImpl::TransferSetInfo(RawAddress address,
+ uint16_t service_data,
+ uint8_t adv_handle,
+ SyncTransferCb cb) {
+ LOG(INFO) << __func__ << " in shim layer";
+}
+
void BleScannerInterfaceImpl::SyncTxParameters(RawAddress addr, uint8_t mode,
uint16_t skip, uint16_t timeout,
int reg_id) {
@@ -380,6 +407,12 @@ void BleScannerInterfaceImpl::SyncTxParameters(RawAddress addr, uint8_t mode,
skip, timeout, reg_id);
}
+void BleScannerInterfaceImpl::SyncTxParameters(RawAddress addr, uint8_t mode,
+ uint16_t skip, uint16_t timeout,
+ StartSyncCb start_cb) {
+ LOG(INFO) << __func__ << " in shim layer";
+}
+
void BleScannerInterfaceImpl::RegisterCallbacks(ScanningCallbacks* callbacks) {
LOG(INFO) << __func__ << " in shim layer";
scanning_callbacks_ = callbacks;
diff --git a/system/osi/Android.bp b/system/osi/Android.bp
index bcbac81bb1..6e538d71ca 100644
--- a/system/osi/Android.bp
+++ b/system/osi/Android.bp
@@ -55,10 +55,6 @@ filegroup {
// libosi static library for target
cc_library_static {
name: "libosi",
- visibility:[
- "//packages/apps/Test/connectivity/sl4n",
- "//packages/modules/Bluetooth:__subpackages__",
- ],
defaults: ["fluoride_osi_defaults", "fluoride_basic_defaults"],
// TODO(mcchou): Remove socket_utils sources after platform specific
// dependencies are abstracted.
@@ -99,10 +95,7 @@ cc_library_static {
],
},
},
- min_sdk_version: "Tiramisu",
- apex_available: [
- "com.android.bluetooth",
- ],
+ min_sdk_version: "Tiramisu"
}
// libosi unit tests for target and host
diff --git a/system/packet/Android.bp b/system/packet/Android.bp
index 1033fc6a42..1a7d3be0da 100644
--- a/system/packet/Android.bp
+++ b/system/packet/Android.bp
@@ -20,6 +20,7 @@ cc_library_static {
"lib-bt-packets-avrcp",
],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
diff --git a/system/packet/avrcp/Android.bp b/system/packet/avrcp/Android.bp
index 2b52a75398..b5aedd5287 100644
--- a/system/packet/avrcp/Android.bp
+++ b/system/packet/avrcp/Android.bp
@@ -42,6 +42,7 @@ cc_library_static {
"lib-bt-packets-base",
],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
diff --git a/system/packet/base/Android.bp b/system/packet/base/Android.bp
index 268f47be03..f3a99f9bbf 100644
--- a/system/packet/base/Android.bp
+++ b/system/packet/base/Android.bp
@@ -19,6 +19,7 @@ cc_library_static {
"packet_builder.cc",
],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "30",
diff --git a/system/profile/avrcp/Android.bp b/system/profile/avrcp/Android.bp
index 72e9b1bb62..fb20f657b2 100644
--- a/system/profile/avrcp/Android.bp
+++ b/system/profile/avrcp/Android.bp
@@ -36,6 +36,7 @@ cc_library_static {
"liblog",
],
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth",
],
min_sdk_version: "Tiramisu"
diff --git a/system/service/common/Android.bp b/system/service/common/Android.bp
index b61e4ffba7..963dcd44f1 100644
--- a/system/service/common/Android.bp
+++ b/system/service/common/Android.bp
@@ -44,10 +44,6 @@ cc_library_static {
// Bluetooth Binder shared library
cc_library_static {
name: "libbluetooth-binder-common",
- visibility:[
- "//packages/apps/Test/connectivity/sl4n",
- "//packages/modules/Bluetooth:__subpackages__",
- ],
defaults: ["fluoride_defaults"],
cflags: [
/* we export all classes, so change default visibility, instead of having EXPORT_SYMBOL on each class*/
diff --git a/system/service/gatt_server_old.cc b/system/service/gatt_server_old.cc
index c4d3790e3b..8bb81e4297 100644
--- a/system/service/gatt_server_old.cc
+++ b/system/service/gatt_server_old.cc
@@ -424,6 +424,7 @@ const btgatt_server_callbacks_t gatt_server_callbacks = {
nullptr, /* mtu_changed_cb */
nullptr, /* phy_update_cb */
nullptr, /* conn_update_cb */
+ nullptr, /* subrate_chg_cb */
};
// TODO(eisenbach): Refactor GATT interface to not require servers
@@ -449,6 +450,7 @@ const btgatt_client_callbacks_t gatt_client_callbacks = {
nullptr, /* phy_update_cb */
nullptr, /* conn_update_cb */
nullptr, /* service_changed_cb*/
+ nullptr, /* subrate_chg_cb */
};
const btgatt_scanner_callbacks_t gatt_scanner_callbacks = {
diff --git a/system/service/hal/bluetooth_gatt_interface.cc b/system/service/hal/bluetooth_gatt_interface.cc
index 76cf5c9361..403786e507 100644
--- a/system/service/hal/bluetooth_gatt_interface.cc
+++ b/system/service/hal/bluetooth_gatt_interface.cc
@@ -410,6 +410,7 @@ const btgatt_client_callbacks_t gatt_client_callbacks = {
nullptr,
nullptr,
nullptr, // service_changed_cb
+ nullptr, // subrate_chg_cb
};
const btgatt_server_callbacks_t gatt_server_callbacks = {
@@ -429,6 +430,7 @@ const btgatt_server_callbacks_t gatt_server_callbacks = {
MtuChangedCallback,
nullptr,
nullptr,
+ nullptr,
};
const btgatt_callbacks_t gatt_callbacks = {
diff --git a/system/service/hal/fake_bluetooth_gatt_interface.cc b/system/service/hal/fake_bluetooth_gatt_interface.cc
index 8b77424167..eb3d8152e6 100644
--- a/system/service/hal/fake_bluetooth_gatt_interface.cc
+++ b/system/service/hal/fake_bluetooth_gatt_interface.cc
@@ -134,6 +134,7 @@ btgatt_client_interface_t fake_btgattc_iface = {
nullptr, // read_phy
nullptr, // test_command
nullptr, // get_gatt_db
+ nullptr, // subrate_request
};
btgatt_server_interface_t fake_btgatts_iface = {
diff --git a/system/service/test/low_energy_advertiser_unittest.cc b/system/service/test/low_energy_advertiser_unittest.cc
index aa6c07cc78..f46b80b2af 100644
--- a/system/service/test/low_energy_advertiser_unittest.cc
+++ b/system/service/test/low_energy_advertiser_unittest.cc
@@ -73,6 +73,13 @@ class MockAdvertiserHandler : public BleAdvertiserInterface {
void(int, std::vector<uint8_t>, StatusCallback));
MOCK_METHOD3(SetPeriodicAdvertisingEnable, void(int, bool, StatusCallback));
MOCK_METHOD1(RegisterCallbacks, void(AdvertisingCallbacks* callbacks));
+ MOCK_METHOD3(CreateBIG, void(int advertiser_id,
+ CreateBIGParameters create_big_params,
+ CreateBIGCallback cb));
+ MOCK_METHOD4(TerminateBIG, void(int advertiser_id,
+ int big_handle,
+ int reason,
+ TerminateBIGCallback cb));
};
class LowEnergyAdvertiserTest : public ::testing::Test {
diff --git a/system/service/test/low_energy_scanner_unittest.cc b/system/service/test/low_energy_scanner_unittest.cc
index efeae0de34..21d5409a48 100644
--- a/system/service/test/low_energy_scanner_unittest.cc
+++ b/system/service/test/low_energy_scanner_unittest.cc
@@ -53,8 +53,8 @@ class MockScannerHandler : public BleScannerInterface {
FilterParamSetupCallback cb));
MOCK_METHOD2(ScanFilterClear, void(int filt_index, FilterConfigCallback cb));
MOCK_METHOD2(ScanFilterEnable, void(bool enable, EnableCallback cb));
- MOCK_METHOD4(SetScanParameters, void(int scanner_id, int scan_interval,
- int scan_window, Callback cb));
+ MOCK_METHOD4(SetScanParameters, void(int scanner_id, std::vector<uint32_t> scan_interval,
+ std::vector<uint32_t> scan_window, Callback cb));
MOCK_METHOD5(BatchscanConfigStorage,
void(int client_if, int batch_scan_full_max,
@@ -70,6 +70,8 @@ class MockScannerHandler : public BleScannerInterface {
MOCK_METHOD2(BatchscanReadReports, void(int client_if, int scan_mode));
MOCK_METHOD5(StartSync, void(uint8_t, RawAddress, uint16_t, uint16_t, int));
+ MOCK_METHOD7(StartSync, void(uint8_t, RawAddress, uint16_t, uint16_t,
+ StartSyncCb, SyncReportCb, SyncLostCb));
MOCK_METHOD1(StopSync, void(uint16_t));
MOCK_METHOD1(RegisterCallbacks, void(ScanningCallbacks* callbacks));
@@ -83,6 +85,13 @@ class MockScannerHandler : public BleScannerInterface {
MOCK_METHOD5(SyncTxParameters,
void(RawAddress, uint8_t, uint16_t, uint16_t, int));
+ MOCK_METHOD4(TransferSync,
+ void(RawAddress, uint16_t, uint16_t, SyncTransferCb));
+ MOCK_METHOD4(TransferSetInfo,
+ void(RawAddress, uint16_t, uint8_t, SyncTransferCb));
+ MOCK_METHOD5(SyncTxParameters,
+ void(RawAddress, uint8_t, uint16_t, uint16_t, StartSyncCb));
+
void ScanFilterAdd(int filter_index, std::vector<ApcfCommand> filters,
FilterConfigCallback cb) override{};
diff --git a/system/stack/a2dp/a2dp_aac.cc b/system/stack/a2dp/a2dp_aac.cc
index 87e9cb40d0..5b95c9ccb5 100644
--- a/system/stack/a2dp/a2dp_aac.cc
+++ b/system/stack/a2dp/a2dp_aac.cc
@@ -886,6 +886,8 @@ static bool select_audio_sample_rate(
case BTAV_A2DP_CODEC_SAMPLE_RATE_192000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_16000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_24000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_32000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_8000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_NONE:
break;
}
@@ -1120,6 +1122,8 @@ bool A2dpCodecConfigAacBase::setCodecConfig(const uint8_t* p_peer_codec_info,
case BTAV_A2DP_CODEC_SAMPLE_RATE_192000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_16000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_24000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_32000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_8000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_NONE:
codec_capability_.sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_NONE;
codec_config_.sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_NONE;
diff --git a/system/stack/a2dp/a2dp_sbc.cc b/system/stack/a2dp/a2dp_sbc.cc
index c5d5a15735..4c47c55aaf 100644
--- a/system/stack/a2dp/a2dp_sbc.cc
+++ b/system/stack/a2dp/a2dp_sbc.cc
@@ -952,6 +952,8 @@ static bool select_audio_sample_rate(
case BTAV_A2DP_CODEC_SAMPLE_RATE_192000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_16000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_24000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_32000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_8000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_NONE:
break;
}
@@ -1151,6 +1153,8 @@ bool A2dpCodecConfigSbcBase::setCodecConfig(const uint8_t* p_peer_codec_info,
case BTAV_A2DP_CODEC_SAMPLE_RATE_192000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_16000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_24000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_32000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_8000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_NONE:
codec_capability_.sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_NONE;
codec_config_.sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_NONE;
diff --git a/system/stack/a2dp/a2dp_vendor.cc b/system/stack/a2dp/a2dp_vendor.cc
index 759fc43134..2ac15c3cc7 100644
--- a/system/stack/a2dp/a2dp_vendor.cc
+++ b/system/stack/a2dp/a2dp_vendor.cc
@@ -592,6 +592,8 @@ const char* A2DP_VendorCodecIndexStr(btav_a2dp_codec_index_t codec_index) {
case BTAV_A2DP_CODEC_INDEX_SINK_SBC:
case BTAV_A2DP_CODEC_INDEX_SOURCE_AAC:
case BTAV_A2DP_CODEC_INDEX_SINK_AAC:
+ case BTAV_A2DP_CODEC_INDEX_SOURCE_MAX:
+ case BTAV_A2DP_CODEC_INDEX_SOURCE_APTX_TWS:
break; // These are not vendor-specific codecs
case BTAV_A2DP_CODEC_INDEX_SOURCE_APTX:
return A2DP_VendorCodecIndexStrAptx();
@@ -603,6 +605,7 @@ const char* A2DP_VendorCodecIndexStr(btav_a2dp_codec_index_t codec_index) {
return A2DP_VendorCodecIndexStrLdacSink();
// Add a switch statement for each vendor-specific codec
case BTAV_A2DP_CODEC_INDEX_MAX:
+ case BTAV_A2DP_CODEC_INDEX_SOURCE_LC3:
break;
}
@@ -617,6 +620,8 @@ bool A2DP_VendorInitCodecConfig(btav_a2dp_codec_index_t codec_index,
case BTAV_A2DP_CODEC_INDEX_SINK_SBC:
case BTAV_A2DP_CODEC_INDEX_SOURCE_AAC:
case BTAV_A2DP_CODEC_INDEX_SINK_AAC:
+ case BTAV_A2DP_CODEC_INDEX_SOURCE_MAX:
+ case BTAV_A2DP_CODEC_INDEX_SOURCE_APTX_TWS:
break; // These are not vendor-specific codecs
case BTAV_A2DP_CODEC_INDEX_SOURCE_APTX:
return A2DP_VendorInitCodecConfigAptx(p_cfg);
@@ -628,6 +633,7 @@ bool A2DP_VendorInitCodecConfig(btav_a2dp_codec_index_t codec_index,
return A2DP_VendorInitCodecConfigLdacSink(p_cfg);
// Add a switch statement for each vendor-specific codec
case BTAV_A2DP_CODEC_INDEX_MAX:
+ case BTAV_A2DP_CODEC_INDEX_SOURCE_LC3:
break;
}
diff --git a/system/stack/a2dp/a2dp_vendor_aptx.cc b/system/stack/a2dp/a2dp_vendor_aptx.cc
index e4dae75119..863c623c29 100644
--- a/system/stack/a2dp/a2dp_vendor_aptx.cc
+++ b/system/stack/a2dp/a2dp_vendor_aptx.cc
@@ -522,6 +522,8 @@ static bool select_audio_sample_rate(
case BTAV_A2DP_CODEC_SAMPLE_RATE_192000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_16000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_24000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_32000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_8000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_NONE:
break;
}
@@ -677,6 +679,8 @@ bool A2dpCodecConfigAptx::setCodecConfig(const uint8_t* p_peer_codec_info,
case BTAV_A2DP_CODEC_SAMPLE_RATE_192000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_16000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_24000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_32000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_8000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_NONE:
codec_capability_.sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_NONE;
codec_config_.sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_NONE;
diff --git a/system/stack/a2dp/a2dp_vendor_aptx_hd.cc b/system/stack/a2dp/a2dp_vendor_aptx_hd.cc
index 3a4bba21d6..6dbb83f0d8 100644
--- a/system/stack/a2dp/a2dp_vendor_aptx_hd.cc
+++ b/system/stack/a2dp/a2dp_vendor_aptx_hd.cc
@@ -540,6 +540,8 @@ static bool select_audio_sample_rate(
case BTAV_A2DP_CODEC_SAMPLE_RATE_192000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_16000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_24000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_32000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_8000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_NONE:
break;
}
@@ -695,6 +697,8 @@ bool A2dpCodecConfigAptxHd::setCodecConfig(const uint8_t* p_peer_codec_info,
case BTAV_A2DP_CODEC_SAMPLE_RATE_192000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_16000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_24000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_32000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_8000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_NONE:
codec_capability_.sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_NONE;
codec_config_.sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_NONE;
diff --git a/system/stack/a2dp/a2dp_vendor_ldac.cc b/system/stack/a2dp/a2dp_vendor_ldac.cc
index b6aaee59f2..ec496e9eff 100644
--- a/system/stack/a2dp/a2dp_vendor_ldac.cc
+++ b/system/stack/a2dp/a2dp_vendor_ldac.cc
@@ -807,6 +807,8 @@ static bool select_audio_sample_rate(
break;
case BTAV_A2DP_CODEC_SAMPLE_RATE_16000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_24000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_32000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_8000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_NONE:
break;
}
@@ -1033,6 +1035,8 @@ bool A2dpCodecConfigLdacBase::setCodecConfig(const uint8_t* p_peer_codec_info,
break;
case BTAV_A2DP_CODEC_SAMPLE_RATE_16000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_24000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_32000:
+ case BTAV_A2DP_CODEC_SAMPLE_RATE_8000:
case BTAV_A2DP_CODEC_SAMPLE_RATE_NONE:
codec_capability_.sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_NONE;
codec_config_.sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_NONE;
diff --git a/system/stack/btm/btm_ble_gap.cc b/system/stack/btm/btm_ble_gap.cc
index 76f6c6f62c..d87962f489 100644
--- a/system/stack/btm/btm_ble_gap.cc
+++ b/system/stack/btm/btm_ble_gap.cc
@@ -1569,13 +1569,20 @@ static uint8_t btm_set_conn_mode_adv_init_addr(
* This function is called to set scan parameters. |cb| is called with operation
* status
**/
-void BTM_BleSetScanParams(uint32_t scan_interval, uint32_t scan_window,
+void BTM_BleSetScanParams(std::vector<uint32_t> scan_interval, std::vector<uint32_t> scan_window,
tBLE_SCAN_MODE scan_mode,
base::Callback<void(uint8_t)> cb) {
if (!controller_get_interface()->supports_ble()) {
LOG_INFO("Controller does not support ble");
return;
}
+
+ //BUG(b/)
+ if (scan_interval.size() == 0 || scan_window.size() == 0) {
+ LOG_INFO("Empty scan interval or window");
+ return;
+ }
+ auto first_scan_interval = scan_interval.front(), first_scan_window = scan_window.front();
uint32_t max_scan_interval = BTM_BLE_EXT_SCAN_INT_MAX;
uint32_t max_scan_window = BTM_BLE_EXT_SCAN_WIN_MAX;
@@ -1585,21 +1592,21 @@ void BTM_BleSetScanParams(uint32_t scan_interval, uint32_t scan_window,
}
tBTM_BLE_INQ_CB* p_cb = &btm_cb.ble_ctr_cb.inq_var;
- if (BTM_BLE_ISVALID_PARAM(scan_interval, BTM_BLE_SCAN_INT_MIN,
+ if (BTM_BLE_ISVALID_PARAM(first_scan_interval, BTM_BLE_SCAN_INT_MIN,
max_scan_interval) &&
- BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN,
+ BTM_BLE_ISVALID_PARAM(first_scan_window, BTM_BLE_SCAN_WIN_MIN,
max_scan_window) &&
(scan_mode == BTM_BLE_SCAN_MODE_ACTI ||
scan_mode == BTM_BLE_SCAN_MODE_PASS)) {
p_cb->scan_type = scan_mode;
- p_cb->scan_interval = scan_interval;
- p_cb->scan_window = scan_window;
+ p_cb->scan_interval = first_scan_interval;
+ p_cb->scan_window = first_scan_window;
cb.Run(BTM_SUCCESS);
} else {
cb.Run(BTM_ILLEGAL_VALUE);
LOG_WARN("Illegal params: scan_interval = %d scan_window = %d",
- scan_interval, scan_window);
+ first_scan_interval, first_scan_window);
}
}
diff --git a/system/stack/include/btm_ble_api.h b/system/stack/include/btm_ble_api.h
index e19268081a..c70b32908b 100644
--- a/system/stack/include/btm_ble_api.h
+++ b/system/stack/include/btm_ble_api.h
@@ -82,7 +82,7 @@ extern void BTM_SecAddBleKey(const RawAddress& bd_addr,
* This function is called to set scan parameters. |cb| is called with operation
* status
**/
-extern void BTM_BleSetScanParams(uint32_t scan_interval, uint32_t scan_window,
+extern void BTM_BleSetScanParams(std::vector<uint32_t> scan_interval, std::vector<uint32_t> scan_window,
tBLE_SCAN_MODE scan_type,
base::Callback<void(uint8_t)> cb);
diff --git a/system/stack/test/stack_a2dp_test.cc b/system/stack/test/stack_a2dp_test.cc
index 71526e7c3a..3bfb1b9c1b 100644
--- a/system/stack/test/stack_a2dp_test.cc
+++ b/system/stack/test/stack_a2dp_test.cc
@@ -264,6 +264,9 @@ class StackA2dpTest : public ::testing::Test {
// shared library installed.
supported = has_shared_library(LDAC_DECODER_LIB_NAME);
break;
+ case BTAV_A2DP_CODEC_INDEX_SOURCE_MAX:
+ case BTAV_A2DP_CODEC_INDEX_SOURCE_APTX_TWS:
+ case BTAV_A2DP_CODEC_INDEX_SOURCE_LC3:
case BTAV_A2DP_CODEC_INDEX_MAX:
// Needed to avoid using "default:" case so we can capture when
// a new codec is added, and it can be included here.
diff --git a/system/test/mock/mock_stack_btm_ble_gap.cc b/system/test/mock/mock_stack_btm_ble_gap.cc
index 6b07d03411..c3c8d0942d 100644
--- a/system/test/mock/mock_stack_btm_ble_gap.cc
+++ b/system/test/mock/mock_stack_btm_ble_gap.cc
@@ -144,7 +144,7 @@ void BTM_BleGetDynamicAudioBuffer(
void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB* p_cmn_vsc_cb) {
mock_function_count_map[__func__]++;
}
-void BTM_BleSetScanParams(uint32_t scan_interval, uint32_t scan_window,
+void BTM_BleSetScanParams(std::vector<uint32_t> scan_interval, std::vector<uint32_t> scan_window,
tBLE_SCAN_MODE scan_mode,
base::Callback<void(uint8_t)> cb) {
mock_function_count_map[__func__]++;
diff --git a/system/test/rootcanal/Android.bp b/system/test/rootcanal/Android.bp
index 38a6cdd5f1..fcbbd6df80 100644
--- a/system/test/rootcanal/Android.bp
+++ b/system/test/rootcanal/Android.bp
@@ -34,9 +34,7 @@ cc_binary {
"bluetooth_hci.cc",
"service.cc",
],
- visibility: [
- "//platform_testing/libraries/sts-common-util/host-side/rootcanal"
- ],
+
header_libs: ["libbluetooth_headers"],
shared_libs: [
"android.hardware.bluetooth@1.0",
@@ -90,9 +88,7 @@ cc_library_shared {
srcs: [
"bluetooth_hci.cc",
],
- visibility: [
- "//platform_testing/libraries/sts-common-util/host-side/rootcanal"
- ],
+
header_libs: ["libbluetooth_headers"],
shared_libs: [
"android.hardware.bluetooth@1.0",
diff --git a/system/types/Android.bp b/system/types/Android.bp
index 2009df6f15..ac6ba8ce79 100644
--- a/system/types/Android.bp
+++ b/system/types/Android.bp
@@ -10,7 +10,6 @@ package {
cc_library_headers {
name: "libbluetooth-types-header",
- visibility:["//visibility:public"],
export_include_dirs: ["./"],
vendor_available: true,
host_supported: true,
@@ -34,7 +33,6 @@ cc_library_static {
/* we export all classes, so change default visibility, instead of having EXPORT_SYMBOL on each class*/
"-fvisibility=default",
],
- visibility:["//visibility:public"],
host_supported: true,
srcs: [
"class_of_device.cc",
diff --git a/system/vendor_libs/Android.bp b/system/vendor_libs/Android.bp
index 1239ba85c6..768fba2581 100644
--- a/system/vendor_libs/Android.bp
+++ b/system/vendor_libs/Android.bp
@@ -5,10 +5,6 @@ package {
// to get the below license kinds:
// SPDX-license-identifier-Apache-2.0
default_applicable_licenses: ["system_bt_license"],
- default_visibility: [
- "//device:__subpackages__",
- "//packages/modules/Bluetooth:__subpackages__",
- ],
}
subdirs = [