From 0128c377b95953ec75ea45d624bef87b331a481a Mon Sep 17 00:00:00 2001 From: Ajay Panicker Date: Fri, 27 Apr 2018 06:59:22 -0700 Subject: [PATCH] Implement GetTotalNumberOfItems response for AVRCP Browsing Bug: 78636552 Test: run host test net_test_avrcp Change-Id: Ie05d23874317978eb619d0e56a89f2c880166a52 Merged-In: Ie05d23874317978eb619d0e56a89f2c880166a52 (cherry picked from commit 16aa6a075e5cbb7c97bbc639b876221038212b62) --- packet/tests/avrcp/avrcp_test_packets.h | 12 +++- .../avrcp/get_total_number_of_items_packet_test.cc | 10 +-- profile/avrcp/device.cc | 61 +++++++++++++++++- profile/avrcp/device.h | 10 +++ profile/avrcp/tests/avrcp_device_test.cc | 73 ++++++++++++++++++++++ 5 files changed, 158 insertions(+), 8 deletions(-) diff --git a/packet/tests/avrcp/avrcp_test_packets.h b/packet/tests/avrcp/avrcp_test_packets.h index f5c914e2c..3160ad557 100644 --- a/packet/tests/avrcp/avrcp_test_packets.h +++ b/packet/tests/avrcp/avrcp_test_packets.h @@ -291,9 +291,17 @@ std::vector set_browsed_player_response = { 0x70, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x6a, 0x00}; +// AVRCP Get Total Number of Items Request with Scope = Media Player List +std::vector get_total_number_of_items_request_media_players = { + 0x75, 0x00, 0x01, 0x00}; + +// AVRCP Get Total Number of Items Request with Scope = VFS +std::vector get_total_number_of_items_request_vfs = {0x75, 0x00, 0x01, + 0x01}; + // AVRCP Get Total Number of Items Request with Scope = Now Playing List -std::vector get_total_number_of_items_request = {0x75, 0x00, 0x01, - 0x03}; +std::vector get_total_number_of_items_request_now_playing = { + 0x75, 0x00, 0x01, 0x03}; // AVRCP Get Total number of Items Response with 5 items in folder std::vector get_total_number_of_items_response = { diff --git a/packet/tests/avrcp/get_total_number_of_items_packet_test.cc b/packet/tests/avrcp/get_total_number_of_items_packet_test.cc index cffc2a8aa..eb7efc26e 100644 --- a/packet/tests/avrcp/get_total_number_of_items_packet_test.cc +++ b/packet/tests/avrcp/get_total_number_of_items_packet_test.cc @@ -48,19 +48,19 @@ TEST(GetTotalNumberOfItemsResponseBuilderTest, errorStatusTest) { } TEST(GetTotalNumberOfItemsRequestTest, getterTest) { - auto test_packet = - TestGetTotalNumItemsReqPacket::Make(get_total_number_of_items_request); + auto test_packet = TestGetTotalNumItemsReqPacket::Make( + get_total_number_of_items_request_now_playing); ASSERT_EQ(test_packet->GetScope(), Scope::NOW_PLAYING); } TEST(GetTotalNumberOfItemsRequestTest, validTest) { - auto test_packet = - TestGetTotalNumItemsReqPacket::Make(get_total_number_of_items_request); + auto test_packet = TestGetTotalNumItemsReqPacket::Make( + get_total_number_of_items_request_now_playing); ASSERT_TRUE(test_packet->IsValid()); } TEST(GetTotalNumberOfItemsRequestTest, invalidTest) { - auto packet_copy = get_total_number_of_items_request; + auto packet_copy = get_total_number_of_items_request_now_playing; packet_copy.push_back(0x00); auto test_packet = TestGetTotalNumItemsReqPacket::Make(packet_copy); ASSERT_FALSE(test_packet->IsValid()); diff --git a/profile/avrcp/device.cc b/profile/avrcp/device.cc index bf2c5776e..6c442d408 100644 --- a/profile/avrcp/device.cc +++ b/profile/avrcp/device.cc @@ -584,8 +584,12 @@ void Device::BrowseMessageReceived(uint8_t label, HandleGetItemAttributes( label, Packet::Specialize(pkt)); break; + case BrowsePdu::GET_TOTAL_NUMBER_OF_ITEMS: + HandleGetTotalNumberOfItems( + label, Packet::Specialize(pkt)); + break; default: - DEVICE_LOG(WARNING) << __func__ << ": " << pkt->GetPdu(); + DEVICE_LOG(FATAL) << __func__ << ": " << pkt->GetPdu(); break; } } @@ -617,6 +621,61 @@ void Device::HandleGetFolderItems(uint8_t label, } } +void Device::HandleGetTotalNumberOfItems( + uint8_t label, std::shared_ptr pkt) { + DEVICE_VLOG(2) << __func__ << ": scope=" << pkt->GetScope(); + + switch (pkt->GetScope()) { + case Scope::MEDIA_PLAYER_LIST: { + media_interface_->GetMediaPlayerList( + base::Bind(&Device::GetTotalNumberOfItemsMediaPlayersResponse, + base::Unretained(this), label)); + break; + } + case Scope::VFS: + media_interface_->GetFolderItems( + curr_browsed_player_id_, CurrentFolder(), + base::Bind(&Device::GetTotalNumberOfItemsVFSResponse, + base::Unretained(this), label)); + break; + case Scope::NOW_PLAYING: + media_interface_->GetNowPlayingList( + base::Bind(&Device::GetTotalNumberOfItemsNowPlayingResponse, + base::Unretained(this), label)); + break; + default: + DEVICE_LOG(ERROR) << __func__ << ": " << pkt->GetScope(); + break; + } +} + +void Device::GetTotalNumberOfItemsMediaPlayersResponse( + uint8_t label, uint16_t curr_player, std::vector list) { + DEVICE_VLOG(2) << __func__ << ": num_items=" << list.size(); + + auto builder = GetTotalNumberOfItemsResponseBuilder::MakeBuilder( + Status::NO_ERROR, 0x0000, list.size()); + send_message(label, true, std::move(builder)); +} + +void Device::GetTotalNumberOfItemsVFSResponse(uint8_t label, + std::vector list) { + DEVICE_VLOG(2) << __func__ << ": num_items=" << list.size(); + + auto builder = GetTotalNumberOfItemsResponseBuilder::MakeBuilder( + Status::NO_ERROR, 0x0000, list.size()); + send_message(label, true, std::move(builder)); +} + +void Device::GetTotalNumberOfItemsNowPlayingResponse( + uint8_t label, std::string curr_song_id, std::vector list) { + DEVICE_VLOG(2) << __func__ << ": num_items=" << list.size(); + + auto builder = GetTotalNumberOfItemsResponseBuilder::MakeBuilder( + Status::NO_ERROR, 0x0000, list.size()); + send_message(label, true, std::move(builder)); +} + void Device::HandleChangePath(uint8_t label, std::shared_ptr pkt) { DEVICE_VLOG(2) << __func__ << ": direction=" << pkt->GetDirection() diff --git a/profile/avrcp/device.h b/profile/avrcp/device.h index 33b5662ac..c1a962f52 100644 --- a/profile/avrcp/device.h +++ b/profile/avrcp/device.h @@ -163,6 +163,16 @@ class Device { uint8_t label, std::shared_ptr pkt, std::string curr_song_id, std::vector song_list); + // GET TOTAL NUMBER OF ITEMS + virtual void HandleGetTotalNumberOfItems( + uint8_t label, std::shared_ptr pkt); + virtual void GetTotalNumberOfItemsMediaPlayersResponse( + uint8_t label, uint16_t curr_player, std::vector list); + virtual void GetTotalNumberOfItemsVFSResponse(uint8_t label, + std::vector items); + virtual void GetTotalNumberOfItemsNowPlayingResponse( + uint8_t label, std::string curr_song_id, std::vector song_list); + // GET ITEM ATTRIBUTES virtual void HandleGetItemAttributes( uint8_t label, std::shared_ptr request); diff --git a/profile/avrcp/tests/avrcp_device_test.cc b/profile/avrcp/tests/avrcp_device_test.cc index b00eff985..b005ec45a 100644 --- a/profile/avrcp/tests/avrcp_device_test.cc +++ b/profile/avrcp/tests/avrcp_device_test.cc @@ -355,6 +355,79 @@ TEST_F(AvrcpDeviceTest, getElementAttributesMtuTest) { 1, TestAvrcpPacket::Make(get_element_attributes_request_full)); } +TEST_F(AvrcpDeviceTest, getTotalNumberOfItemsMediaPlayersTest) { + MockMediaInterface interface; + NiceMock a2dp_interface; + + test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); + + std::vector player_list = { + {0, "player1", true}, {1, "player2", true}, {2, "player3", true}, + }; + + EXPECT_CALL(interface, GetMediaPlayerList(_)) + .Times(1) + .WillOnce(InvokeCb<0>(0, player_list)); + + auto expected_response = GetTotalNumberOfItemsResponseBuilder::MakeBuilder( + Status::NO_ERROR, 0, player_list.size()); + EXPECT_CALL(response_cb, + Call(1, true, matchPacket(std::move(expected_response)))) + .Times(1); + + SendBrowseMessage(1, TestBrowsePacket::Make( + get_total_number_of_items_request_media_players)); +} + +TEST_F(AvrcpDeviceTest, getTotalNumberOfItemsVFSTest) { + MockMediaInterface interface; + NiceMock a2dp_interface; + + test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); + + std::vector vfs_list = { + {ListItem::FOLDER, {"id1", true, "folder1"}, SongInfo()}, + {ListItem::FOLDER, {"id2", true, "folder2"}, SongInfo()}, + }; + + EXPECT_CALL(interface, GetFolderItems(_, "", _)) + .Times(1) + .WillOnce(InvokeCb<2>(vfs_list)); + + auto expected_response = GetTotalNumberOfItemsResponseBuilder::MakeBuilder( + Status::NO_ERROR, 0, vfs_list.size()); + EXPECT_CALL(response_cb, + Call(1, true, matchPacket(std::move(expected_response)))) + .Times(1); + + SendBrowseMessage( + 1, TestBrowsePacket::Make(get_total_number_of_items_request_vfs)); +} + +TEST_F(AvrcpDeviceTest, getTotalNumberOfItemsNowPlayingTest) { + MockMediaInterface interface; + NiceMock a2dp_interface; + + test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); + + std::vector now_playing_list = { + {"test_id1", {}}, {"test_id2", {}}, {"test_id3", {}}, + {"test_id4", {}}, {"test_id5", {}}, + }; + + EXPECT_CALL(interface, GetNowPlayingList(_)) + .WillRepeatedly(InvokeCb<0>("test_id1", now_playing_list)); + + auto expected_response = GetTotalNumberOfItemsResponseBuilder::MakeBuilder( + Status::NO_ERROR, 0, now_playing_list.size()); + EXPECT_CALL(response_cb, + Call(1, true, matchPacket(std::move(expected_response)))) + .Times(1); + + SendBrowseMessage( + 1, TestBrowsePacket::Make(get_total_number_of_items_request_now_playing)); +} + TEST_F(AvrcpDeviceTest, getMediaPlayerListTest) { MockMediaInterface interface; NiceMock a2dp_interface; -- 2.11.0