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

Commit 7ef3f7b4 authored by Rongxuan Liu's avatar Rongxuan Liu
Browse files

[le audio] Updating broadcast metadata triggers callback

Currently app didn't receive callback as expected upon updating broadcast annoucement.
When native layer updates the broadcast metadata, it should trigger
callback and notify the Java/App layers.

Bug: 347206874
Bug: 347710374
Test: atest bluetooth_test_gd_unit bluetooth_test_broadcaster_state_machine
Test: manual test with broadcast to confirm metadata is updated
Change-Id: I202a32f8d82a54c397cbc597c10c7d1f85929dde
parent 048a3931
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -1115,6 +1115,7 @@ cc_test {
        "libbase",
        "libcrypto",
        "liblog",
        "server_configurable_flags",
    ],
    static_libs: [
        "libbluetooth-types",
@@ -1126,6 +1127,7 @@ cc_test {
        "libbt_shim_bridge",
        "libbt_shim_ffi",
        "libchrome",
        "libflagtest",
        "libflatbuffers-cpp",
        "libgmock",
        "libgtest",
+48 −8
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@

#include <base/functional/bind.h>
#include <bluetooth/log.h>
#include <com_android_bluetooth_flags.h>
#include <lc3.h>

#include <mutex>
@@ -1029,6 +1030,10 @@ class LeAudioBroadcasterImpl : public LeAudioBroadcaster, public BigCallbacks {
              instance->le_audio_source_hal_client_.get(),
              std::placeholders::_1));
    }

    void OnAnnouncementUpdated(uint32_t broadcast_id) {
      instance->GetBroadcastMetadata(broadcast_id);
    }
  } state_machine_callbacks_;

  static class BroadcastAdvertisingCallbacks : public AdvertisingCallbacks {
@@ -1066,11 +1071,28 @@ class LeAudioBroadcasterImpl : public LeAudioBroadcaster, public BigCallbacks {
    }

    void OnAdvertisingDataSet(uint8_t advertiser_id, uint8_t status) {
      if (com::android::bluetooth::flags::
              leaudio_broadcast_update_metadata_callback()) {
        if (!instance) return;

        auto const& iter = std::find_if(
            instance->broadcasts_.cbegin(), instance->broadcasts_.cend(),
            [advertiser_id](auto const& sm) {
              return sm.second->GetAdvertisingSid() == advertiser_id;
            });
        if (iter != instance->broadcasts_.cend()) {
          iter->second->OnUpdateAnnouncement(status);
        } else {
          log::warn("Ignored OnAdvertisingDataSet callback advertiser_id:{}",
                    advertiser_id);
        }
      } else {
        log::warn(
            "Not being used, ignored OnAdvertisingDataSet callback "
            "advertiser_id:{}",
            advertiser_id);
      }
    }

    void OnScanResponseDataSet(uint8_t advertiser_id, uint8_t status) {
      log::warn(
@@ -1096,11 +1118,29 @@ class LeAudioBroadcasterImpl : public LeAudioBroadcaster, public BigCallbacks {
    }

    void OnPeriodicAdvertisingDataSet(uint8_t advertiser_id, uint8_t status) {
      if (com::android::bluetooth::flags::
              leaudio_broadcast_update_metadata_callback()) {
        if (!instance) return;

        auto const& iter = std::find_if(
            instance->broadcasts_.cbegin(), instance->broadcasts_.cend(),
            [advertiser_id](auto const& sm) {
              return sm.second->GetAdvertisingSid() == advertiser_id;
            });
        if (iter != instance->broadcasts_.cend()) {
          iter->second->OnUpdateAnnouncement(status);
        } else {
          log::warn(
              "Ignored OnPeriodicAdvertisingDataSet callback advertiser_id:{}",
              advertiser_id);
        }
      } else {
        log::warn(
            "Not being used, ignored OnPeriodicAdvertisingDataSet callback "
            "advertiser_id:{}",
            advertiser_id);
      }
    }

    void OnPeriodicAdvertisingEnabled(uint8_t advertiser_id, bool enable,
                                      uint8_t status) {
+1 −0
Original line number Diff line number Diff line
@@ -169,6 +169,7 @@ class MockBroadcastStateMachine
              (override));
  MOCK_METHOD((void), OnEnableAnnouncement, (bool enable, uint8_t status),
              (override));
  MOCK_METHOD((void), OnUpdateAnnouncement, (uint8_t status), (override));

  bool result_ = true;
  std::optional<bluetooth::le_audio::broadcaster::BigConfig> big_config_ =
+11 −0
Original line number Diff line number Diff line
@@ -196,6 +196,17 @@ class BroadcastStateMachineImpl : public BroadcastStateMachine {
    }
  }

  void OnUpdateAnnouncement(uint8_t status) {
    log::info("broadcast_id={}, status={}", GetBroadcastId(), status);

    if (status ==
        bluetooth::hci::AdvertisingCallback::AdvertisingStatus::SUCCESS) {
      callbacks_->OnAnnouncementUpdated(GetBroadcastId());
    } else {
      log::error("Updating Announcement failed");
    }
  }

  void UpdatePublicBroadcastAnnouncement(
      uint32_t broadcast_id, const std::string& broadcast_name,
      const bluetooth::le_audio::PublicBroadcastAnnouncementData& announcement)
+2 −0
Original line number Diff line number Diff line
@@ -180,6 +180,7 @@ class BroadcastStateMachine : public StateMachine<5> {
  virtual void OnCreateAnnouncement(uint8_t advertising_sid, int8_t tx_power,
                                    uint8_t status) = 0;
  virtual void OnEnableAnnouncement(bool enable, uint8_t status) = 0;
  virtual void OnUpdateAnnouncement(uint8_t status) = 0;
  void SetMuted(bool muted) { is_muted_ = muted; };
  bool IsMuted() const { return is_muted_; };

@@ -218,6 +219,7 @@ class IBroadcastStateMachineCallbacks {
  virtual void OnOwnAddressResponse(uint32_t broadcast_id, uint8_t addr_type,
                                    RawAddress address) = 0;
  virtual void OnBigCreated(const std::vector<uint16_t>& conn_handle) = 0;
  virtual void OnAnnouncementUpdated(uint32_t broadcast_id) = 0;
};

std::ostream& operator<<(
Loading