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

Commit a467e5c9 authored by Jakub Pawlowski's avatar Jakub Pawlowski Committed by Gerrit Code Review
Browse files

Merge "service: Add global scan support getters"

parents df0ab81a 9f59698f
Loading
Loading
Loading
Loading
+40 −13
Original line number Diff line number Diff line
@@ -20,6 +20,9 @@

#include "service/logging_helpers.h"

using std::lock_guard;
using std::mutex;

namespace bluetooth {

// static
@@ -27,14 +30,20 @@ const char Adapter::kDefaultAddress[] = "00:00:00:00:00:00";
// static
const char Adapter::kDefaultName[] = "not-initialized";

// TODO(armansito): The following constants come straight from
// packages/apps/Bluetooth/src/c/a/b/btservice/AdapterService.java. It would be
// nice to know if there were a way to obtain these values from the stack
// instead of hardcoding them here.

// The minimum number of advertising instances required for multi-advertisement
// support.
//
// TODO(armansito): This number comes straight from
// packages/apps/Bluetooth/src/c/a/b/btservice/AdapterService.java. It would be
// nice to know if there were a way to obtain this number from the stack instead
// of hardcoding it here.
const char kMinAdvInstancesForMultiAdv = 5;
const int kMinAdvInstancesForMultiAdv = 5;

// Used when determining if offloaded scan filtering is supported.
const int kMinOffloadedFilters = 10;

// Used when determining if offloaded scan batching is supported.
const int kMinOffloadedScanStorageBytes = 1024;

void Adapter::Observer::OnAdapterStateChanged(Adapter* adapter,
                                              AdapterState prev_state,
@@ -64,12 +73,12 @@ Adapter::~Adapter() {
}

void Adapter::AddObserver(Observer* observer) {
  std::lock_guard<std::mutex> lock(observers_lock_);
  lock_guard<mutex> lock(observers_lock_);
  observers_.AddObserver(observer);
}

void Adapter::RemoveObserver(Observer* observer) {
  std::lock_guard<std::mutex> lock(observers_lock_);
  lock_guard<mutex> lock(observers_lock_);
  observers_.RemoveObserver(observer);
}

@@ -163,15 +172,32 @@ std::string Adapter::GetAddress() const {
  return address_.Get();
}

bool Adapter::IsMultiAdvertisementSupported() const {
bool Adapter::IsMultiAdvertisementSupported() {
  lock_guard<mutex> lock(local_le_features_lock_);
  return local_le_features_.max_adv_instance >= kMinAdvInstancesForMultiAdv;
}

bool Adapter::IsDeviceConnected(const std::string& device_address) {
  std::lock_guard<std::mutex> lock(connected_devices_lock_);
  lock_guard<mutex> lock(connected_devices_lock_);
  return connected_devices_.find(device_address) != connected_devices_.end();
}

int Adapter::GetTotalNumberOfTrackableAdvertisements() {
  lock_guard<mutex> lock(local_le_features_lock_);
  return local_le_features_.total_trackable_advertisers;
}

bool Adapter::IsOffloadedFilteringSupported() {
  lock_guard<mutex> lock(local_le_features_lock_);
  return local_le_features_.max_adv_filter_supported >= kMinOffloadedFilters;
}

bool Adapter::IsOffloadedScanBatchingSupported() {
  lock_guard<mutex> lock(local_le_features_lock_);
  return local_le_features_.scan_result_storage_size >=
      kMinOffloadedScanStorageBytes;
}

LowEnergyClientFactory* Adapter::GetLowEnergyClientFactory() const {
  return ble_client_factory_.get();
}
@@ -233,6 +259,7 @@ void Adapter::AdapterPropertiesCallback(bt_status_t status,
        break;
      }
      case BT_PROPERTY_LOCAL_LE_FEATURES: {
        lock_guard<mutex> lock(local_le_features_lock_);
        if (property->len != sizeof(bt_local_le_features_t)) {
          LOG(WARNING) << "Malformed value received for property: "
                       << "BT_PROPERTY_LOCAL_LE_FEATURES";
@@ -272,14 +299,14 @@ void Adapter::AclStateChangedCallback(bt_status_t status,

  // Introduce a scope to manage |connected_devices_lock_| with RAII.
  {
    std::lock_guard<std::mutex> lock(connected_devices_lock_);
    lock_guard<mutex> lock(connected_devices_lock_);
    if (connected)
      connected_devices_.insert(device_address);
    else
      connected_devices_.erase(device_address);
  }

  std::lock_guard<std::mutex> lock(observers_lock_);
  lock_guard<mutex> lock(observers_lock_);
  FOR_EACH_OBSERVER(
      Observer, observers_,
      OnDeviceConnectionStateChanged(this, device_address, connected));
@@ -310,7 +337,7 @@ void Adapter::NotifyAdapterStateChanged(AdapterState prev_state,
  if (prev_state == new_state)
    return;

  std::lock_guard<std::mutex> lock(observers_lock_);
  lock_guard<mutex> lock(observers_lock_);
  FOR_EACH_OBSERVER(Observer, observers_,
                    OnAdapterStateChanged(this, prev_state, new_state));
}
+12 −1
Original line number Diff line number Diff line
@@ -102,13 +102,23 @@ class Adapter : public hal::BluetoothInterface::Observer {

  // Returns true if the local adapter supports the Low-Energy
  // multi-advertisement feature.
  bool IsMultiAdvertisementSupported() const;
  bool IsMultiAdvertisementSupported();

  // Returns true if the remote device with address |device_address| is
  // currently connected. This is not a const method as it modifies the state of
  // the associated internal mutex.
  bool IsDeviceConnected(const std::string& device_address);

  // Returns the total number of trackable advertisements as supported by the
  // underlying hardware.
  int GetTotalNumberOfTrackableAdvertisements();

  // Returns true if hardware-backed scan filtering is supported.
  bool IsOffloadedFilteringSupported();

  // Returns true if hardware-backed batch scanning is supported.
  bool IsOffloadedScanBatchingSupported();

  // Returns a pointer to the LowEnergyClientFactory. This can be used to
  // register per-application LowEnergyClient instances to perform BLE GAP
  // operations.
@@ -152,6 +162,7 @@ class Adapter : public hal::BluetoothInterface::Observer {
  // The current set of supported LE features as obtained from the stack. The
  // values here are all initially set to 0 and updated when the corresponding
  // adapter property has been received from the stack.
  std::mutex local_le_features_lock_;
  bt_local_le_features_t local_le_features_;

  // List of observers that are interested in notifications from us.