Loading android/app/jni/com_android_bluetooth_btservice_AdapterService.cpp +31 −0 Original line number Diff line number Diff line Loading @@ -100,6 +100,7 @@ static jmethodID method_acquireWakeLock; static jmethodID method_releaseWakeLock; static jmethodID method_energyInfo; static jmethodID method_keyMissingCallback; static jmethodID method_encryptionChangeCallback; static struct { jclass clazz; Loading Loading @@ -776,6 +777,34 @@ static void key_missing_callback(const RawAddress bd_addr) { sCallbackEnv->CallVoidMethod(sJniCallbacksObj, method_keyMissingCallback, addr.get()); } static void encryption_change_callback(const bt_encryption_change_evt encryption_change) { std::shared_lock<std::shared_timed_mutex> lock(jniObjMutex); if (!sJniCallbacksObj) { log::error("JNI obj is null. Failed to call JNI callback"); return; } CallbackEnv sCallbackEnv(__func__); if (!sCallbackEnv.valid()) { return; } ScopedLocalRef<jbyteArray> addr(sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { log::error("Address allocation failed"); return; } sCallbackEnv->SetByteArrayRegion( addr.get(), 0, sizeof(RawAddress), reinterpret_cast<jbyte*>(const_cast<RawAddress*>(&encryption_change.bd_addr))); sCallbackEnv->CallVoidMethod(sJniCallbacksObj, method_encryptionChangeCallback, addr.get(), encryption_change.status, encryption_change.encr_enable, encryption_change.transport, encryption_change.secure_connections, encryption_change.key_size); } static void callback_thread_event(bt_cb_thread_evt event) { if (event == ASSOCIATE_JVM) { JavaVMAttachArgs args; Loading Loading @@ -864,6 +893,7 @@ static bt_callbacks_t sBluetoothCallbacks = { switch_codec_callback, le_rand_callback, key_missing_callback, encryption_change_callback, }; class JNIThreadAttacher { Loading Loading @@ -2321,6 +2351,7 @@ int register_com_android_bluetooth_btservice_AdapterService(JNIEnv* env) { {"releaseWakeLock", "(Ljava/lang/String;)Z", &method_releaseWakeLock}, {"energyInfoCallback", "(IIJJJJ[Landroid/bluetooth/UidTraffic;)V", &method_energyInfo}, {"keyMissingCallback", "([B)V", &method_keyMissingCallback}, {"encryptionChangeCallback", "([BIZIZI)V", &method_encryptionChangeCallback}, }; GET_JAVA_METHODS(env, "com/android/bluetooth/btservice/JniCallbacks", javaMethods); Loading android/app/src/com/android/bluetooth/btservice/JniCallbacks.java +11 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,17 @@ class JniCallbacks { mRemoteDevices.keyMissingCallback(address); } void encryptionChangeCallback( byte[] address, int status, boolean encryptionEnable, int transport, boolean secureConnection, int keySize) { mRemoteDevices.encryptionChangeCallback( address, status, encryptionEnable, transport, secureConnection, keySize); } void stateChangeCallback(int status) { mAdapterService.stateChangeCallback(status); } Loading android/app/src/com/android/bluetooth/btservice/RemoteDevices.java +30 −0 Original line number Diff line number Diff line Loading @@ -1398,6 +1398,36 @@ public class RemoteDevices { } } void encryptionChangeCallback( byte[] address, int status, boolean encryptionEnable, int transport, boolean secureConnection, int keySize) { BluetoothDevice bluetoothDevice = getDevice(address); if (bluetoothDevice == null) { errorLog( "encryptionChangeCallback: device is NULL, address=" + Utils.getRedactedAddressStringFromByte(address)); return; } Log.d( TAG, "encryptionChangeCallback device: " + bluetoothDevice + ", status: " + status + ", enabled: " + encryptionEnable + ", transport: " + transport + ", secureConnection: " + secureConnection + ", keySize: " + keySize); } void fetchUuids(BluetoothDevice device, int transport) { if (mSdpTracker.contains(device)) { debugLog( Loading system/bta/dm/bta_dm_sec.cc +8 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,14 @@ void bta_dm_sec_enable(tBTA_DM_SEC_CBACK* p_sec_cback) { } } void bta_dm_on_encryption_change(bt_encryption_change_evt encryption_change) { if (bta_dm_sec_cb.p_sec_cback) { tBTA_DM_SEC sec_event; sec_event.encryption_change = encryption_change; bta_dm_sec_cb.p_sec_cback(BTA_DM_ENCRYPTION_CHANGE_EVT, &sec_event); } } void bta_dm_remote_key_missing(const RawAddress bd_addr) { if (bta_dm_sec_cb.p_sec_cback) { tBTA_DM_SEC sec_event; Loading system/bta/include/bta_sec_api.h +3 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <cstdint> #include "bta/include/bta_api_data_types.h" #include "include/hardware/bluetooth.h" #include "stack/include/bt_device_type.h" #include "stack/include/bt_name.h" #include "stack/include/bt_octets.h" Loading Loading @@ -67,6 +68,7 @@ typedef enum : uint8_t { BTA_DM_LE_ADDR_ASSOC_EVT = 33, /* identity address association event */ BTA_DM_SIRK_VERIFICATION_REQ_EVT = 35, BTA_DM_KEY_MISSING_EVT = 36, BTA_DM_ENCRYPTION_CHANGE_EVT = 37, } tBTA_DM_SEC_EVT; /* Structure associated with BTA_DM_PIN_REQ_EVT */ Loading Loading @@ -236,6 +238,7 @@ typedef union { tBTA_DM_RC_UNPAIR delete_key_RC_to_unpair; tBTA_DM_PROC_ID_ADDR proc_id_addr; /* Identity address event */ tBTA_DM_KEY_MISSING key_missing; bt_encryption_change_evt encryption_change; } tBTA_DM_SEC; /* Security callback */ Loading Loading
android/app/jni/com_android_bluetooth_btservice_AdapterService.cpp +31 −0 Original line number Diff line number Diff line Loading @@ -100,6 +100,7 @@ static jmethodID method_acquireWakeLock; static jmethodID method_releaseWakeLock; static jmethodID method_energyInfo; static jmethodID method_keyMissingCallback; static jmethodID method_encryptionChangeCallback; static struct { jclass clazz; Loading Loading @@ -776,6 +777,34 @@ static void key_missing_callback(const RawAddress bd_addr) { sCallbackEnv->CallVoidMethod(sJniCallbacksObj, method_keyMissingCallback, addr.get()); } static void encryption_change_callback(const bt_encryption_change_evt encryption_change) { std::shared_lock<std::shared_timed_mutex> lock(jniObjMutex); if (!sJniCallbacksObj) { log::error("JNI obj is null. Failed to call JNI callback"); return; } CallbackEnv sCallbackEnv(__func__); if (!sCallbackEnv.valid()) { return; } ScopedLocalRef<jbyteArray> addr(sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { log::error("Address allocation failed"); return; } sCallbackEnv->SetByteArrayRegion( addr.get(), 0, sizeof(RawAddress), reinterpret_cast<jbyte*>(const_cast<RawAddress*>(&encryption_change.bd_addr))); sCallbackEnv->CallVoidMethod(sJniCallbacksObj, method_encryptionChangeCallback, addr.get(), encryption_change.status, encryption_change.encr_enable, encryption_change.transport, encryption_change.secure_connections, encryption_change.key_size); } static void callback_thread_event(bt_cb_thread_evt event) { if (event == ASSOCIATE_JVM) { JavaVMAttachArgs args; Loading Loading @@ -864,6 +893,7 @@ static bt_callbacks_t sBluetoothCallbacks = { switch_codec_callback, le_rand_callback, key_missing_callback, encryption_change_callback, }; class JNIThreadAttacher { Loading Loading @@ -2321,6 +2351,7 @@ int register_com_android_bluetooth_btservice_AdapterService(JNIEnv* env) { {"releaseWakeLock", "(Ljava/lang/String;)Z", &method_releaseWakeLock}, {"energyInfoCallback", "(IIJJJJ[Landroid/bluetooth/UidTraffic;)V", &method_energyInfo}, {"keyMissingCallback", "([B)V", &method_keyMissingCallback}, {"encryptionChangeCallback", "([BIZIZI)V", &method_encryptionChangeCallback}, }; GET_JAVA_METHODS(env, "com/android/bluetooth/btservice/JniCallbacks", javaMethods); Loading
android/app/src/com/android/bluetooth/btservice/JniCallbacks.java +11 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,17 @@ class JniCallbacks { mRemoteDevices.keyMissingCallback(address); } void encryptionChangeCallback( byte[] address, int status, boolean encryptionEnable, int transport, boolean secureConnection, int keySize) { mRemoteDevices.encryptionChangeCallback( address, status, encryptionEnable, transport, secureConnection, keySize); } void stateChangeCallback(int status) { mAdapterService.stateChangeCallback(status); } Loading
android/app/src/com/android/bluetooth/btservice/RemoteDevices.java +30 −0 Original line number Diff line number Diff line Loading @@ -1398,6 +1398,36 @@ public class RemoteDevices { } } void encryptionChangeCallback( byte[] address, int status, boolean encryptionEnable, int transport, boolean secureConnection, int keySize) { BluetoothDevice bluetoothDevice = getDevice(address); if (bluetoothDevice == null) { errorLog( "encryptionChangeCallback: device is NULL, address=" + Utils.getRedactedAddressStringFromByte(address)); return; } Log.d( TAG, "encryptionChangeCallback device: " + bluetoothDevice + ", status: " + status + ", enabled: " + encryptionEnable + ", transport: " + transport + ", secureConnection: " + secureConnection + ", keySize: " + keySize); } void fetchUuids(BluetoothDevice device, int transport) { if (mSdpTracker.contains(device)) { debugLog( Loading
system/bta/dm/bta_dm_sec.cc +8 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,14 @@ void bta_dm_sec_enable(tBTA_DM_SEC_CBACK* p_sec_cback) { } } void bta_dm_on_encryption_change(bt_encryption_change_evt encryption_change) { if (bta_dm_sec_cb.p_sec_cback) { tBTA_DM_SEC sec_event; sec_event.encryption_change = encryption_change; bta_dm_sec_cb.p_sec_cback(BTA_DM_ENCRYPTION_CHANGE_EVT, &sec_event); } } void bta_dm_remote_key_missing(const RawAddress bd_addr) { if (bta_dm_sec_cb.p_sec_cback) { tBTA_DM_SEC sec_event; Loading
system/bta/include/bta_sec_api.h +3 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <cstdint> #include "bta/include/bta_api_data_types.h" #include "include/hardware/bluetooth.h" #include "stack/include/bt_device_type.h" #include "stack/include/bt_name.h" #include "stack/include/bt_octets.h" Loading Loading @@ -67,6 +68,7 @@ typedef enum : uint8_t { BTA_DM_LE_ADDR_ASSOC_EVT = 33, /* identity address association event */ BTA_DM_SIRK_VERIFICATION_REQ_EVT = 35, BTA_DM_KEY_MISSING_EVT = 36, BTA_DM_ENCRYPTION_CHANGE_EVT = 37, } tBTA_DM_SEC_EVT; /* Structure associated with BTA_DM_PIN_REQ_EVT */ Loading Loading @@ -236,6 +238,7 @@ typedef union { tBTA_DM_RC_UNPAIR delete_key_RC_to_unpair; tBTA_DM_PROC_ID_ADDR proc_id_addr; /* Identity address event */ tBTA_DM_KEY_MISSING key_missing; bt_encryption_change_evt encryption_change; } tBTA_DM_SEC; /* Security callback */ Loading