Commit 69c1b56d authored by Noah Rose Ledesma's avatar Noah Rose Ledesma Committed by Commit Bot

GMC: Add SetAudioSinkId to MediaNotificationService

Add a method to the notification service for switching audio output
devices. This currently has no effect.

Bug: 1096243
Change-Id: I638bf11c36a3b5d0aa7a3beece9394a1df8e545c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2293073Reviewed-by: default avatarTommy Steimel <steimel@chromium.org>
Commit-Queue: Noah Rose Ledesma <noahrose@google.com>
Cr-Commit-Position: refs/heads/master@{#791522}
parent 89ef33b9
...@@ -32,6 +32,10 @@ class MediaNotificationContainerObserver : public base::CheckedObserver { ...@@ -32,6 +32,10 @@ class MediaNotificationContainerObserver : public base::CheckedObserver {
virtual void OnContainerDraggedOut(const std::string& id, virtual void OnContainerDraggedOut(const std::string& id,
gfx::Rect bounds) = 0; gfx::Rect bounds) = 0;
// Called when the audio output device for the container should change
virtual void OnAudioSinkChosen(const std::string& id,
const std::string& sink_id) = 0;
protected: protected:
~MediaNotificationContainerObserver() override = default; ~MediaNotificationContainerObserver() override = default;
}; };
......
...@@ -174,6 +174,7 @@ void MediaNotificationService::Session::SetController( ...@@ -174,6 +174,7 @@ void MediaNotificationService::Session::SetController(
if (controller.is_bound()) { if (controller.is_bound()) {
observer_receiver_.reset(); observer_receiver_.reset();
controller->AddObserver(observer_receiver_.BindNewPipeAndPassRemote()); controller->AddObserver(observer_receiver_.BindNewPipeAndPassRemote());
controller_ = std::move(controller);
} }
} }
...@@ -220,6 +221,8 @@ bool MediaNotificationService::Session::IsPlaying() { ...@@ -220,6 +221,8 @@ bool MediaNotificationService::Session::IsPlaying() {
return is_playing_; return is_playing_;
} }
void MediaNotificationService::Session::SetAudioSinkId(const std::string& id) {}
// static // static
void MediaNotificationService::Session::RecordDismissReason( void MediaNotificationService::Session::RecordDismissReason(
GlobalMediaControlsDismissReason reason) { GlobalMediaControlsDismissReason reason) {
...@@ -557,6 +560,13 @@ void MediaNotificationService::OnContainerDraggedOut(const std::string& id, ...@@ -557,6 +560,13 @@ void MediaNotificationService::OnContainerDraggedOut(const std::string& id,
observer.OnNotificationListChanged(); observer.OnNotificationListChanged();
} }
void MediaNotificationService::OnAudioSinkChosen(const std::string& id,
const std::string& sink_id) {
auto it = sessions_.find(id);
DCHECK(it != sessions_.end());
it->second.SetAudioSinkId(sink_id);
}
void MediaNotificationService::Shutdown() { void MediaNotificationService::Shutdown() {
// |cast_notification_provider_| depends on MediaRouter, which is another // |cast_notification_provider_| depends on MediaRouter, which is another
// keyed service. // keyed service.
......
...@@ -78,6 +78,8 @@ class MediaNotificationService ...@@ -78,6 +78,8 @@ class MediaNotificationService
void OnContainerDismissed(const std::string& id) override; void OnContainerDismissed(const std::string& id) override;
void OnContainerDestroyed(const std::string& id) override; void OnContainerDestroyed(const std::string& id) override;
void OnContainerDraggedOut(const std::string& id, gfx::Rect bounds) override; void OnContainerDraggedOut(const std::string& id, gfx::Rect bounds) override;
void OnAudioSinkChosen(const std::string& id,
const std::string& sink_id) override;
// KeyedService implementation. // KeyedService implementation.
void Shutdown() override; void Shutdown() override;
...@@ -197,6 +199,8 @@ class MediaNotificationService ...@@ -197,6 +199,8 @@ class MediaNotificationService
bool IsPlaying(); bool IsPlaying();
void SetAudioSinkId(const std::string& id);
private: private:
static void RecordDismissReason(GlobalMediaControlsDismissReason reason); static void RecordDismissReason(GlobalMediaControlsDismissReason reason);
...@@ -233,6 +237,9 @@ class MediaNotificationService ...@@ -233,6 +237,9 @@ class MediaNotificationService
mojo::Receiver<media_session::mojom::MediaControllerObserver> mojo::Receiver<media_session::mojom::MediaControllerObserver>
observer_receiver_{this}; observer_receiver_{this};
// Used to request audio output be routed to a different device
mojo::Remote<media_session::mojom::MediaController> controller_;
base::WeakPtr<media_router::WebContentsPresentationManager> base::WeakPtr<media_router::WebContentsPresentationManager>
presentation_manager_; presentation_manager_;
}; };
......
...@@ -49,6 +49,8 @@ class MediaDialogView : public views::BubbleDialogDelegateView, ...@@ -49,6 +49,8 @@ class MediaDialogView : public views::BubbleDialogDelegateView,
void OnContainerDestroyed(const std::string& id) override; void OnContainerDestroyed(const std::string& id) override;
void OnContainerDraggedOut(const std::string& id, gfx::Rect bounds) override { void OnContainerDraggedOut(const std::string& id, gfx::Rect bounds) override {
} }
void OnAudioSinkChosen(const std::string& id,
const std::string& sink_id) override {}
void AddObserver(MediaDialogViewObserver* observer); void AddObserver(MediaDialogViewObserver* observer);
void RemoveObserver(MediaDialogViewObserver* observer); void RemoveObserver(MediaDialogViewObserver* observer);
......
...@@ -134,4 +134,5 @@ void MediaNotificationAudioDeviceSelectorView::CreateDeviceButton( ...@@ -134,4 +134,5 @@ void MediaNotificationAudioDeviceSelectorView::CreateDeviceButton(
button->SetBorder(std::move(border)); button->SetBorder(std::move(border));
device_button_container_->AddChildView(std::move(button)); device_button_container_->AddChildView(std::move(button));
device_button_container_->Layout();
} }
...@@ -340,6 +340,13 @@ void MediaNotificationContainerImplView::OnHeaderClicked() { ...@@ -340,6 +340,13 @@ void MediaNotificationContainerImplView::OnHeaderClicked() {
ContainerClicked(); ContainerClicked();
} }
void MediaNotificationContainerImplView::OnAudioSinkChosen(
const std::string& sink_id) {
for (auto& observer : observers_) {
observer.OnAudioSinkChosen(id_, sink_id);
}
}
ui::Layer* MediaNotificationContainerImplView::GetSlideOutLayer() { ui::Layer* MediaNotificationContainerImplView::GetSlideOutLayer() {
return swipeable_container_->layer(); return swipeable_container_->layer();
} }
......
...@@ -98,6 +98,9 @@ class MediaNotificationContainerImplView ...@@ -98,6 +98,9 @@ class MediaNotificationContainerImplView
const base::string16& GetTitle(); const base::string16& GetTitle();
// Called when an audio device has been selected for output.
void OnAudioSinkChosen(const std::string& sink_id);
views::ImageButton* GetDismissButtonForTesting(); views::ImageButton* GetDismissButtonForTesting();
media_message_center::MediaNotificationViewImpl* view_for_testing() { media_message_center::MediaNotificationViewImpl* view_for_testing() {
......
...@@ -44,6 +44,8 @@ class MockMediaNotificationContainerObserver ...@@ -44,6 +44,8 @@ class MockMediaNotificationContainerObserver
MOCK_METHOD1(OnContainerDestroyed, void(const std::string& id)); MOCK_METHOD1(OnContainerDestroyed, void(const std::string& id));
MOCK_METHOD2(OnContainerDraggedOut, MOCK_METHOD2(OnContainerDraggedOut,
void(const std::string& id, gfx::Rect bounds)); void(const std::string& id, gfx::Rect bounds));
MOCK_METHOD2(OnAudioSinkChosen,
void(const std::string& id, const std::string& sink_id));
private: private:
DISALLOW_COPY_AND_ASSIGN(MockMediaNotificationContainerObserver); DISALLOW_COPY_AND_ASSIGN(MockMediaNotificationContainerObserver);
...@@ -402,6 +404,13 @@ TEST_F(MediaNotificationContainerImplViewTest, SendsClicks) { ...@@ -402,6 +404,13 @@ TEST_F(MediaNotificationContainerImplViewTest, SendsClicks) {
SimulateHeaderClicked(); SimulateHeaderClicked();
} }
TEST_F(MediaNotificationContainerImplViewTest, SendsSinkUpdates) {
// The container should notify its observers when an audio output device has
// been chosen.
EXPECT_CALL(observer(), OnAudioSinkChosen(kTestNotificationId, "foobar"));
notification_container()->OnAudioSinkChosen("foobar");
}
TEST_F(MediaNotificationContainerImplViewOverlayControlsTest, TEST_F(MediaNotificationContainerImplViewOverlayControlsTest,
Dragging_VeryShortSendsClick) { Dragging_VeryShortSendsClick) {
// If the user presses and releases the mouse with only a very short drag, // If the user presses and releases the mouse with only a very short drag,
......
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