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

Commit 82e31399 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Allow both category of A2DP devices to be connected" into main

parents 93732559 ecd7462d
Loading
Loading
Loading
Loading
+42 −23
Original line number Original line Diff line number Diff line
@@ -23,7 +23,6 @@
#include <android_bluetooth_flags.h>
#include <android_bluetooth_flags.h>
#include <android_bluetooth_sysprop.h>
#include <android_bluetooth_sysprop.h>
#include <base/functional/bind.h>
#include <base/functional/bind.h>
#include <base/logging.h>
#include <base/strings/stringprintf.h>
#include <base/strings/stringprintf.h>
#include <bluetooth/log.h>
#include <bluetooth/log.h>
#include <frameworks/proto_logging/stats/enums/bluetooth/a2dp/enums.pb.h>
#include <frameworks/proto_logging/stats/enums/bluetooth/a2dp/enums.pb.h>
@@ -406,6 +405,7 @@ class BtifAvSource {
  btav_source_callbacks_t* Callbacks() { return callbacks_; }
  btav_source_callbacks_t* Callbacks() { return callbacks_; }
  bool Enabled() const { return enabled_; }
  bool Enabled() const { return enabled_; }
  bool A2dpOffloadEnabled() const { return a2dp_offload_enabled_; }
  bool A2dpOffloadEnabled() const { return a2dp_offload_enabled_; }
  // TODO: b/321806163: Remove this method as part of flag cleanup
  void SetInvalidPeerCheck(bool invalid_peer_check) {
  void SetInvalidPeerCheck(bool invalid_peer_check) {
    invalid_peer_check_ = invalid_peer_check;
    invalid_peer_check_ = invalid_peer_check;
  }
  }
@@ -644,6 +644,7 @@ class BtifAvSink {
  btav_sink_callbacks_t* Callbacks() { return callbacks_; }
  btav_sink_callbacks_t* Callbacks() { return callbacks_; }
  bool Enabled() const { return enabled_; }
  bool Enabled() const { return enabled_; }


  // TODO: b/321806163: Remove this method as part of flag cleanup
  void SetInvalidPeerCheck(bool invalid_peer_check) {
  void SetInvalidPeerCheck(bool invalid_peer_check) {
    invalid_peer_check_ = invalid_peer_check;
    invalid_peer_check_ = invalid_peer_check;
  }
  }
@@ -872,7 +873,7 @@ static BtifAvPeer* btif_av_find_peer(const RawAddress& peer_address,
        return sinkPeer;
        return sinkPeer;
      }
      }
    }
    }
    LOG_INFO("Unable to find the peer %s",
    log::info("Unable to find the peer {}",
              ADDRESS_TO_LOGGABLE_CSTR(peer_address));
              ADDRESS_TO_LOGGABLE_CSTR(peer_address));
    return nullptr;
    return nullptr;
  }
  }
@@ -1321,7 +1322,9 @@ BtifAvPeer* BtifAvSource::FindOrCreatePeer(const RawAddress& peer_address,


bool BtifAvSource::AllowedToConnect(const RawAddress& peer_address) const {
bool BtifAvSource::AllowedToConnect(const RawAddress& peer_address) const {
  int connected = 0;
  int connected = 0;
  if (btif_av_src_sink_coexist_enabled() && invalid_peer_check_) {

  if (!IS_FLAG_ENABLED(a2dp_concurrent_source_sink) &&
      btif_av_src_sink_coexist_enabled() && invalid_peer_check_) {
    log::info(
    log::info(
        "invalid_peer_check_ so allow to connect here, when BTA_AV_OPEN_EVT "
        "invalid_peer_check_ so allow to connect here, when BTA_AV_OPEN_EVT "
        "coming, would check again!");
        "coming, would check again!");
@@ -1337,8 +1340,10 @@ bool BtifAvSource::AllowedToConnect(const RawAddress& peer_address) const {
      case BtifAvStateMachine::kStateStarted:
      case BtifAvStateMachine::kStateStarted:
        if (peer->PeerAddress() == peer_address) {
        if (peer->PeerAddress() == peer_address) {
          /* we should check if another role is used */
          /* we should check if another role is used */
          if (btif_av_src_sink_coexist_enabled() && btif_av_both_enable())
          if (!IS_FLAG_ENABLED(a2dp_concurrent_source_sink) &&
              btif_av_src_sink_coexist_enabled() && btif_av_both_enable()) {
            break;
            break;
          }


          return true;  // Already connected or accounted for
          return true;  // Already connected or accounted for
        }
        }
@@ -1348,7 +1353,8 @@ bool BtifAvSource::AllowedToConnect(const RawAddress& peer_address) const {
        break;
        break;
    }
    }
  }
  }
  if (btif_av_src_sink_coexist_enabled() && btif_av_both_enable()) {
  if (!IS_FLAG_ENABLED(a2dp_concurrent_source_sink) &&
      btif_av_src_sink_coexist_enabled() && btif_av_both_enable()) {
    log::info("connected={}, max_connected_peers_={}, sink_peers={}", connected,
    log::info("connected={}, max_connected_peers_={}, sink_peers={}", connected,
              max_connected_peers_, (int)btif_av_sink.Peers().size());
              max_connected_peers_, (int)btif_av_sink.Peers().size());
    /* if source device connected, don't connect sink device */
    /* if source device connected, don't connect sink device */
@@ -1576,7 +1582,8 @@ BtifAvPeer* BtifAvSink::FindOrCreatePeer(const RawAddress& peer_address,
bool BtifAvSink::AllowedToConnect(const RawAddress& peer_address) const {
bool BtifAvSink::AllowedToConnect(const RawAddress& peer_address) const {
  int connected = 0;
  int connected = 0;


  if (btif_av_src_sink_coexist_enabled() && invalid_peer_check_) {
  if (!IS_FLAG_ENABLED(a2dp_concurrent_source_sink) &&
      btif_av_src_sink_coexist_enabled() && invalid_peer_check_) {
    log::info(
    log::info(
        "invalid_peer_check_ so allow to connect here, when BTA_AV_OPEN_EVT "
        "invalid_peer_check_ so allow to connect here, when BTA_AV_OPEN_EVT "
        "coming, would check again!");
        "coming, would check again!");
@@ -1590,8 +1597,10 @@ bool BtifAvSink::AllowedToConnect(const RawAddress& peer_address) const {
      case BtifAvStateMachine::kStateOpened:
      case BtifAvStateMachine::kStateOpened:
      case BtifAvStateMachine::kStateStarted:
      case BtifAvStateMachine::kStateStarted:
        if (peer->PeerAddress() == peer_address) {
        if (peer->PeerAddress() == peer_address) {
          if (!IS_FLAG_ENABLED(a2dp_concurrent_source_sink)) {
            /* we should check if another role is used */
            /* we should check if another role is used */
            if (btif_av_both_enable()) break;
            if (btif_av_both_enable()) break;
          }
          return true;  // Already connected or accounted for
          return true;  // Already connected or accounted for
        }
        }
        connected++;
        connected++;
@@ -1612,7 +1621,7 @@ bool BtifAvSink::AllowedToConnect(const RawAddress& peer_address) const {
        break;
        break;
    }
    }
  }
  }
  if (btif_av_both_enable()) {
  if (!IS_FLAG_ENABLED(a2dp_concurrent_source_sink) && btif_av_both_enable()) {
    log::info("connected={}, max_connected_peers_={}, source_peers={}",
    log::info("connected={}, max_connected_peers_={}, source_peers={}",
              connected, max_connected_peers_,
              connected, max_connected_peers_,
              (int)btif_av_source.Peers().size());
              (int)btif_av_source.Peers().size());
@@ -1835,6 +1844,8 @@ bool BtifAvStateMachine::StateIdle::ProcessEvent(uint32_t event, void* p_data) {
      if (peer_.IsSink()) {
      if (peer_.IsSink()) {
        can_connect = btif_av_source.AllowedToConnect(peer_.PeerAddress());
        can_connect = btif_av_source.AllowedToConnect(peer_.PeerAddress());
        if (!can_connect) {
        if (!can_connect) {
          log::error("Source profile doesn't allow connection to peer:{}",
                     ADDRESS_TO_LOGGABLE_CSTR(peer_.PeerAddress()));
          if (btif_av_src_sink_coexist_enabled())
          if (btif_av_src_sink_coexist_enabled())
            BTA_AvCloseRc(((tBTA_AV*)p_data)->rc_open.rc_handle);
            BTA_AvCloseRc(((tBTA_AV*)p_data)->rc_open.rc_handle);
          else
          else
@@ -1843,6 +1854,8 @@ bool BtifAvStateMachine::StateIdle::ProcessEvent(uint32_t event, void* p_data) {
      } else if (peer_.IsSource()) {
      } else if (peer_.IsSource()) {
        can_connect = btif_av_sink.AllowedToConnect(peer_.PeerAddress());
        can_connect = btif_av_sink.AllowedToConnect(peer_.PeerAddress());
        if (!can_connect) {
        if (!can_connect) {
          log::error("Sink profile doesn't allow connection to peer:{}",
                     ADDRESS_TO_LOGGABLE_CSTR(peer_.PeerAddress()));
          if (btif_av_src_sink_coexist_enabled())
          if (btif_av_src_sink_coexist_enabled())
            BTA_AvCloseRc(((tBTA_AV*)p_data)->rc_open.rc_handle);
            BTA_AvCloseRc(((tBTA_AV*)p_data)->rc_open.rc_handle);
          else
          else
@@ -1919,6 +1932,7 @@ bool BtifAvStateMachine::StateIdle::ProcessEvent(uint32_t event, void* p_data) {
                       ADDRESS_TO_LOGGABLE_CSTR(peer_.PeerAddress()),
                       ADDRESS_TO_LOGGABLE_CSTR(peer_.PeerAddress()),
                       peer_.PeerSep(), p_bta_data->open.sep);
                       peer_.PeerSep(), p_bta_data->open.sep);
          /* if peer is wrong sep type, move it to BtifAvSxxx */
          /* if peer is wrong sep type, move it to BtifAvSxxx */
          if (!IS_FLAG_ENABLED(a2dp_concurrent_source_sink)) {
            if (peer_.PeerSep() == AVDT_TSEP_SNK) {
            if (peer_.PeerSep() == AVDT_TSEP_SNK) {
              log::verbose("set source invalid_peer_check as false");
              log::verbose("set source invalid_peer_check as false");
              btif_av_source.SetInvalidPeerCheck(false);
              btif_av_source.SetInvalidPeerCheck(false);
@@ -1926,6 +1940,7 @@ bool BtifAvStateMachine::StateIdle::ProcessEvent(uint32_t event, void* p_data) {
              log::verbose("set sink invalid_peer_check as false");
              log::verbose("set sink invalid_peer_check as false");
              btif_av_sink.SetInvalidPeerCheck(false);
              btif_av_sink.SetInvalidPeerCheck(false);
            }
            }
          }
          if (peer_.PeerSep() != p_bta_data->open.sep) {
          if (peer_.PeerSep() != p_bta_data->open.sep) {
            BtifAvPeer* tmp_peer = nullptr;
            BtifAvPeer* tmp_peer = nullptr;
            if (peer_.PeerSep() == AVDT_TSEP_SNK) {
            if (peer_.PeerSep() == AVDT_TSEP_SNK) {
@@ -2125,6 +2140,7 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event,
                       ADDRESS_TO_LOGGABLE_CSTR(peer_.PeerAddress()),
                       ADDRESS_TO_LOGGABLE_CSTR(peer_.PeerAddress()),
                       peer_.PeerSep(), p_bta_data->open.sep);
                       peer_.PeerSep(), p_bta_data->open.sep);
          /* if peer is wrong sep type, move it to BtifAvSxxx */
          /* if peer is wrong sep type, move it to BtifAvSxxx */
          if (!IS_FLAG_ENABLED(a2dp_concurrent_source_sink)) {
            if (peer_.PeerSep() == AVDT_TSEP_SNK) {
            if (peer_.PeerSep() == AVDT_TSEP_SNK) {
              log::verbose("set source invalid_peer_check as false");
              log::verbose("set source invalid_peer_check as false");
              btif_av_source.SetInvalidPeerCheck(false);
              btif_av_source.SetInvalidPeerCheck(false);
@@ -2132,6 +2148,7 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event,
              log::verbose("set sink invalid_peer_check as false");
              log::verbose("set sink invalid_peer_check as false");
              btif_av_sink.SetInvalidPeerCheck(false);
              btif_av_sink.SetInvalidPeerCheck(false);
            }
            }
          }
          if (peer_.PeerSep() != p_bta_data->open.sep) {
          if (peer_.PeerSep() != p_bta_data->open.sep) {
            BtifAvPeer* tmp_peer = nullptr;
            BtifAvPeer* tmp_peer = nullptr;
            if (peer_.PeerSep() == AVDT_TSEP_SNK) {
            if (peer_.PeerSep() == AVDT_TSEP_SNK) {
@@ -3148,7 +3165,9 @@ static BtifAvPeer* btif_av_handle_both_peer(uint8_t peer_sep,
          log::verbose("peer_sep({}), create a new sink peer", peer_sep);
          log::verbose("peer_sep({}), create a new sink peer", peer_sep);
          peer = btif_av_source.FindOrCreatePeer(peer_address, bta_handle);
          peer = btif_av_source.FindOrCreatePeer(peer_address, bta_handle);
        } else {
        } else {
          if (!IS_FLAG_ENABLED(a2dp_concurrent_source_sink)) {
            btif_av_source.SetInvalidPeerCheck(true);
            btif_av_source.SetInvalidPeerCheck(true);
          }
          if (!btif_av_source.Peers().empty()) {
          if (!btif_av_source.Peers().empty()) {
            log::verbose(
            log::verbose(
                "peer_sep invalid, and already has sink peer, so try create a "
                "peer_sep invalid, and already has sink peer, so try create a "