diff options
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, ¶ms); } +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 = [ |