Commit 454b5828 authored by Takumi Fujimoto's avatar Takumi Fujimoto Committed by Commit Bot

Update media notification when MediaRoute updates

Whenever there is a MediaRoute update for an existing media notification
item, update the view if necessary.

Bug: 1040207
Change-Id: Ie8c28237fee56268f20dd57e08f9cf405fdb79cb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1992690Reviewed-by: default avatarTommy Steimel <steimel@chromium.org>
Commit-Queue: Takumi Fujimoto <takumif@chromium.org>
Cr-Commit-Position: refs/heads/master@{#729929}
parent c0d8c298
...@@ -167,6 +167,25 @@ void CastMediaNotificationItem::OnMediaStatusUpdated( ...@@ -167,6 +167,25 @@ void CastMediaNotificationItem::OnMediaStatusUpdated(
session_controller_->OnMediaStatusUpdated(std::move(status)); session_controller_->OnMediaStatusUpdated(std::move(status));
} }
void CastMediaNotificationItem::OnRouteUpdated(
const media_router::MediaRoute& route) {
DCHECK_EQ(route.media_route_id(), media_route_id_);
bool updated = false;
const base::string16 new_source_title =
base::UTF8ToUTF16(route.media_sink_name());
if (metadata_.source_title != new_source_title) {
metadata_.source_title = new_source_title;
updated = true;
}
const base::string16 new_artist = base::UTF8ToUTF16(route.description());
if (metadata_.artist != new_artist) {
metadata_.artist = new_artist;
updated = true;
}
if (updated && view_)
view_->UpdateWithMediaMetadata(metadata_);
}
mojo::PendingRemote<media_router::mojom::MediaStatusObserver> mojo::PendingRemote<media_router::mojom::MediaStatusObserver>
CastMediaNotificationItem::GetObserverPendingRemote() { CastMediaNotificationItem::GetObserverPendingRemote() {
return observer_receiver_.BindNewPipeAndPassRemote(); return observer_receiver_.BindNewPipeAndPassRemote();
......
...@@ -57,6 +57,8 @@ class CastMediaNotificationItem ...@@ -57,6 +57,8 @@ class CastMediaNotificationItem
void OnMediaStatusUpdated( void OnMediaStatusUpdated(
media_router::mojom::MediaStatusPtr status) override; media_router::mojom::MediaStatusPtr status) override;
void OnRouteUpdated(const media_router::MediaRoute& route);
// Returns a pending remote bound to |this|. This should not be called more // Returns a pending remote bound to |this|. This should not be called more
// than once per instance. // than once per instance.
mojo::PendingRemote<media_router::mojom::MediaStatusObserver> mojo::PendingRemote<media_router::mojom::MediaStatusObserver>
......
...@@ -49,9 +49,11 @@ void CastMediaNotificationProvider::OnRoutesUpdated( ...@@ -49,9 +49,11 @@ void CastMediaNotificationProvider::OnRoutesUpdated(
media_router::RouteControllerType::kGeneric) { media_router::RouteControllerType::kGeneric) {
continue; continue;
} }
if (std::find_if(items_.begin(), items_.end(), [&route](const auto& item) { auto item_it =
std::find_if(items_.begin(), items_.end(), [&route](const auto& item) {
return item.first == route.media_route_id(); return item.first == route.media_route_id();
}) == items_.end()) { });
if (item_it == items_.end()) {
mojo::Remote<media_router::mojom::MediaController> controller_remote; mojo::Remote<media_router::mojom::MediaController> controller_remote;
mojo::PendingReceiver<media_router::mojom::MediaController> mojo::PendingReceiver<media_router::mojom::MediaController>
controller_receiver = controller_remote.BindNewPipeAndPassReceiver(); controller_receiver = controller_remote.BindNewPipeAndPassReceiver();
...@@ -65,6 +67,8 @@ void CastMediaNotificationProvider::OnRoutesUpdated( ...@@ -65,6 +67,8 @@ void CastMediaNotificationProvider::OnRoutesUpdated(
router_->GetMediaController( router_->GetMediaController(
route.media_route_id(), std::move(controller_receiver), route.media_route_id(), std::move(controller_receiver),
it_pair.first->second.GetObserverPendingRemote()); it_pair.first->second.GetObserverPendingRemote());
} else {
item_it->second.OnRouteUpdated(route);
} }
} }
if (HasItems() != had_items) if (HasItems() != had_items)
......
...@@ -7,12 +7,24 @@ ...@@ -7,12 +7,24 @@
#include "chrome/browser/media/router/test/mock_media_router.h" #include "chrome/browser/media/router/test/mock_media_router.h"
#include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile.h"
#include "components/media_message_center/media_notification_controller.h" #include "components/media_message_center/media_notification_controller.h"
#include "components/media_message_center/media_notification_view.h"
#include "content/public/test/browser_task_environment.h" #include "content/public/test/browser_task_environment.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
using media_router::MediaRoute;
using testing::_;
namespace { namespace {
MediaRoute CreateRoute(const std::string& route_id) {
media_router::MediaRoute route(route_id,
media_router::MediaSource("source_id"),
"sink_id", "description", true, true);
route.set_controller_type(media_router::RouteControllerType::kGeneric);
return route;
}
class MockMediaNotificationController class MockMediaNotificationController
: public media_message_center::MediaNotificationController { : public media_message_center::MediaNotificationController {
public: public:
...@@ -28,6 +40,23 @@ class MockMediaNotificationController ...@@ -28,6 +40,23 @@ class MockMediaNotificationController
MOCK_METHOD1(LogMediaSessionActionButtonPressed, void(const std::string& id)); MOCK_METHOD1(LogMediaSessionActionButtonPressed, void(const std::string& id));
}; };
class MockMediaNotificationView
: public media_message_center::MediaNotificationView {
public:
MOCK_METHOD1(SetExpanded, void(bool));
MOCK_METHOD2(UpdateCornerRadius, void(int, int));
MOCK_METHOD1(SetForcedExpandedState, void(bool*));
MOCK_METHOD1(UpdateWithMediaSessionInfo,
void(const media_session::mojom::MediaSessionInfoPtr&));
MOCK_METHOD1(UpdateWithMediaMetadata,
void(const media_session::MediaMetadata&));
MOCK_METHOD1(
UpdateWithMediaActions,
void(const base::flat_set<media_session::mojom::MediaSessionAction>&));
MOCK_METHOD1(UpdateWithMediaArtwork, void(const gfx::ImageSkia&));
MOCK_METHOD1(UpdateWithFavicon, void(const gfx::ImageSkia&));
};
class MockClosure { class MockClosure {
public: public:
MOCK_METHOD0(Run, void()); MOCK_METHOD0(Run, void());
...@@ -57,10 +86,7 @@ class CastMediaNotificationProviderTest : public testing::Test { ...@@ -57,10 +86,7 @@ class CastMediaNotificationProviderTest : public testing::Test {
TEST_F(CastMediaNotificationProviderTest, AddAndRemoveRoute) { TEST_F(CastMediaNotificationProviderTest, AddAndRemoveRoute) {
const std::string route_id = "route-id-1"; const std::string route_id = "route-id-1";
media_router::MediaRoute route(route_id, MediaRoute route = CreateRoute(route_id);
media_router::MediaSource("source_id"),
"sink_id", "description", true, true);
route.set_controller_type(media_router::RouteControllerType::kGeneric);
EXPECT_CALL(items_changed_callback_, Run()); EXPECT_CALL(items_changed_callback_, Run());
notification_provider_->OnRoutesUpdated({route}, {}); notification_provider_->OnRoutesUpdated({route}, {});
...@@ -73,3 +99,26 @@ TEST_F(CastMediaNotificationProviderTest, AddAndRemoveRoute) { ...@@ -73,3 +99,26 @@ TEST_F(CastMediaNotificationProviderTest, AddAndRemoveRoute) {
testing::Mock::VerifyAndClearExpectations(&items_changed_callback_); testing::Mock::VerifyAndClearExpectations(&items_changed_callback_);
EXPECT_FALSE(notification_provider_->HasItems()); EXPECT_FALSE(notification_provider_->HasItems());
} }
TEST_F(CastMediaNotificationProviderTest, UpdateRoute) {
const std::string route_id = "route-id-1";
MediaRoute route = CreateRoute(route_id);
notification_provider_->OnRoutesUpdated({route}, {});
auto* item = static_cast<CastMediaNotificationItem*>(
notification_provider_->GetNotificationItem(route_id).get());
MockMediaNotificationView view;
item->SetView(&view);
const std::string new_sink = "new sink";
const std::string new_description = "new description";
route.set_media_sink_name(new_sink);
route.set_description(new_description);
EXPECT_CALL(view, UpdateWithMediaMetadata(_))
.WillOnce([&](const media_session::MediaMetadata& metadata) {
EXPECT_EQ(base::UTF8ToUTF16(new_sink), metadata.source_title);
EXPECT_EQ(base::UTF8ToUTF16(new_description), metadata.artist);
});
notification_provider_->OnRoutesUpdated({route}, {});
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment