Commit ebd54602 authored by Michael Sun's avatar Michael Sun Committed by Commit Bot

[Media Keys] Add handling for Media Play

Unlike most keyboards, which have a single Play/Pause toggle key,
Bluetooth devices with AVRCP (Audio/Video Remote Control Profile)
generate separate Play and Pause key events based on the media status.
This patch adds handling for the Play media key.

BUG=b/147364135

Change-Id: Ie3cbc4c02ceab8e317f79d089eb8b163aa3ed658
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2062941Reviewed-by: default avatarMitsuru Oshima <oshima@chromium.org>
Reviewed-by: default avatarBecca Hughes <beccahughes@chromium.org>
Commit-Queue: Michael Sun <michaelfsun@google.com>
Cr-Commit-Position: refs/heads/master@{#742767}
parent 3aaf65aa
...@@ -127,6 +127,31 @@ void MediaControllerImpl::HandleMediaPlayPause() { ...@@ -127,6 +127,31 @@ void MediaControllerImpl::HandleMediaPlayPause() {
client_->HandleMediaPlayPause(); client_->HandleMediaPlayPause();
} }
void MediaControllerImpl::HandleMediaPlay() {
if (Shell::Get()->session_controller()->IsScreenLocked() &&
!AreLockScreenMediaKeysEnabled()) {
return;
}
ui::RecordMediaHardwareKeyAction(ui::MediaHardwareKeyAction::kPlay);
// If the |client_| is force handling the keys then we should forward them.
if (client_ && force_media_client_key_handling_) {
client_->HandleMediaPlay();
return;
}
// If media session media key handling is enabled. Fire play using the media
// session service.
if (ShouldUseMediaSession()) {
GetMediaSessionController()->Resume();
return;
}
if (client_)
client_->HandleMediaPlay();
}
void MediaControllerImpl::HandleMediaNextTrack() { void MediaControllerImpl::HandleMediaNextTrack() {
if (Shell::Get()->session_controller()->IsScreenLocked() && if (Shell::Get()->session_controller()->IsScreenLocked() &&
!AreLockScreenMediaKeysEnabled()) { !AreLockScreenMediaKeysEnabled()) {
......
...@@ -60,6 +60,7 @@ class ASH_EXPORT MediaControllerImpl ...@@ -60,6 +60,7 @@ class ASH_EXPORT MediaControllerImpl
// media session service to control playback. Otherwise it will forward to // media session service to control playback. Otherwise it will forward to
// |client_|. // |client_|.
void HandleMediaPlayPause(); void HandleMediaPlayPause();
void HandleMediaPlay();
void HandleMediaNextTrack(); void HandleMediaNextTrack();
void HandleMediaPrevTrack(); void HandleMediaPrevTrack();
......
...@@ -72,6 +72,8 @@ class MediaControllerTest : public AshTestBase { ...@@ -72,6 +72,8 @@ class MediaControllerTest : public AshTestBase {
void HandleMediaKeys() { void HandleMediaKeys() {
Shell::Get()->media_controller()->HandleMediaPlayPause(); Shell::Get()->media_controller()->HandleMediaPlayPause();
Flush(); Flush();
Shell::Get()->media_controller()->HandleMediaPlay();
Flush();
Shell::Get()->media_controller()->HandleMediaPrevTrack(); Shell::Get()->media_controller()->HandleMediaPrevTrack();
Flush(); Flush();
Shell::Get()->media_controller()->HandleMediaNextTrack(); Shell::Get()->media_controller()->HandleMediaNextTrack();
...@@ -86,12 +88,14 @@ class MediaControllerTest : public AshTestBase { ...@@ -86,12 +88,14 @@ class MediaControllerTest : public AshTestBase {
TEST_F(MediaControllerTest, EnableMediaKeysWhenUnlocked) { TEST_F(MediaControllerTest, EnableMediaKeysWhenUnlocked) {
EXPECT_EQ(0, controller()->suspend_count()); EXPECT_EQ(0, controller()->suspend_count());
EXPECT_EQ(0, controller()->resume_count());
EXPECT_EQ(0, controller()->previous_track_count()); EXPECT_EQ(0, controller()->previous_track_count());
EXPECT_EQ(0, controller()->next_track_count()); EXPECT_EQ(0, controller()->next_track_count());
HandleMediaKeys(); HandleMediaKeys();
EXPECT_EQ(1, controller()->suspend_count()); EXPECT_EQ(1, controller()->suspend_count());
EXPECT_EQ(1, controller()->resume_count());
EXPECT_EQ(1, controller()->previous_track_count()); EXPECT_EQ(1, controller()->previous_track_count());
EXPECT_EQ(1, controller()->next_track_count()); EXPECT_EQ(1, controller()->next_track_count());
} }
...@@ -146,6 +150,7 @@ TEST_F(MediaControllerTest, EnableMediaKeysWhenLockedAndControlsEnabled) { ...@@ -146,6 +150,7 @@ TEST_F(MediaControllerTest, EnableMediaKeysWhenLockedAndControlsEnabled) {
prefs->SetBoolean(prefs::kLockScreenMediaControlsEnabled, true); prefs->SetBoolean(prefs::kLockScreenMediaControlsEnabled, true);
EXPECT_EQ(0, controller()->suspend_count()); EXPECT_EQ(0, controller()->suspend_count());
EXPECT_EQ(0, controller()->resume_count());
EXPECT_EQ(0, controller()->previous_track_count()); EXPECT_EQ(0, controller()->previous_track_count());
EXPECT_EQ(0, controller()->next_track_count()); EXPECT_EQ(0, controller()->next_track_count());
...@@ -154,6 +159,7 @@ TEST_F(MediaControllerTest, EnableMediaKeysWhenLockedAndControlsEnabled) { ...@@ -154,6 +159,7 @@ TEST_F(MediaControllerTest, EnableMediaKeysWhenLockedAndControlsEnabled) {
HandleMediaKeys(); HandleMediaKeys();
EXPECT_EQ(1, controller()->suspend_count()); EXPECT_EQ(1, controller()->suspend_count());
EXPECT_EQ(1, controller()->resume_count());
EXPECT_EQ(1, controller()->previous_track_count()); EXPECT_EQ(1, controller()->previous_track_count());
EXPECT_EQ(1, controller()->next_track_count()); EXPECT_EQ(1, controller()->next_track_count());
} }
...@@ -164,6 +170,7 @@ TEST_F(MediaControllerTest, DisableMediaKeysWhenLockedAndControlsDisabled) { ...@@ -164,6 +170,7 @@ TEST_F(MediaControllerTest, DisableMediaKeysWhenLockedAndControlsDisabled) {
prefs->SetBoolean(prefs::kLockScreenMediaControlsEnabled, false); prefs->SetBoolean(prefs::kLockScreenMediaControlsEnabled, false);
EXPECT_EQ(0, controller()->suspend_count()); EXPECT_EQ(0, controller()->suspend_count());
EXPECT_EQ(0, controller()->resume_count());
EXPECT_EQ(0, controller()->previous_track_count()); EXPECT_EQ(0, controller()->previous_track_count());
EXPECT_EQ(0, controller()->next_track_count()); EXPECT_EQ(0, controller()->next_track_count());
...@@ -172,6 +179,7 @@ TEST_F(MediaControllerTest, DisableMediaKeysWhenLockedAndControlsDisabled) { ...@@ -172,6 +179,7 @@ TEST_F(MediaControllerTest, DisableMediaKeysWhenLockedAndControlsDisabled) {
HandleMediaKeys(); HandleMediaKeys();
EXPECT_EQ(0, controller()->suspend_count()); EXPECT_EQ(0, controller()->suspend_count());
EXPECT_EQ(0, controller()->resume_count());
EXPECT_EQ(0, controller()->previous_track_count()); EXPECT_EQ(0, controller()->previous_track_count());
EXPECT_EQ(0, controller()->next_track_count()); EXPECT_EQ(0, controller()->next_track_count());
} }
......
...@@ -18,6 +18,9 @@ class ASH_PUBLIC_EXPORT MediaClient { ...@@ -18,6 +18,9 @@ class ASH_PUBLIC_EXPORT MediaClient {
// Handles the Play/Pause Toggle Media shortcut key. // Handles the Play/Pause Toggle Media shortcut key.
virtual void HandleMediaPlayPause() = 0; virtual void HandleMediaPlayPause() = 0;
// Handles the Play Media shortcut key.
virtual void HandleMediaPlay() = 0;
// Handles the Previous Track Media shortcut key. // Handles the Previous Track Media shortcut key.
virtual void HandleMediaPrevTrack() = 0; virtual void HandleMediaPrevTrack() = 0;
......
...@@ -17,6 +17,10 @@ void TestMediaClient::HandleMediaPlayPause() { ...@@ -17,6 +17,10 @@ void TestMediaClient::HandleMediaPlayPause() {
++handle_media_play_pause_count_; ++handle_media_play_pause_count_;
} }
void TestMediaClient::HandleMediaPlay() {
++handle_media_play_count_;
}
void TestMediaClient::HandleMediaPrevTrack() { void TestMediaClient::HandleMediaPrevTrack() {
++handle_media_prev_track_count_; ++handle_media_prev_track_count_;
} }
......
...@@ -20,6 +20,7 @@ class TestMediaClient : public MediaClient { ...@@ -20,6 +20,7 @@ class TestMediaClient : public MediaClient {
// MediaClient: // MediaClient:
void HandleMediaNextTrack() override; void HandleMediaNextTrack() override;
void HandleMediaPlayPause() override; void HandleMediaPlayPause() override;
void HandleMediaPlay() override;
void HandleMediaPrevTrack() override; void HandleMediaPrevTrack() override;
void RequestCaptureState() override; void RequestCaptureState() override;
void SuspendMediaSessions() override; void SuspendMediaSessions() override;
...@@ -30,6 +31,7 @@ class TestMediaClient : public MediaClient { ...@@ -30,6 +31,7 @@ class TestMediaClient : public MediaClient {
int handle_media_play_pause_count() const { int handle_media_play_pause_count() const {
return handle_media_play_pause_count_; return handle_media_play_pause_count_;
} }
int handle_media_play_count() const { return handle_media_play_count_; }
int handle_media_prev_track_count() const { int handle_media_prev_track_count() const {
return handle_media_prev_track_count_; return handle_media_prev_track_count_;
} }
...@@ -38,6 +40,7 @@ class TestMediaClient : public MediaClient { ...@@ -38,6 +40,7 @@ class TestMediaClient : public MediaClient {
private: private:
int handle_media_next_track_count_ = 0; int handle_media_next_track_count_ = 0;
int handle_media_play_pause_count_ = 0; int handle_media_play_pause_count_ = 0;
int handle_media_play_count_ = 0;
int handle_media_prev_track_count_ = 0; int handle_media_prev_track_count_ = 0;
bool media_sessions_suspended_ = false; bool media_sessions_suspended_ = false;
......
...@@ -181,6 +181,10 @@ void MediaClientImpl::HandleMediaPlayPause() { ...@@ -181,6 +181,10 @@ void MediaClientImpl::HandleMediaPlayPause() {
HandleMediaAction(ui::VKEY_MEDIA_PLAY_PAUSE); HandleMediaAction(ui::VKEY_MEDIA_PLAY_PAUSE);
} }
void MediaClientImpl::HandleMediaPlay() {
HandleMediaAction(ui::VKEY_MEDIA_PLAY);
}
void MediaClientImpl::HandleMediaPrevTrack() { void MediaClientImpl::HandleMediaPrevTrack() {
HandleMediaAction(ui::VKEY_MEDIA_PREV_TRACK); HandleMediaAction(ui::VKEY_MEDIA_PREV_TRACK);
} }
...@@ -295,6 +299,9 @@ void MediaClientImpl::HandleMediaAction(ui::KeyboardCode keycode) { ...@@ -295,6 +299,9 @@ void MediaClientImpl::HandleMediaAction(ui::KeyboardCode keycode) {
case ui::VKEY_MEDIA_PLAY_PAUSE: case ui::VKEY_MEDIA_PLAY_PAUSE:
router->NotifyTogglePlayState(); router->NotifyTogglePlayState();
break; break;
// TODO(https://crbug.com/1053777): Handle media action for VKEY_MEDIA_PLAY.
case ui::VKEY_MEDIA_PLAY:
break;
default: default:
break; break;
} }
......
...@@ -37,6 +37,7 @@ class MediaClientImpl : public ash::MediaClient, ...@@ -37,6 +37,7 @@ class MediaClientImpl : public ash::MediaClient,
// ash::MediaClient: // ash::MediaClient:
void HandleMediaNextTrack() override; void HandleMediaNextTrack() override;
void HandleMediaPlayPause() override; void HandleMediaPlayPause() override;
void HandleMediaPlay() override;
void HandleMediaPrevTrack() override; void HandleMediaPrevTrack() override;
void RequestCaptureState() override; void RequestCaptureState() override;
void SuspendMediaSessions() override; void SuspendMediaSessions() override;
......
...@@ -167,6 +167,44 @@ TEST_F(MediaClientTest, HandleMediaPlayPause) { ...@@ -167,6 +167,44 @@ TEST_F(MediaClientTest, HandleMediaPlayPause) {
EXPECT_EQ(base::nullopt, delegate()->ConsumeLastMediaKey()); EXPECT_EQ(base::nullopt, delegate()->ConsumeLastMediaKey());
} }
TEST_F(MediaClientTest, HandleMediaPlay) {
const ui::Accelerator test_accelerator(ui::VKEY_MEDIA_PLAY, ui::EF_NONE);
// Enable custom media key handling for the current browser. Ensure that the
// client set the override on the controller.
client()->EnableCustomMediaKeyHandler(profile(), delegate());
EXPECT_TRUE(controller()->force_media_client_key_handling());
// Simulate the media key and check that the delegate received it.
client()->HandleMediaPlay();
EXPECT_EQ(test_accelerator, delegate()->ConsumeLastMediaKey());
// Change the active browser and ensure the override was disabled.
BrowserList::SetLastActive(alt_browser());
EXPECT_FALSE(controller()->force_media_client_key_handling());
// Simulate the media key and check that the delegate did not receive it.
client()->HandleMediaPlay();
EXPECT_EQ(base::nullopt, delegate()->ConsumeLastMediaKey());
// Change the active browser back and ensure the override was enabled.
BrowserList::SetLastActive(browser());
EXPECT_TRUE(controller()->force_media_client_key_handling());
// Simulate the media key and check the delegate received it.
client()->HandleMediaPlay();
EXPECT_EQ(test_accelerator, delegate()->ConsumeLastMediaKey());
// Disable custom media key handling for the current browser and ensure the
// override was disabled.
client()->DisableCustomMediaKeyHandler(profile(), delegate());
EXPECT_FALSE(controller()->force_media_client_key_handling());
// Simulate the media key and check the delegate did not receive it.
client()->HandleMediaPlay();
EXPECT_EQ(base::nullopt, delegate()->ConsumeLastMediaKey());
}
TEST_F(MediaClientTest, HandleMediaNextTrack) { TEST_F(MediaClientTest, HandleMediaNextTrack) {
const ui::Accelerator test_accelerator(ui::VKEY_MEDIA_NEXT_TRACK, const ui::Accelerator test_accelerator(ui::VKEY_MEDIA_NEXT_TRACK,
ui::EF_NONE); ui::EF_NONE);
......
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