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

Commit cb0fad14 authored by Chienyuan's avatar Chienyuan
Browse files

Refactor scanning callback mechanism for GD

Tag: #refactor
Bug: 169390539
Test: gd/cert/run --host
Test: test/run_unit_tests.sh bluetoothtbd_test
Change-Id: I95478172ae83028e377a0bc195fd90dd64e455b3
parent d6f7287a
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -206,7 +206,8 @@ void bta_cback(tBTA_GATTC_EVT, tBTA_GATTC*) {}
class BleScannerInterfaceImpl : public BleScannerInterface {
  ~BleScannerInterfaceImpl() override{};

  void RegisterScanner(RegisterCallback cb) override {
  void RegisterScanner(const bluetooth::Uuid& app_uuid,
                       RegisterCallback cb) override {
    do_in_main_thread(FROM_HERE,
                      Bind(
                          [](RegisterCallback cb) {
@@ -333,6 +334,10 @@ class BleScannerInterfaceImpl : public BleScannerInterface {
                 SyncLostCb lost_cb) override {}

  void StopSync(uint16_t handle) override {}

  void RegisterCallbacks(ScanningCallbacks* callbacks) {
    // For GD only
  }
};

BleScannerInterface* btLeScannerInstance = nullptr;
+9 −0
Original line number Diff line number Diff line
@@ -207,6 +207,10 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback
    }
  }

  void register_scanning_callback(ScanningCallback* scanning_callbacks) {
    scanning_callbacks_ = scanning_callbacks;
  }

  void OnPause() override {
    cached_registered_callback_ = registered_callback_;
    stop_scan(common::Bind(&impl::ack_pause, common::Unretained(this)), true);
@@ -236,6 +240,7 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback
  hci::LeScanningInterface* le_scanning_interface_;
  hci::LeAddressManager* le_address_manager_;
  bool address_manager_registered = false;
  ScanningCallback* scanning_callbacks_ = nullptr;

  uint32_t interval_ms_{1000};
  uint16_t window_ms_{1000};
@@ -306,5 +311,9 @@ void LeScanningManager::StopScan(common::Callback<void()> on_stopped) {
  GetHandler()->Post(common::Bind(&impl::stop_scan, common::Unretained(pimpl_.get()), on_stopped, false));
}

void LeScanningManager::RegisterScanningCallback(ScanningCallback* scanning_callback) {
  CallOn(pimpl_.get(), &impl::register_scanning_callback, scanning_callback);
}

}  // namespace hci
}  // namespace bluetooth
+23 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include "common/callback.h"
#include "hci/hci_packets.h"
#include "hci/le_report.h"
#include "hci/uuid.h"
#include "module.h"

namespace bluetooth {
@@ -33,6 +34,26 @@ class LeScanningManagerCallbacks {
  virtual os::Handler* Handler() = 0;
};

class ScanningCallback {
 public:
  virtual ~ScanningCallback() = default;
  virtual void OnScannerRegistered(const bluetooth::hci::Uuid app_uuid, uint8_t scanner_id, uint8_t status) = 0;
  virtual void OnScanResult(
      uint16_t event_type,
      uint8_t addr_type,
      Address* 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) = 0;
  virtual void OnTrackAdvFoundLost() = 0;
  virtual void OnBatchScanReports(
      int client_if, int status, int report_format, int num_records, std::vector<uint8_t> data) = 0;
};

class LeScanningManager : public bluetooth::Module {
 public:
  LeScanningManager();
@@ -41,6 +62,8 @@ class LeScanningManager : public bluetooth::Module {

  void StopScan(common::Callback<void()> on_stopped);

  void RegisterScanningCallback(ScanningCallback* scanning_callback);

  static const ModuleFactory Factory;

 protected:
+27 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#ifndef ANDROID_INCLUDE_BLE_SCANNER_H
#define ANDROID_INCLUDE_BLE_SCANNER_H

#include <bluetooth/uuid.h>
#include <stdint.h>
#include <vector>
#include "bt_common_types.h"
@@ -50,6 +51,28 @@ typedef struct {
  track_adv_event_callback track_adv_event_cb;
} btgatt_scanner_callbacks_t;

/**
 * LE Scanning related callbacks invoked from from the Bluetooth native stack
 * All callbacks are invoked on the JNI thread
 */
class ScanningCallbacks {
 public:
  virtual ~ScanningCallbacks() = default;
  virtual void OnScannerRegistered(const bluetooth::Uuid app_uuid,
                                   uint8_t scannerId, uint8_t status) = 0;
  virtual 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) = 0;
  virtual void OnTrackAdvFoundLost(
      btgatt_track_adv_info_t* p_adv_track_info) = 0;
  virtual void OnBatchScanReports(int client_if, int status, int report_format,
                                  int num_records,
                                  std::vector<uint8_t> data) = 0;
};

class BleScannerInterface {
 public:
  virtual ~BleScannerInterface() = default;
@@ -71,7 +94,8 @@ class BleScannerInterface {
                          uint8_t /* action */, uint8_t /* status */)>;

  /** Registers a scanner with the stack */
  virtual void RegisterScanner(RegisterCallback) = 0;
  virtual void RegisterScanner(const bluetooth::Uuid& app_uuid,
                               RegisterCallback) = 0;

  /** Unregister a scanner from the stack */
  virtual void Unregister(int scanner_id) = 0;
@@ -128,6 +152,8 @@ class BleScannerInterface {
                         uint16_t timeout, StartSyncCb start_cb,
                         SyncReportCb report_cb, SyncLostCb lost_cb) = 0;
  virtual void StopSync(uint16_t handle) = 0;

  virtual void RegisterCallbacks(ScanningCallbacks* callbacks) = 0;
};

#endif /* ANDROID_INCLUDE_BLE_SCANNER_H */
 No newline at end of file
+35 −3
Original line number Diff line number Diff line
@@ -20,17 +20,26 @@

#include <base/bind.h>
#include <base/threading/thread.h>

#include <hardware/bluetooth.h>
#include <stdio.h>
#include <unordered_set>

class BleScannerInterfaceImpl : public BleScannerInterface {
#include "btif_common.h"
#include "gd/hci/address.h"
#include "gd/hci/le_scanning_manager.h"
#include "main/shim/entry.h"

class BleScannerInterfaceImpl : public BleScannerInterface,
                                public bluetooth::hci::ScanningCallback {
 public:
  ~BleScannerInterfaceImpl() override{};

  void Init() {
    bluetooth::shim::GetScanning()->RegisterScanningCallback(this);
  }

  /** Registers a scanner with the stack */
  void RegisterScanner(RegisterCallback) {
  void RegisterScanner(const bluetooth::Uuid& uuid, RegisterCallback) {
    LOG(INFO) << __func__ << " in shim layer";
  }

@@ -104,6 +113,25 @@ class BleScannerInterfaceImpl : public BleScannerInterface {
    LOG(INFO) << __func__ << " in shim layer";
    // This function doesn't implement in the old stack
  }

  void RegisterCallbacks(ScanningCallbacks* callbacks) {
    LOG(INFO) << __func__ << " in shim layer";
    scanning_callbacks_ = callbacks;
  }

  void OnScannerRegistered(const bluetooth::hci::Uuid app_uuid,
                           uint8_t scanner_id, uint8_t status){};
  void OnScanResult(uint16_t event_type, uint8_t addr_type,
                    bluetooth::hci::Address* 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){};
  void OnTrackAdvFoundLost(){};

  void OnBatchScanReports(int client_if, int status, int report_format,
                          int num_records, std::vector<uint8_t> data){};

  ScanningCallbacks* scanning_callbacks_;
};

BleScannerInterfaceImpl* bt_le_scanner_instance = nullptr;
@@ -114,3 +142,7 @@ BleScannerInterface* bluetooth::shim::get_ble_scanner_instance() {
  }
  return bt_le_scanner_instance;
}

void bluetooth::shim::init_scanning_manager() {
  bt_le_scanner_instance->Init();
}
 No newline at end of file
Loading