AVRCP: Reject SetAddressedPlayer command only if remote set invalid player ID

Implement HandleSetAddressedPlayer() to check if remote set valid
player ID and properly respond to remote.

Bug: 110632860
Test: PTS Test AVRCP/TG/MPS/BI-01-C AVRCP/TG/MPS/BV-02-C
Change-Id: Ice13e7ea97cdac369c4d021171a24bf9d96c9da8
Merged-In: Ice13e7ea97cdac369c4d021171a24bf9d96c9da8
diff --git a/packet/tests/avrcp/avrcp_test_packets.h b/packet/tests/avrcp/avrcp_test_packets.h
index e7e820b..304c43a 100644
--- a/packet/tests/avrcp/avrcp_test_packets.h
+++ b/packet/tests/avrcp/avrcp_test_packets.h
@@ -297,8 +297,12 @@
     0x72, 0x74, 0x69, 0x73, 0x74, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6a, 0x00,
     0x0a, 0x54, 0x65, 0x73, 0x74, 0x20, 0x41, 0x6c, 0x62, 0x75, 0x6d};
 
-// AVRCP Set Addressed Player Request with player_id = 1
+// AVRCP Set Addressed Player Request with player_id = 0
 std::vector<uint8_t> set_addressed_player_request = {
+    0x00, 0x48, 0x00, 0x00, 0x19, 0x58, 0x60, 0x00, 0x00, 0x02, 0x00, 0x00};
+
+// AVRCP Set Addressed Player Request with player_id = 1
+std::vector<uint8_t> set_addressed_player_id_1_request = {
     0x00, 0x48, 0x00, 0x00, 0x19, 0x58, 0x60, 0x00, 0x00, 0x02, 0x00, 0x01};
 
 // AVRCP Set Addressed Player Response with status success
diff --git a/packet/tests/avrcp/set_addressed_player_packet_test.cc b/packet/tests/avrcp/set_addressed_player_packet_test.cc
index 24d674a..a6ced9e 100644
--- a/packet/tests/avrcp/set_addressed_player_packet_test.cc
+++ b/packet/tests/avrcp/set_addressed_player_packet_test.cc
@@ -39,7 +39,7 @@
   auto test_packet =
       TestSetAddrPlayerPacket::Make(set_addressed_player_request);
 
-  ASSERT_EQ(test_packet->GetPlayerId(), 0x0001u);
+  ASSERT_EQ(test_packet->GetPlayerId(), 0x0000u);
 }
 
 TEST(SetAddressedPlayerRequestTest, validTest) {
@@ -60,4 +60,4 @@
 }
 
 }  // namespace avrcp
-}  // namespace bluetooth
\ No newline at end of file
+}  // namespace bluetooth
diff --git a/profile/avrcp/device.cc b/profile/avrcp/device.cc
index d2a985f..2dbe993 100644
--- a/profile/avrcp/device.cc
+++ b/profile/avrcp/device.cc
@@ -126,9 +126,9 @@
       // this currently since the current implementation only has one
       // player and the player will never change, but we need it for a
       // more complete implementation.
-      auto response = RejectBuilder::MakeBuilder(
-          CommandPdu::SET_ADDRESSED_PLAYER, Status::INVALID_PLAYER_ID);
-      send_message(label, false, std::move(response));
+      media_interface_->GetMediaPlayerList(base::Bind(
+          &Device::HandleSetAddressedPlayer, weak_ptr_factory_.GetWeakPtr(),
+          label, Packet::Specialize<SetAddressedPlayerRequest>(pkt)));
     } break;
 
     default: {
@@ -618,6 +618,24 @@
   send_message(label, false, std::move(response));
 }
 
+void Device::HandleSetAddressedPlayer(
+    uint8_t label, std::shared_ptr<SetAddressedPlayerRequest> pkt,
+    uint16_t curr_player, std::vector<MediaPlayerInfo> players) {
+  DEVICE_VLOG(2) << __func__ << ": PlayerId=" << pkt->GetPlayerId();
+
+  if (curr_player != pkt->GetPlayerId()) {
+    DEVICE_VLOG(2) << "Reject invalid addressed player ID";
+    auto response = RejectBuilder::MakeBuilder(CommandPdu::SET_ADDRESSED_PLAYER,
+                                               Status::INVALID_PLAYER_ID);
+    send_message(label, false, std::move(response));
+    return;
+  }
+
+  auto response =
+      SetAddressedPlayerResponseBuilder::MakeBuilder(Status::NO_ERROR);
+  send_message(label, false, std::move(response));
+}
+
 void Device::BrowseMessageReceived(uint8_t label,
                                    std::shared_ptr<BrowsePacket> pkt) {
   DEVICE_VLOG(1) << __func__ << ": pdu=" << pkt->GetPdu();
diff --git a/profile/avrcp/device.h b/profile/avrcp/device.h
index 27f7674..5ef886d 100644
--- a/profile/avrcp/device.h
+++ b/profile/avrcp/device.h
@@ -210,6 +210,11 @@
   virtual void HandlePlayItem(uint8_t label,
                               std::shared_ptr<PlayItemRequest> request);
 
+  // SET ADDRESSED PLAYER
+  virtual void HandleSetAddressedPlayer(
+      uint8_t label, std::shared_ptr<SetAddressedPlayerRequest> request,
+      uint16_t curr_player, std::vector<MediaPlayerInfo> players);
+
   /********************
    * MESSAGE REQUESTS
    ********************/
diff --git a/profile/avrcp/tests/avrcp_device_test.cc b/profile/avrcp/tests/avrcp_device_test.cc
index d50644c..12c36c2 100644
--- a/profile/avrcp/tests/avrcp_device_test.cc
+++ b/profile/avrcp/tests/avrcp_device_test.cc
@@ -713,10 +713,27 @@
 
   test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr);
 
-  auto set_addr_player_rsp = RejectBuilder::MakeBuilder(
+  MediaPlayerInfo info = {0, "Test Player", true};
+  std::vector<MediaPlayerInfo> list = {info};
+
+  EXPECT_CALL(interface, GetMediaPlayerList(_))
+      .WillRepeatedly(InvokeCb<0>(0, list));
+
+  auto set_addr_player_rej_rsp = RejectBuilder::MakeBuilder(
       CommandPdu::SET_ADDRESSED_PLAYER, Status::INVALID_PLAYER_ID);
 
   EXPECT_CALL(response_cb,
+              Call(1, false, matchPacket(std::move(set_addr_player_rej_rsp))))
+      .Times(1);
+
+  auto player_id_1_request =
+      TestAvrcpPacket::Make(set_addressed_player_id_1_request);
+  SendMessage(1, player_id_1_request);
+
+  auto set_addr_player_rsp =
+      SetAddressedPlayerResponseBuilder::MakeBuilder(Status::NO_ERROR);
+
+  EXPECT_CALL(response_cb,
               Call(1, false, matchPacket(std::move(set_addr_player_rsp))))
       .Times(1);