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

Commit de70e509 authored by Chienyuan's avatar Chienyuan
Browse files

Refactor scanning callback mechanism in JNI layer for GD

Tag: #refactor
Bug: 169390539
Test: gd/cert/run --host
Change-Id: I1fbdd6350e5463097bd7e787ae41d730314ec60f
parent 9ca6c0ed
Loading
Loading
Loading
Loading
+92 −1
Original line number Diff line number Diff line
@@ -863,6 +863,96 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {
  }
};

class JniScanningCallbacks : ScanningCallbacks {
 public:
  static ScanningCallbacks* GetInstance() {
    static ScanningCallbacks* instance = new JniScanningCallbacks();
    return instance;
  }

  void OnScannerRegistered(const Uuid app_uuid, uint8_t scannerId,
                           uint8_t status) {
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScannerRegistered,
                                 status, scannerId, UUID_PARAMS(app_uuid));
  }

  void OnScanResult(uint16_t event_type, uint8_t addr_type, RawAddress* bda,
                    uint8_t primary_phy, uint8_t secondary_phy,
                    uint8_t advertising_sid, int8_t tx_power, int8_t rssi,
                    uint16_t periodic_adv_int, std::vector<uint8_t> adv_data) {
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;

    ScopedLocalRef<jstring> address(sCallbackEnv.get(),
                                    bdaddr2newjstr(sCallbackEnv.get(), bda));
    ScopedLocalRef<jbyteArray> jb(sCallbackEnv.get(),
                                  sCallbackEnv->NewByteArray(adv_data.size()));
    sCallbackEnv->SetByteArrayRegion(jb.get(), 0, adv_data.size(),
                                     (jbyte*)adv_data.data());

    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScanResult, event_type,
                                 addr_type, address.get(), primary_phy,
                                 secondary_phy, advertising_sid, tx_power, rssi,
                                 periodic_adv_int, jb.get());
  }

  void OnTrackAdvFoundLost(btgatt_track_adv_info_t* p_adv_track_info) {
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;

    ScopedLocalRef<jstring> address(
        sCallbackEnv.get(),
        bdaddr2newjstr(sCallbackEnv.get(), &p_adv_track_info->bd_addr));

    ScopedLocalRef<jbyteArray> jb_adv_pkt(
        sCallbackEnv.get(),
        sCallbackEnv->NewByteArray(p_adv_track_info->adv_pkt_len));
    ScopedLocalRef<jbyteArray> jb_scan_rsp(
        sCallbackEnv.get(),
        sCallbackEnv->NewByteArray(p_adv_track_info->scan_rsp_len));

    sCallbackEnv->SetByteArrayRegion(jb_adv_pkt.get(), 0,
                                     p_adv_track_info->adv_pkt_len,
                                     (jbyte*)p_adv_track_info->p_adv_pkt_data);

    sCallbackEnv->SetByteArrayRegion(jb_scan_rsp.get(), 0,
                                     p_adv_track_info->scan_rsp_len,
                                     (jbyte*)p_adv_track_info->p_scan_rsp_data);

    ScopedLocalRef<jobject> trackadv_obj(
        sCallbackEnv.get(),
        sCallbackEnv->CallObjectMethod(
            mCallbacksObj, method_createOnTrackAdvFoundLostObject,
            p_adv_track_info->client_if, p_adv_track_info->adv_pkt_len,
            jb_adv_pkt.get(), p_adv_track_info->scan_rsp_len, jb_scan_rsp.get(),
            p_adv_track_info->filt_index, p_adv_track_info->advertiser_state,
            p_adv_track_info->advertiser_info_present, address.get(),
            p_adv_track_info->addr_type, p_adv_track_info->tx_power,
            p_adv_track_info->rssi_value, p_adv_track_info->time_stamp));

    if (NULL != trackadv_obj.get()) {
      sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onTrackAdvFoundLost,
                                   trackadv_obj.get());
    }
  }

  void OnBatchScanReports(int client_if, int status, int report_format,
                          int num_records, std::vector<uint8_t> data) {
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    ScopedLocalRef<jbyteArray> jb(sCallbackEnv.get(),
                                  sCallbackEnv->NewByteArray(data.size()));
    sCallbackEnv->SetByteArrayRegion(jb.get(), 0, data.size(),
                                     (jbyte*)data.data());

    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onBatchScanReports,
                                 status, client_if, report_format, num_records,
                                 jb.get());
  }
};

/**
 * Native function definitions
 */
@@ -1015,6 +1105,7 @@ static void initializeNative(JNIEnv* env, jobject object) {

  sGattIf->advertiser->RegisterCallbacks(
      JniAdvertisingCallbacks::GetInstance());
  sGattIf->scanner->RegisterCallbacks(JniScanningCallbacks::GetInstance());

  mCallbacksObj = env->NewGlobalRef(object);
}
@@ -1072,7 +1163,7 @@ static void registerScannerNative(JNIEnv* env, jobject object,

  Uuid uuid = from_java_uuid(app_uuid_msb, app_uuid_lsb);
  sGattIf->scanner->RegisterScanner(
      base::Bind(&btgattc_register_scanner_cb, uuid));
      uuid, base::Bind(&btgattc_register_scanner_cb, uuid));
}

static void unregisterScannerNative(JNIEnv* env, jobject object,