Commit 32a0ac91 authored by Noah Rose Ledesma's avatar Noah Rose Ledesma Committed by Commit Bot

GMC: Show connected audio devices

This CL adds a method to MediaNotificationService used by the
MediaNotificationAudioDeviceSelectorView to query the system for
audio output device descriptions.

The device selector view will then display the available devices to the
user.

Bug: 1096242
Change-Id: I22d0dedd22697c2ecf8a725d7c8ca65880b86819
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2283417Reviewed-by: default avatarTommy Steimel <steimel@chromium.org>
Commit-Queue: Noah Rose Ledesma <noahrose@google.com>
Cr-Commit-Position: refs/heads/master@{#790491}
parent 3680d41c
...@@ -963,6 +963,9 @@ static_library("ui") { ...@@ -963,6 +963,9 @@ static_library("ui") {
"global_media_controls/media_dialog_delegate.h", "global_media_controls/media_dialog_delegate.h",
"global_media_controls/media_notification_container_impl.h", "global_media_controls/media_notification_container_impl.h",
"global_media_controls/media_notification_container_observer.h", "global_media_controls/media_notification_container_observer.h",
"global_media_controls/media_notification_device_provider.h",
"global_media_controls/media_notification_device_provider_impl.cc",
"global_media_controls/media_notification_device_provider_impl.h",
"global_media_controls/media_notification_service.cc", "global_media_controls/media_notification_service.cc",
"global_media_controls/media_notification_service.h", "global_media_controls/media_notification_service.h",
"global_media_controls/media_notification_service_factory.cc", "global_media_controls/media_notification_service_factory.cc",
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_GLOBAL_MEDIA_CONTROLS_MEDIA_NOTIFICATION_DEVICE_PROVIDER_H_
#define CHROME_BROWSER_UI_GLOBAL_MEDIA_CONTROLS_MEDIA_NOTIFICATION_DEVICE_PROVIDER_H_
#include "base/callback_list.h"
#include "media/audio/audio_system.h"
class MediaNotificationDeviceProvider {
public:
virtual ~MediaNotificationDeviceProvider() = default;
using GetOutputDevicesCallbackList =
base::OnceCallbackList<void(const media::AudioDeviceDescriptions&)>;
using GetOutputDevicesCallback = GetOutputDevicesCallbackList::CallbackType;
virtual std::unique_ptr<MediaNotificationDeviceProvider::
GetOutputDevicesCallbackList::Subscription>
GetOutputDeviceDescriptions(GetOutputDevicesCallback cb) = 0;
};
#endif // CHROME_BROWSER_UI_GLOBAL_MEDIA_CONTROLS_MEDIA_NOTIFICATION_DEVICE_PROVIDER_H_
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/global_media_controls/media_notification_device_provider_impl.h"
#include "content/public/browser/audio_service.h"
MediaNotificationDeviceProviderImpl::MediaNotificationDeviceProviderImpl() =
default;
MediaNotificationDeviceProviderImpl::~MediaNotificationDeviceProviderImpl() =
default;
std::unique_ptr<
MediaNotificationDeviceProvider::GetOutputDevicesCallbackList::Subscription>
MediaNotificationDeviceProviderImpl::GetOutputDeviceDescriptions(
GetOutputDevicesCallback cb) {
if (is_querying_for_output_devices_)
return output_device_callback_list_.Add(std::move(cb));
if (!audio_system_)
audio_system_ = content::CreateAudioSystemForAudioService();
audio_system_->GetDeviceDescriptions(
/*for_input=*/false,
base::BindOnce(
&MediaNotificationDeviceProviderImpl::OnReceivedDeviceDescriptions,
weak_ptr_factory_.GetWeakPtr()));
return output_device_callback_list_.Add(std::move(cb));
}
void MediaNotificationDeviceProviderImpl::OnReceivedDeviceDescriptions(
media::AudioDeviceDescriptions descriptions) {
is_querying_for_output_devices_ = false;
output_device_callback_list_.Notify(descriptions);
}
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_GLOBAL_MEDIA_CONTROLS_MEDIA_NOTIFICATION_DEVICE_PROVIDER_IMPL_H_
#define CHROME_BROWSER_UI_GLOBAL_MEDIA_CONTROLS_MEDIA_NOTIFICATION_DEVICE_PROVIDER_IMPL_H_
#include "base/memory/weak_ptr.h"
#include "chrome/browser/ui/global_media_controls/media_notification_device_provider.h"
class MediaNotificationDeviceProviderImpl
: public MediaNotificationDeviceProvider {
public:
MediaNotificationDeviceProviderImpl();
MediaNotificationDeviceProviderImpl(
const MediaNotificationDeviceProviderImpl&) = delete;
MediaNotificationDeviceProviderImpl& operator=(
const MediaNotificationDeviceProviderImpl&) = delete;
~MediaNotificationDeviceProviderImpl() override;
std::unique_ptr<MediaNotificationDeviceProvider::
GetOutputDevicesCallbackList::Subscription>
GetOutputDeviceDescriptions(
GetOutputDevicesCallback on_descriptions_cb) override;
private:
void OnReceivedDeviceDescriptions(
media::AudioDeviceDescriptions descriptions);
bool is_querying_for_output_devices_ = false;
MediaNotificationDeviceProvider::GetOutputDevicesCallbackList
output_device_callback_list_;
std::unique_ptr<media::AudioSystem> audio_system_;
base::WeakPtrFactory<MediaNotificationDeviceProviderImpl> weak_ptr_factory_{
this};
};
#endif // CHROME_BROWSER_UI_GLOBAL_MEDIA_CONTROLS_MEDIA_NOTIFICATION_DEVICE_PROVIDER_IMPL_H_
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/global_media_controls/media_dialog_delegate.h" #include "chrome/browser/ui/global_media_controls/media_dialog_delegate.h"
#include "chrome/browser/ui/global_media_controls/media_notification_container_impl.h" #include "chrome/browser/ui/global_media_controls/media_notification_container_impl.h"
#include "chrome/browser/ui/global_media_controls/media_notification_device_provider_impl.h"
#include "chrome/browser/ui/global_media_controls/media_notification_service_observer.h" #include "chrome/browser/ui/global_media_controls/media_notification_service_observer.h"
#include "chrome/browser/ui/global_media_controls/overlay_media_notification.h" #include "chrome/browser/ui/global_media_controls/overlay_media_notification.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/tabs/tab_strip_model.h"
...@@ -268,7 +269,9 @@ void MediaNotificationService::Session::MarkActiveIfNecessary() { ...@@ -268,7 +269,9 @@ void MediaNotificationService::Session::MarkActiveIfNecessary() {
} }
MediaNotificationService::MediaNotificationService(Profile* profile) MediaNotificationService::MediaNotificationService(Profile* profile)
: overlay_media_notifications_manager_(this) { : overlay_media_notifications_manager_(this),
device_provider_(
std::make_unique<MediaNotificationDeviceProviderImpl>()) {
if (base::FeatureList::IsEnabled(media::kGlobalMediaControlsForCast) && if (base::FeatureList::IsEnabled(media::kGlobalMediaControlsForCast) &&
media_router::MediaRouterEnabled(profile)) { media_router::MediaRouterEnabled(profile)) {
cast_notification_provider_ = cast_notification_provider_ =
...@@ -696,6 +699,18 @@ void MediaNotificationService::OnSessionBecameInactive(const std::string& id) { ...@@ -696,6 +699,18 @@ void MediaNotificationService::OnSessionBecameInactive(const std::string& id) {
HideNotification(id); HideNotification(id);
} }
std::unique_ptr<
MediaNotificationDeviceProvider::GetOutputDevicesCallbackList::Subscription>
MediaNotificationService::GetOutputDevices(
MediaNotificationDeviceProvider::GetOutputDevicesCallback callback) {
return device_provider_->GetOutputDeviceDescriptions(std::move(callback));
}
void MediaNotificationService::set_device_provider_for_testing(
std::unique_ptr<MediaNotificationDeviceProvider> device_provider) {
device_provider_ = std::move(device_provider);
}
void MediaNotificationService::OnItemUnfrozen(const std::string& id) { void MediaNotificationService::OnItemUnfrozen(const std::string& id) {
frozen_session_ids_.erase(id); frozen_session_ids_.erase(id);
......
...@@ -17,10 +17,12 @@ ...@@ -17,10 +17,12 @@
#include "chrome/browser/media/router/presentation/web_contents_presentation_manager.h" #include "chrome/browser/media/router/presentation/web_contents_presentation_manager.h"
#include "chrome/browser/ui/global_media_controls/cast_media_notification_provider.h" #include "chrome/browser/ui/global_media_controls/cast_media_notification_provider.h"
#include "chrome/browser/ui/global_media_controls/media_notification_container_observer.h" #include "chrome/browser/ui/global_media_controls/media_notification_container_observer.h"
#include "chrome/browser/ui/global_media_controls/media_notification_device_provider.h"
#include "chrome/browser/ui/global_media_controls/overlay_media_notifications_manager_impl.h" #include "chrome/browser/ui/global_media_controls/overlay_media_notifications_manager_impl.h"
#include "components/keyed_service/core/keyed_service.h" #include "components/keyed_service/core/keyed_service.h"
#include "components/media_message_center/media_notification_controller.h" #include "components/media_message_center/media_notification_controller.h"
#include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_observer.h"
#include "media/audio/audio_device_description.h"
#include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/remote.h"
#include "services/media_session/public/mojom/audio_focus.mojom.h" #include "services/media_session/public/mojom/audio_focus.mojom.h"
...@@ -104,6 +106,16 @@ class MediaNotificationService ...@@ -104,6 +106,16 @@ class MediaNotificationService
// Called by a |MediaNotificationService::Session| when it becomes inactive. // Called by a |MediaNotificationService::Session| when it becomes inactive.
void OnSessionBecameInactive(const std::string& id); void OnSessionBecameInactive(const std::string& id);
// Used by a |MediaNotificationAudioDeviceSelectorView| to query the system
// for connected audio output devices.
std::unique_ptr<MediaNotificationDeviceProvider::
GetOutputDevicesCallbackList::Subscription>
GetOutputDevices(
MediaNotificationDeviceProvider::GetOutputDevicesCallback callback);
void set_device_provider_for_testing(
std::unique_ptr<MediaNotificationDeviceProvider> device_provider);
private: private:
friend class MediaNotificationServiceTest; friend class MediaNotificationServiceTest;
friend class MediaToolbarButtonControllerTest; friend class MediaToolbarButtonControllerTest;
...@@ -280,6 +292,8 @@ class MediaNotificationService ...@@ -280,6 +292,8 @@ class MediaNotificationService
// source. We use this to cap the number of UKM recordings per site. // source. We use this to cap the number of UKM recordings per site.
std::map<ukm::SourceId, int> actions_recorded_to_ukm_; std::map<ukm::SourceId, int> actions_recorded_to_ukm_;
std::unique_ptr<MediaNotificationDeviceProvider> device_provider_;
base::WeakPtrFactory<MediaNotificationService> weak_ptr_factory_{this}; base::WeakPtrFactory<MediaNotificationService> weak_ptr_factory_{this};
}; };
......
...@@ -64,7 +64,7 @@ MediaNotificationContainerImpl* MediaDialogView::ShowMediaSession( ...@@ -64,7 +64,7 @@ MediaNotificationContainerImpl* MediaDialogView::ShowMediaSession(
const std::string& id, const std::string& id,
base::WeakPtr<media_message_center::MediaNotificationItem> item) { base::WeakPtr<media_message_center::MediaNotificationItem> item) {
auto container = auto container =
std::make_unique<MediaNotificationContainerImplView>(id, item); std::make_unique<MediaNotificationContainerImplView>(id, item, service_);
MediaNotificationContainerImplView* container_ptr = container.get(); MediaNotificationContainerImplView* container_ptr = container.get();
container_ptr->AddObserver(this); container_ptr->AddObserver(this);
observed_containers_[id] = container_ptr; observed_containers_[id] = container_ptr;
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "chrome/app/vector_icons/vector_icons.h" #include "chrome/app/vector_icons/vector_icons.h"
#include "chrome/browser/ui/global_media_controls/media_notification_service.h"
#include "chrome/browser/ui/views/global_media_controls/media_notification_container_impl_view.h" #include "chrome/browser/ui/views/global_media_controls/media_notification_container_impl_view.h"
#include "components/vector_icons/vector_icons.h" #include "components/vector_icons/vector_icons.h"
#include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/paint_vector_icon.h"
...@@ -42,9 +43,10 @@ constexpr gfx::Insets kDeviceButtonInsets = gfx::Insets(5); ...@@ -42,9 +43,10 @@ constexpr gfx::Insets kDeviceButtonInsets = gfx::Insets(5);
MediaNotificationAudioDeviceSelectorView:: MediaNotificationAudioDeviceSelectorView::
MediaNotificationAudioDeviceSelectorView( MediaNotificationAudioDeviceSelectorView(
MediaNotificationContainerImplView* container, MediaNotificationContainerImplView* container,
MediaNotificationService* service,
gfx::Size size) gfx::Size size)
: container_(container) { : container_(container), service_(service) {
DCHECK(container_); DCHECK(service);
SetPreferredSize(size); SetPreferredSize(size);
SetLayoutManager(std::make_unique<views::BoxLayout>( SetLayoutManager(std::make_unique<views::BoxLayout>(
...@@ -93,10 +95,23 @@ MediaNotificationAudioDeviceSelectorView:: ...@@ -93,10 +95,23 @@ MediaNotificationAudioDeviceSelectorView::
views::SetToggledImageFromVectorIconWithColor( views::SetToggledImageFromVectorIconWithColor(
expand_button_, kKeyboardArrowUpIcon, kExpandButtonSize, SK_ColorBLACK, expand_button_, kKeyboardArrowUpIcon, kExpandButtonSize, SK_ColorBLACK,
SK_ColorBLACK); SK_ColorBLACK);
// Get a list of the connected audio output devices
audio_device_subscription_ = service_->GetOutputDevices(base::BindOnce(
&MediaNotificationAudioDeviceSelectorView::UpdateAvailableAudioDevices,
weak_ptr_factory_.GetWeakPtr()));
} }
MediaNotificationAudioDeviceSelectorView::
~MediaNotificationAudioDeviceSelectorView() = default;
void MediaNotificationAudioDeviceSelectorView::UpdateAvailableAudioDevices( void MediaNotificationAudioDeviceSelectorView::UpdateAvailableAudioDevices(
const media::AudioDeviceDescriptions& device_descriptions) {} const media::AudioDeviceDescriptions& device_descriptions) {
device_button_container_->RemoveAllChildViews(true);
for (auto description : device_descriptions) {
CreateDeviceButton(description);
}
}
void MediaNotificationAudioDeviceSelectorView::ButtonPressed( void MediaNotificationAudioDeviceSelectorView::ButtonPressed(
views::Button* sender, views::Button* sender,
......
...@@ -5,23 +5,26 @@ ...@@ -5,23 +5,26 @@
#ifndef CHROME_BROWSER_UI_VIEWS_GLOBAL_MEDIA_CONTROLS_MEDIA_NOTIFICATION_AUDIO_DEVICE_SELECTOR_VIEW_H_ #ifndef CHROME_BROWSER_UI_VIEWS_GLOBAL_MEDIA_CONTROLS_MEDIA_NOTIFICATION_AUDIO_DEVICE_SELECTOR_VIEW_H_
#define CHROME_BROWSER_UI_VIEWS_GLOBAL_MEDIA_CONTROLS_MEDIA_NOTIFICATION_AUDIO_DEVICE_SELECTOR_VIEW_H_ #define CHROME_BROWSER_UI_VIEWS_GLOBAL_MEDIA_CONTROLS_MEDIA_NOTIFICATION_AUDIO_DEVICE_SELECTOR_VIEW_H_
#include "chrome/browser/ui/global_media_controls/media_notification_device_provider.h"
#include "media/audio/audio_device_description.h" #include "media/audio/audio_device_description.h"
#include "ui/views/controls/button/image_button.h" #include "ui/views/controls/button/image_button.h"
#include "ui/views/layout/box_layout.h" #include "ui/views/layout/box_layout.h"
class MediaNotificationContainerImplView; class MediaNotificationContainerImplView;
class MediaNotificationService;
class MediaNotificationAudioDeviceSelectorView : public views::View, class MediaNotificationAudioDeviceSelectorView : public views::View,
public views::ButtonListener { public views::ButtonListener {
public: public:
explicit MediaNotificationAudioDeviceSelectorView( MediaNotificationAudioDeviceSelectorView(
MediaNotificationContainerImplView* container, MediaNotificationContainerImplView* container,
MediaNotificationService* service,
gfx::Size size); gfx::Size size);
MediaNotificationAudioDeviceSelectorView( MediaNotificationAudioDeviceSelectorView(
const MediaNotificationAudioDeviceSelectorView&) = delete; const MediaNotificationAudioDeviceSelectorView&) = delete;
MediaNotificationAudioDeviceSelectorView& operator=( MediaNotificationAudioDeviceSelectorView& operator=(
const MediaNotificationAudioDeviceSelectorView&) = delete; const MediaNotificationAudioDeviceSelectorView&) = delete;
~MediaNotificationAudioDeviceSelectorView() override = default; ~MediaNotificationAudioDeviceSelectorView() override;
// Called when audio output devices are discovered. // Called when audio output devices are discovered.
void UpdateAvailableAudioDevices( void UpdateAvailableAudioDevices(
...@@ -31,17 +34,29 @@ class MediaNotificationAudioDeviceSelectorView : public views::View, ...@@ -31,17 +34,29 @@ class MediaNotificationAudioDeviceSelectorView : public views::View,
void ButtonPressed(views::Button* sender, const ui::Event& event) override; void ButtonPressed(views::Button* sender, const ui::Event& event) override;
private: private:
FRIEND_TEST_ALL_PREFIXES(MediaNotificationAudioDeviceSelectorViewTest,
DeviceButtonsCreated);
void CreateDeviceButton( void CreateDeviceButton(
const media::AudioDeviceDescription& device_description); const media::AudioDeviceDescription& device_description);
// The parent container // The parent container
MediaNotificationContainerImplView* const container_ = nullptr; MediaNotificationContainerImplView* const container_;
MediaNotificationService* const service_;
std::unique_ptr<MediaNotificationDeviceProvider::
GetOutputDevicesCallbackList::Subscription>
audio_device_subscription_;
// Subviews // Subviews
views::View* device_button_container_ = nullptr; views::View* device_button_container_ = nullptr;
views::View* expand_button_container_ = nullptr; views::View* expand_button_container_ = nullptr;
views::ToggleImageButton* expand_button_ = nullptr; views::ToggleImageButton* expand_button_ = nullptr;
base::WeakPtrFactory<MediaNotificationAudioDeviceSelectorView>
weak_ptr_factory_{this};
}; };
#endif // CHROME_BROWSER_UI_VIEWS_GLOBAL_MEDIA_CONTROLS_MEDIA_NOTIFICATION_AUDIO_DEVICE_SELECTOR_VIEW_H_ #endif // CHROME_BROWSER_UI_VIEWS_GLOBAL_MEDIA_CONTROLS_MEDIA_NOTIFICATION_AUDIO_DEVICE_SELECTOR_VIEW_H_
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/views/global_media_controls/media_notification_audio_device_selector_view.h"
#include "base/strings/string16.h"
#include "chrome/browser/media/router/media_router_factory.h"
#include "chrome/browser/media/router/test/mock_media_router.h"
#include "chrome/browser/ui/global_media_controls/media_notification_device_provider.h"
#include "chrome/browser/ui/global_media_controls/media_notification_service.h"
#include "chrome/test/base/testing_profile.h"
#include "chrome/test/views/chrome_views_test_base.h"
#include "media/audio/audio_device_description.h"
#include "ui/views/controls/button/label_button.h"
namespace {
class MockMediaNotificationDeviceProvider
: public MediaNotificationDeviceProvider {
public:
MockMediaNotificationDeviceProvider() = default;
~MockMediaNotificationDeviceProvider() override = default;
void AddDevice(const std::string& device_name, const std::string& device_id) {
device_descriptions.emplace_back(device_name, device_id, "");
}
std::unique_ptr<MediaNotificationDeviceProvider::
GetOutputDevicesCallbackList::Subscription>
GetOutputDeviceDescriptions(GetOutputDevicesCallback cb) override {
std::move(cb).Run(device_descriptions);
return std::unique_ptr<MockMediaNotificationDeviceProvider::
GetOutputDevicesCallbackList::Subscription>(
nullptr);
}
media::AudioDeviceDescriptions device_descriptions;
};
} // anonymous namespace
class MediaNotificationAudioDeviceSelectorViewTest
: public ChromeViewsTestBase {
public:
MediaNotificationAudioDeviceSelectorViewTest() = default;
~MediaNotificationAudioDeviceSelectorViewTest() override = default;
// ChromeViewsTestBase
void SetUp() override {
ChromeViewsTestBase::SetUp();
provider_ = std::make_unique<MockMediaNotificationDeviceProvider>();
media_router::MediaRouterFactory::GetInstance()->SetTestingFactory(
&profile_, base::BindRepeating(&media_router::MockMediaRouter::Create));
service_ = std::make_unique<MediaNotificationService>(&profile_);
}
void TearDown() override {
view_.reset();
service_.reset();
provider_.reset();
ChromeViewsTestBase::TearDown();
}
TestingProfile profile_;
std::unique_ptr<MockMediaNotificationDeviceProvider> provider_;
std::unique_ptr<MediaNotificationService> service_;
std::unique_ptr<MediaNotificationAudioDeviceSelectorView> view_;
};
TEST_F(MediaNotificationAudioDeviceSelectorViewTest, DeviceButtonsCreated) {
// Buttons should be created for every device reported by the provider
provider_->AddDevice("Speaker", "1");
provider_->AddDevice("Headphones", "2");
provider_->AddDevice("Earbuds", "3");
service_->set_device_provider_for_testing(std::move(provider_));
view_ = std::make_unique<MediaNotificationAudioDeviceSelectorView>(
nullptr, service_.get(), gfx::Size());
std::vector<std::string> button_texts;
ASSERT_TRUE(view_->device_button_container_ != nullptr);
std::transform(
view_->device_button_container_->children().cbegin(),
view_->device_button_container_->children().cend(),
std::back_inserter(button_texts), [](views::View* child) {
return base::UTF16ToASCII(
static_cast<const views::LabelButton*>(child)->GetText());
});
EXPECT_THAT(button_texts, testing::UnorderedElementsAre(
"Speaker", "Headphones", "Earbuds"));
}
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "base/feature_list.h" #include "base/feature_list.h"
#include "chrome/browser/ui/global_media_controls/media_notification_container_observer.h" #include "chrome/browser/ui/global_media_controls/media_notification_container_observer.h"
#include "chrome/browser/ui/global_media_controls/media_notification_service.h"
#include "chrome/browser/ui/global_media_controls/media_toolbar_button_controller.h" #include "chrome/browser/ui/global_media_controls/media_toolbar_button_controller.h"
#include "chrome/browser/ui/views/global_media_controls/media_dialog_view.h" #include "chrome/browser/ui/views/global_media_controls/media_dialog_view.h"
#include "chrome/browser/ui/views/global_media_controls/media_notification_audio_device_selector_view.h" #include "chrome/browser/ui/views/global_media_controls/media_notification_audio_device_selector_view.h"
...@@ -73,11 +74,13 @@ class MediaNotificationContainerImplView::DismissButton ...@@ -73,11 +74,13 @@ class MediaNotificationContainerImplView::DismissButton
MediaNotificationContainerImplView::MediaNotificationContainerImplView( MediaNotificationContainerImplView::MediaNotificationContainerImplView(
const std::string& id, const std::string& id,
base::WeakPtr<media_message_center::MediaNotificationItem> item) base::WeakPtr<media_message_center::MediaNotificationItem> item,
MediaNotificationService* service)
: views::Button(this), : views::Button(this),
id_(id), id_(id),
foreground_color_(kDefaultForegroundColor), foreground_color_(kDefaultForegroundColor),
background_color_(kDefaultBackgroundColor) { background_color_(kDefaultBackgroundColor),
service_(service) {
SetLayoutManager(std::make_unique<views::BoxLayout>( SetLayoutManager(std::make_unique<views::BoxLayout>(
views::BoxLayout::Orientation::kVertical)); views::BoxLayout::Orientation::kVertical));
SetPreferredSize(kNormalSize); SetPreferredSize(kNormalSize);
...@@ -124,7 +127,7 @@ MediaNotificationContainerImplView::MediaNotificationContainerImplView( ...@@ -124,7 +127,7 @@ MediaNotificationContainerImplView::MediaNotificationContainerImplView(
media::kGlobalMediaControlsSeamlessTransfer)) { media::kGlobalMediaControlsSeamlessTransfer)) {
auto audio_device_selector_view = auto audio_device_selector_view =
std::make_unique<MediaNotificationAudioDeviceSelectorView>( std::make_unique<MediaNotificationAudioDeviceSelectorView>(
this, gfx::Size(kWidth, kAudioDeviceSelectorViewHeight)); this, service_, gfx::Size(kWidth, kAudioDeviceSelectorViewHeight));
audio_device_selector_view_ = audio_device_selector_view_ =
AddChildView(std::move(audio_device_selector_view)); AddChildView(std::move(audio_device_selector_view));
view_->UpdateCornerRadius(message_center::kNotificationCornerRadius, 0); view_->UpdateCornerRadius(message_center::kNotificationCornerRadius, 0);
......
...@@ -29,6 +29,7 @@ class SlideOutController; ...@@ -29,6 +29,7 @@ class SlideOutController;
class MediaNotificationAudioDeviceSelectorView; class MediaNotificationAudioDeviceSelectorView;
class MediaNotificationContainerObserver; class MediaNotificationContainerObserver;
class MediaNotificationService;
// MediaNotificationContainerImplView holds a media notification for display // MediaNotificationContainerImplView holds a media notification for display
// within the MediaDialogView. The media notification shows metadata for a media // within the MediaDialogView. The media notification shows metadata for a media
...@@ -43,7 +44,8 @@ class MediaNotificationContainerImplView ...@@ -43,7 +44,8 @@ class MediaNotificationContainerImplView
public: public:
MediaNotificationContainerImplView( MediaNotificationContainerImplView(
const std::string& id, const std::string& id,
base::WeakPtr<media_message_center::MediaNotificationItem> item); base::WeakPtr<media_message_center::MediaNotificationItem> item,
MediaNotificationService* service);
~MediaNotificationContainerImplView() override; ~MediaNotificationContainerImplView() override;
// views::Button: // views::Button:
...@@ -183,6 +185,8 @@ class MediaNotificationContainerImplView ...@@ -183,6 +185,8 @@ class MediaNotificationContainerImplView
views::UniqueWidgetPtr drag_image_widget_; views::UniqueWidgetPtr drag_image_widget_;
MediaNotificationService* const service_;
DISALLOW_COPY_AND_ASSIGN(MediaNotificationContainerImplView); DISALLOW_COPY_AND_ASSIGN(MediaNotificationContainerImplView);
}; };
......
...@@ -64,7 +64,7 @@ class MediaNotificationContainerImplViewTest : public ChromeViewsTestBase { ...@@ -64,7 +64,7 @@ class MediaNotificationContainerImplViewTest : public ChromeViewsTestBase {
notification_container_ = widget_->SetContentsView( notification_container_ = widget_->SetContentsView(
std::make_unique<MediaNotificationContainerImplView>( std::make_unique<MediaNotificationContainerImplView>(
kTestNotificationId, nullptr)); kTestNotificationId, nullptr, nullptr));
observer_ = std::make_unique<MockMediaNotificationContainerObserver>(); observer_ = std::make_unique<MockMediaNotificationContainerObserver>();
notification_container_->AddObserver(observer_.get()); notification_container_->AddObserver(observer_.get());
...@@ -381,7 +381,7 @@ TEST_F(MediaNotificationContainerImplViewTest, SendsMetadataUpdates) { ...@@ -381,7 +381,7 @@ TEST_F(MediaNotificationContainerImplViewTest, SendsMetadataUpdates) {
TEST_F(MediaNotificationContainerImplViewTest, SendsDestroyedUpdates) { TEST_F(MediaNotificationContainerImplViewTest, SendsDestroyedUpdates) {
auto container = std::make_unique<MediaNotificationContainerImplView>( auto container = std::make_unique<MediaNotificationContainerImplView>(
kOtherTestNotificationId, nullptr); kOtherTestNotificationId, nullptr, nullptr);
MockMediaNotificationContainerObserver observer; MockMediaNotificationContainerObserver observer;
container->AddObserver(&observer); container->AddObserver(&observer);
......
...@@ -43,7 +43,8 @@ class MediaNotificationListViewTest : public ChromeViewsTestBase { ...@@ -43,7 +43,8 @@ class MediaNotificationListViewTest : public ChromeViewsTestBase {
void ShowNotification(const std::string& id) { void ShowNotification(const std::string& id) {
list_view_->ShowNotification( list_view_->ShowNotification(
id, std::make_unique<MediaNotificationContainerImplView>(id, nullptr)); id, std::make_unique<MediaNotificationContainerImplView>(id, nullptr,
nullptr));
} }
void HideNotification(const std::string& id) { void HideNotification(const std::string& id) {
......
...@@ -41,7 +41,7 @@ class OverlayMediaNotificationViewTest : public ChromeViewsTestBase { ...@@ -41,7 +41,7 @@ class OverlayMediaNotificationViewTest : public ChromeViewsTestBase {
manager_ = std::make_unique<MockOverlayMediaNotificationsManager>(); manager_ = std::make_unique<MockOverlayMediaNotificationsManager>();
auto notification = std::make_unique<MediaNotificationContainerImplView>( auto notification = std::make_unique<MediaNotificationContainerImplView>(
kTestNotificationId, nullptr); kTestNotificationId, nullptr, nullptr);
notification->PopOut(); notification->PopOut();
overlay_ = std::make_unique<OverlayMediaNotificationView>( overlay_ = std::make_unique<OverlayMediaNotificationView>(
......
...@@ -5486,6 +5486,7 @@ test("unit_tests") { ...@@ -5486,6 +5486,7 @@ test("unit_tests") {
"../browser/ui/views/frame/test_with_browser_view.h", "../browser/ui/views/frame/test_with_browser_view.h",
"../browser/ui/views/frame/web_contents_close_handler_unittest.cc", "../browser/ui/views/frame/web_contents_close_handler_unittest.cc",
"../browser/ui/views/fullscreen_control/fullscreen_control_popup_unittest.cc", "../browser/ui/views/fullscreen_control/fullscreen_control_popup_unittest.cc",
"../browser/ui/views/global_media_controls/media_notification_audio_device_selector_view_unittest.cc",
"../browser/ui/views/global_media_controls/media_notification_container_impl_view_unittest.cc", "../browser/ui/views/global_media_controls/media_notification_container_impl_view_unittest.cc",
"../browser/ui/views/global_media_controls/media_notification_list_view_unittest.cc", "../browser/ui/views/global_media_controls/media_notification_list_view_unittest.cc",
"../browser/ui/views/global_media_controls/overlay_media_notification_view_unittest.cc", "../browser/ui/views/global_media_controls/overlay_media_notification_view_unittest.cc",
......
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