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

Commit 237dc23f authored by Jakub Pawłowski's avatar Jakub Pawłowski Committed by Gerrit Code Review
Browse files

Merge "Wire Encryption Change event to Java" into main

parents dcfef627 68c04334
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -864,6 +893,7 @@ static bt_callbacks_t sBluetoothCallbacks = {
        switch_codec_callback,
        le_rand_callback,
        key_missing_callback,
        encryption_change_callback,
};

class JNIThreadAttacher {
@@ -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);

+11 −0
Original line number Diff line number Diff line
@@ -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);
    }
+30 −0
Original line number Diff line number Diff line
@@ -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(
+8 −0
Original line number Diff line number Diff line
@@ -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;
+3 −0
Original line number Diff line number Diff line
@@ -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"
@@ -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 */
@@ -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