diff --git a/ash/media/media_notification_container_impl.h b/ash/media/media_notification_container_impl.h index 9aa9439400b3db..d9d9e8e357f271 100644 --- a/ash/media/media_notification_container_impl.h +++ b/ash/media/media_notification_container_impl.h @@ -49,6 +49,7 @@ class ASH_EXPORT MediaNotificationContainerImpl override {} void OnMediaArtworkChanged(const gfx::ImageSkia& image) override {} void OnColorsChanged(SkColor foreground, SkColor background) override; + void OnHeaderClicked() override {} // views::View: void OnMouseEvent(ui::MouseEvent* event) override; diff --git a/chrome/browser/ui/views/global_media_controls/media_notification_container_impl_view.cc b/chrome/browser/ui/views/global_media_controls/media_notification_container_impl_view.cc index 9e0a35cda868e6..2aea6a5d1735f0 100644 --- a/chrome/browser/ui/views/global_media_controls/media_notification_container_impl_view.cc +++ b/chrome/browser/ui/views/global_media_controls/media_notification_container_impl_view.cc @@ -178,6 +178,13 @@ void MediaNotificationContainerImplView::OnColorsChanged(SkColor foreground, } } +void MediaNotificationContainerImplView::OnHeaderClicked() { + // Since we disable the expand button, nothing happens on the + // MediaNotificationView when the header is clicked. Treat the click as if we + // were clicked directly. + ContainerClicked(); +} + ui::Layer* MediaNotificationContainerImplView::GetSlideOutLayer() { return swipeable_container_->layer(); } @@ -191,8 +198,7 @@ void MediaNotificationContainerImplView::ButtonPressed(views::Button* sender, if (sender == dismiss_button_) { DismissNotification(); } else if (sender == this) { - for (auto& observer : observers_) - observer.OnContainerClicked(id_); + ContainerClicked(); } else { NOTREACHED(); } @@ -251,3 +257,8 @@ void MediaNotificationContainerImplView::ForceExpandedState() { view_->SetForcedExpandedState(&should_expand); } } + +void MediaNotificationContainerImplView::ContainerClicked() { + for (auto& observer : observers_) + observer.OnContainerClicked(id_); +} diff --git a/chrome/browser/ui/views/global_media_controls/media_notification_container_impl_view.h b/chrome/browser/ui/views/global_media_controls/media_notification_container_impl_view.h index 749ad4bdb7fcb8..8e289335d62409 100644 --- a/chrome/browser/ui/views/global_media_controls/media_notification_container_impl_view.h +++ b/chrome/browser/ui/views/global_media_controls/media_notification_container_impl_view.h @@ -64,6 +64,7 @@ class MediaNotificationContainerImplView override; void OnMediaArtworkChanged(const gfx::ImageSkia& image) override; void OnColorsChanged(SkColor foreground, SkColor background) override; + void OnHeaderClicked() override; // views::SlideOutControllerDelegate: ui::Layer* GetSlideOutLayer() override; @@ -98,6 +99,9 @@ class MediaNotificationContainerImplView // Updates the forced expanded state of |view_|. void ForceExpandedState(); + // Notify observers that we've been clicked. + void ContainerClicked(); + const std::string id_; views::View* swipeable_container_ = nullptr; diff --git a/chrome/browser/ui/views/global_media_controls/media_notification_container_impl_view_unittest.cc b/chrome/browser/ui/views/global_media_controls/media_notification_container_impl_view_unittest.cc index 881dd9aa3ec2d4..87e093842e63af 100644 --- a/chrome/browser/ui/views/global_media_controls/media_notification_container_impl_view_unittest.cc +++ b/chrome/browser/ui/views/global_media_controls/media_notification_container_impl_view_unittest.cc @@ -132,6 +132,13 @@ class MediaNotificationContainerImplViewTest : public views::ViewsTestBase { views::test::ButtonTestApi(notification_container_).NotifyClick(event); } + void SimulateHeaderClicked() { + ui::MouseEvent event(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), + ui::EventTimeForNow(), 0, 0); + views::test::ButtonTestApi(GetView()->GetHeaderRowForTesting()) + .NotifyClick(event); + } + void SimulateDismissButtonClicked() { ui::MouseEvent event(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), ui::EventTimeForNow(), 0, 0); @@ -356,6 +363,12 @@ TEST_F(MediaNotificationContainerImplViewTest, SendsDestroyedUpdates) { } TEST_F(MediaNotificationContainerImplViewTest, SendsClicks) { + // When the container is clicked directly, it should notify its observers. EXPECT_CALL(observer(), OnContainerClicked(kTestNotificationId)); SimulateContainerClicked(); + testing::Mock::VerifyAndClearExpectations(&observer()); + + // It should also notify its observers when the header is clicked. + EXPECT_CALL(observer(), OnContainerClicked(kTestNotificationId)); + SimulateHeaderClicked(); } diff --git a/components/media_message_center/media_notification_container.h b/components/media_message_center/media_notification_container.h index 60b19424aa68a3..c601ed52053d6d 100644 --- a/components/media_message_center/media_notification_container.h +++ b/components/media_message_center/media_notification_container.h @@ -41,6 +41,9 @@ class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaNotificationContainer { // Called when MediaNotificationView's colors change. virtual void OnColorsChanged(SkColor foreground, SkColor background) = 0; + // Called when the header row is clicked. + virtual void OnHeaderClicked() = 0; + protected: virtual ~MediaNotificationContainer() = default; }; diff --git a/components/media_message_center/media_notification_view.cc b/components/media_message_center/media_notification_view.cc index e85ac7e0c03a3c..70e9a42149be18 100644 --- a/components/media_message_center/media_notification_view.cc +++ b/components/media_message_center/media_notification_view.cc @@ -275,6 +275,7 @@ void MediaNotificationView::ButtonPressed(views::Button* sender, const ui::Event& event) { if (sender == header_row_) { SetExpanded(!expanded_); + container_->OnHeaderClicked(); return; } @@ -367,6 +368,10 @@ void MediaNotificationView::UpdateWithMediaArtwork( SchedulePaint(); } +views::Button* MediaNotificationView::GetHeaderRowForTesting() const { + return header_row_; +} + void MediaNotificationView::UpdateActionButtonsVisibility() { base::flat_set ignored_actions = { GetPlayPauseIgnoredAction(GetActionFromButtonTag(*play_pause_button_))}; diff --git a/components/media_message_center/media_notification_view.h b/components/media_message_center/media_notification_view.h index 335b52ed95d011..0204f40f67b787 100644 --- a/components/media_message_center/media_notification_view.h +++ b/components/media_message_center/media_notification_view.h @@ -96,6 +96,8 @@ class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaNotificationView const views::Label* artist_label_for_testing() const { return artist_label_; } + views::Button* GetHeaderRowForTesting() const; + private: friend class MediaNotificationViewTest; diff --git a/components/media_message_center/media_notification_view_unittest.cc b/components/media_message_center/media_notification_view_unittest.cc index 53b8c640212461..d4837c705e4b43 100644 --- a/components/media_message_center/media_notification_view_unittest.cc +++ b/components/media_message_center/media_notification_view_unittest.cc @@ -99,6 +99,7 @@ class MockMediaNotificationContainer : public MediaNotificationContainer { void(const base::flat_set& actions)); MOCK_METHOD1(OnMediaArtworkChanged, void(const gfx::ImageSkia& image)); MOCK_METHOD2(OnColorsChanged, void(SkColor foreground, SkColor background)); + MOCK_METHOD0(OnHeaderClicked, void()); MediaNotificationView* view() const { return view_.get(); } void SetView(std::unique_ptr view) { @@ -1303,4 +1304,9 @@ TEST_F(MAYBE_MediaNotificationViewTest, AllowsHidingOfAppIcon) { GetHeaderRow(&hides_icon)->app_icon_view_for_testing()->GetVisible()); } +TEST_F(MAYBE_MediaNotificationViewTest, ClickHeader_NotifyContainer) { + EXPECT_CALL(container(), OnHeaderClicked()); + SimulateHeaderClick(); +} + } // namespace media_message_center