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 {
virtual void OnContainerDraggedOut(const std::string& id,
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:
~MediaNotificationContainerObserver() override = default;
};
......
......@@ -174,6 +174,7 @@ void MediaNotificationService::Session::SetController(
if (controller.is_bound()) {
observer_receiver_.reset();
controller->AddObserver(observer_receiver_.BindNewPipeAndPassRemote());
controller_ = std::move(controller);
}
}
......@@ -220,6 +221,8 @@ bool MediaNotificationService::Session::IsPlaying() {
return is_playing_;
}
void MediaNotificationService::Session::SetAudioSinkId(const std::string& id) {}
// static
void MediaNotificationService::Session::RecordDismissReason(
GlobalMediaControlsDismissReason reason) {
......@@ -557,6 +560,13 @@ void MediaNotificationService::OnContainerDraggedOut(const std::string& id,
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() {
// |cast_notification_provider_| depends on MediaRouter, which is another
// keyed service.
......
......@@ -78,6 +78,8 @@ class MediaNotificationService
void OnContainerDismissed(const std::string& id) override;
void OnContainerDestroyed(const std::string& id) 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.
void Shutdown() override;
......@@ -197,6 +199,8 @@ class MediaNotificationService
bool IsPlaying();
void SetAudioSinkId(const std::string& id);
private:
static void RecordDismissReason(GlobalMediaControlsDismissReason reason);
......@@ -233,6 +237,9 @@ class MediaNotificationService
mojo::Receiver<media_session::mojom::MediaControllerObserver>
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>
presentation_manager_;
};
......
......@@ -49,6 +49,8 @@ class MediaDialogView : public views::BubbleDialogDelegateView,
void OnContainerDestroyed(const std::string& id) 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 RemoveObserver(MediaDialogViewObserver* observer);
......
......@@ -134,4 +134,5 @@ void MediaNotificationAudioDeviceSelectorView::CreateDeviceButton(
button->SetBorder(std::move(border));
device_button_container_->AddChildView(std::move(button));
device_button_container_->Layout();
}
......@@ -340,6 +340,13 @@ void MediaNotificationContainerImplView::OnHeaderClicked() {
ContainerClicked();
}
void MediaNotificationContainerImplView::OnAudioSinkChosen(
const std::string& sink_id) {
for (auto& observer : observers_) {
observer.OnAudioSinkChosen(id_, sink_id);
}
}
ui::Layer* MediaNotificationContainerImplView::GetSlideOutLayer() {
return swipeable_container_->layer();
}
......
......@@ -98,6 +98,9 @@ class MediaNotificationContainerImplView
const base::string16& GetTitle();
// Called when an audio device has been selected for output.
void OnAudioSinkChosen(const std::string& sink_id);
views::ImageButton* GetDismissButtonForTesting();
media_message_center::MediaNotificationViewImpl* view_for_testing() {
......
......@@ -44,6 +44,8 @@ class MockMediaNotificationContainerObserver
MOCK_METHOD1(OnContainerDestroyed, void(const std::string& id));
MOCK_METHOD2(OnContainerDraggedOut,
void(const std::string& id, gfx::Rect bounds));
MOCK_METHOD2(OnAudioSinkChosen,
void(const std::string& id, const std::string& sink_id));
private:
DISALLOW_COPY_AND_ASSIGN(MockMediaNotificationContainerObserver);
......@@ -402,6 +404,13 @@ TEST_F(MediaNotificationContainerImplViewTest, SendsClicks) {
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,
Dragging_VeryShortSendsClick) {
// 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