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

Commit 2469ec18 authored by Jack He's avatar Jack He Committed by Automerger Merge Worker
Browse files

Merge "Fix NPE of mAdvertiseCallbacksObj in JNI thread" into tm-dev am:...

Merge "Fix NPE of mAdvertiseCallbacksObj in JNI thread" into tm-dev am: 56651713 am: ed66b4e0 am: 53b2f4dc

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/modules/Bluetooth/+/18404733



Change-Id: If41dc095440f280c510ff91bf428b76e31c0bcf0
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 93ef57b1 53b2f4dc
Loading
Loading
Loading
Loading
+27 −14
Original line number Diff line number Diff line
@@ -16,17 +16,18 @@

#define LOG_TAG "BtGatt.JNI"

#include "com_android_bluetooth.h"
#include "hardware/bt_gatt.h"
#include "utils/Log.h"

#include <base/bind.h>
#include <base/callback.h>
#include <cutils/log.h>
#include <string.h>

#include <array>
#include <memory>
#include <shared_mutex>

#include <cutils/log.h>
#include "com_android_bluetooth.h"
#include "hardware/bt_gatt.h"
#include "utils/Log.h"
#define info(fmt, ...) ALOGI("%s(L%d): " fmt, __func__, __LINE__, ##__VA_ARGS__)
#define debug(fmt, ...) \
  ALOGD("%s(L%d): " fmt, __func__, __LINE__, ##__VA_ARGS__)
@@ -191,6 +192,7 @@ static const btgatt_interface_t* sGattIf = NULL;
static jobject mCallbacksObj = NULL;
static jobject mAdvertiseCallbacksObj = NULL;
static jobject mPeriodicScanCallbacksObj = NULL;
static std::shared_mutex callbacks_mutex;

/**
 * BTA client callbacks
@@ -802,8 +804,9 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {

  void OnAdvertisingSetStarted(int reg_id, uint8_t advertiser_id,
                               int8_t tx_power, uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onAdvertisingSetStarted, reg_id,
                                 advertiser_id, tx_power, status);
@@ -811,24 +814,27 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {

  void OnAdvertisingEnabled(uint8_t advertiser_id, bool enable,
                            uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onAdvertisingEnabled, advertiser_id,
                                 enable, status);
  }

  void OnAdvertisingDataSet(uint8_t advertiser_id, uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onAdvertisingDataSet, advertiser_id,
                                 status);
  }

  void OnScanResponseDataSet(uint8_t advertiser_id, uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onScanResponseDataSet, advertiser_id,
                                 status);
@@ -836,8 +842,9 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {

  void OnAdvertisingParametersUpdated(uint8_t advertiser_id, int8_t tx_power,
                                      uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onAdvertisingParametersUpdated,
                                 advertiser_id, tx_power, status);
@@ -845,16 +852,18 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {

  void OnPeriodicAdvertisingParametersUpdated(uint8_t advertiser_id,
                                              uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onPeriodicAdvertisingParametersUpdated,
                                 advertiser_id, status);
  }

  void OnPeriodicAdvertisingDataSet(uint8_t advertiser_id, uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onPeriodicAdvertisingDataSet,
                                 advertiser_id, status);
@@ -862,8 +871,9 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {

  void OnPeriodicAdvertisingEnabled(uint8_t advertiser_id, bool enable,
                                    uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onPeriodicAdvertisingEnabled,
                                 advertiser_id, enable, status);
@@ -871,8 +881,9 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {

  void OnOwnAddressRead(uint8_t advertiser_id, uint8_t address_type,
                        RawAddress address) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;

    ScopedLocalRef<jstring> addr(sCallbackEnv.get(),
                                 bdaddr2newjstr(sCallbackEnv.get(), &address));
@@ -1998,6 +2009,7 @@ static void advertiseClassInitNative(JNIEnv* env, jclass clazz) {
}

static void advertiseInitializeNative(JNIEnv* env, jobject object) {
  std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
  if (mAdvertiseCallbacksObj != NULL) {
    ALOGW("Cleaning up Advertise callback object");
    env->DeleteGlobalRef(mAdvertiseCallbacksObj);
@@ -2008,6 +2020,7 @@ static void advertiseInitializeNative(JNIEnv* env, jobject object) {
}

static void advertiseCleanupNative(JNIEnv* env, jobject object) {
  std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
  if (mAdvertiseCallbacksObj != NULL) {
    env->DeleteGlobalRef(mAdvertiseCallbacksObj);
    mAdvertiseCallbacksObj = NULL;