Commit 00119b63 authored by Michael Sun's avatar Michael Sun Committed by Commit Bot

[Media Keys] Add handling for Media Seek Backward

To support the "Rewind" event generated by media controller devices
(e.g. a USB HID Keyboard or a Bluetooth headset). Add handling in
media_controller_impl. One "Rewind" key press will fire a Seek backward
with kDefaultSeekTime=5 seconds using the media session service.

BUG=1054411

Change-Id: I87669472cc0076a28df4a4752ad8af5a41983794
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2065849
Commit-Queue: Michael Sun <michaelfsun@google.com>
Reviewed-by: default avatarBecca Hughes <beccahughes@chromium.org>
Reviewed-by: default avatarNico Weber <thakis@chromium.org>
Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#743364}
parent d4260731
......@@ -256,6 +256,31 @@ void MediaControllerImpl::HandleMediaPrevTrack() {
client_->HandleMediaPrevTrack();
}
void MediaControllerImpl::HandleMediaSeekBackward() {
if (Shell::Get()->session_controller()->IsScreenLocked() &&
!AreLockScreenMediaKeysEnabled()) {
return;
}
ui::RecordMediaHardwareKeyAction(ui::MediaHardwareKeyAction::kSeekBackward);
// If the |client_| is force handling the keys then we should forward them.
if (client_ && force_media_client_key_handling_) {
client_->HandleMediaSeekBackward();
return;
}
// If media session media key handling is enabled. Seek backward with
// kDefaultSeekTime using the media session service.
if (ShouldUseMediaSession()) {
GetMediaSessionController()->Seek(kDefaultSeekTime * -1);
return;
}
if (client_)
client_->HandleMediaSeekBackward();
}
void MediaControllerImpl::HandleMediaSeekForward() {
if (Shell::Get()->session_controller()->IsScreenLocked() &&
!AreLockScreenMediaKeysEnabled()) {
......
......@@ -65,6 +65,7 @@ class ASH_EXPORT MediaControllerImpl
void HandleMediaStop();
void HandleMediaNextTrack();
void HandleMediaPrevTrack();
void HandleMediaSeekBackward();
void HandleMediaSeekForward();
// Methods that forward to |client_|.
......
......@@ -82,6 +82,8 @@ class MediaControllerTest : public AshTestBase {
Flush();
Shell::Get()->media_controller()->HandleMediaNextTrack();
Flush();
Shell::Get()->media_controller()->HandleMediaSeekBackward();
Flush();
Shell::Get()->media_controller()->HandleMediaSeekForward();
Flush();
}
......@@ -98,6 +100,7 @@ TEST_F(MediaControllerTest, EnableMediaKeysWhenUnlocked) {
EXPECT_EQ(0, controller()->stop_count());
EXPECT_EQ(0, controller()->previous_track_count());
EXPECT_EQ(0, controller()->next_track_count());
EXPECT_EQ(0, controller()->seek_backward_count());
EXPECT_EQ(0, controller()->seek_forward_count());
HandleMediaKeys();
......@@ -107,6 +110,7 @@ TEST_F(MediaControllerTest, EnableMediaKeysWhenUnlocked) {
EXPECT_EQ(1, controller()->stop_count());
EXPECT_EQ(1, controller()->previous_track_count());
EXPECT_EQ(1, controller()->next_track_count());
EXPECT_EQ(1, controller()->seek_backward_count());
EXPECT_EQ(1, controller()->seek_forward_count());
}
......@@ -164,6 +168,7 @@ TEST_F(MediaControllerTest, EnableMediaKeysWhenLockedAndControlsEnabled) {
EXPECT_EQ(0, controller()->stop_count());
EXPECT_EQ(0, controller()->previous_track_count());
EXPECT_EQ(0, controller()->next_track_count());
EXPECT_EQ(0, controller()->seek_backward_count());
EXPECT_EQ(0, controller()->seek_forward_count());
SimulateSessionLock();
......@@ -175,6 +180,7 @@ TEST_F(MediaControllerTest, EnableMediaKeysWhenLockedAndControlsEnabled) {
EXPECT_EQ(1, controller()->stop_count());
EXPECT_EQ(1, controller()->previous_track_count());
EXPECT_EQ(1, controller()->next_track_count());
EXPECT_EQ(1, controller()->seek_backward_count());
EXPECT_EQ(1, controller()->seek_forward_count());
}
......@@ -188,6 +194,7 @@ TEST_F(MediaControllerTest, DisableMediaKeysWhenLockedAndControlsDisabled) {
EXPECT_EQ(0, controller()->stop_count());
EXPECT_EQ(0, controller()->previous_track_count());
EXPECT_EQ(0, controller()->next_track_count());
EXPECT_EQ(0, controller()->seek_backward_count());
EXPECT_EQ(0, controller()->seek_forward_count());
SimulateSessionLock();
......@@ -199,6 +206,7 @@ TEST_F(MediaControllerTest, DisableMediaKeysWhenLockedAndControlsDisabled) {
EXPECT_EQ(0, controller()->stop_count());
EXPECT_EQ(0, controller()->previous_track_count());
EXPECT_EQ(0, controller()->next_track_count());
EXPECT_EQ(0, controller()->seek_backward_count());
EXPECT_EQ(0, controller()->seek_forward_count());
}
......
......@@ -30,6 +30,9 @@ class ASH_PUBLIC_EXPORT MediaClient {
// Handles the Previous Track Media shortcut key.
virtual void HandleMediaPrevTrack() = 0;
// Handles the Seek Backward Media shortcut key.
virtual void HandleMediaSeekBackward() = 0;
// Handles the Seek Forward Media shortcut key.
virtual void HandleMediaSeekForward() = 0;
......
......@@ -33,6 +33,10 @@ void TestMediaClient::HandleMediaPrevTrack() {
++handle_media_prev_track_count_;
}
void TestMediaClient::HandleMediaSeekBackward() {
++handle_media_seek_backward_count_;
}
void TestMediaClient::HandleMediaSeekForward() {
++handle_media_seek_forward_count_;
}
......
......@@ -24,6 +24,7 @@ class TestMediaClient : public MediaClient {
void HandleMediaPause() override;
void HandleMediaStop() override;
void HandleMediaPrevTrack() override;
void HandleMediaSeekBackward() override;
void HandleMediaSeekForward() override;
void RequestCaptureState() override;
void SuspendMediaSessions() override;
......@@ -40,6 +41,9 @@ class TestMediaClient : public MediaClient {
int handle_media_prev_track_count() const {
return handle_media_prev_track_count_;
}
int handle_media_seek_backward_count() const {
return handle_media_seek_backward_count_;
}
int handle_media_seek_forward_count() const {
return handle_media_seek_forward_count_;
}
......@@ -52,6 +56,7 @@ class TestMediaClient : public MediaClient {
int handle_media_pause_count_ = 0;
int handle_media_stop_count_ = 0;
int handle_media_prev_track_count_ = 0;
int handle_media_seek_backward_count_ = 0;
int handle_media_seek_forward_count_ = 0;
bool media_sessions_suspended_ = false;
......
......@@ -197,6 +197,10 @@ void MediaClientImpl::HandleMediaPrevTrack() {
HandleMediaAction(ui::VKEY_MEDIA_PREV_TRACK);
}
void MediaClientImpl::HandleMediaSeekBackward() {
HandleMediaAction(ui::VKEY_OEM_103);
}
void MediaClientImpl::HandleMediaSeekForward() {
HandleMediaAction(ui::VKEY_OEM_104);
}
......@@ -312,10 +316,11 @@ void MediaClientImpl::HandleMediaAction(ui::KeyboardCode keycode) {
router->NotifyTogglePlayState();
break;
// TODO(https://crbug.com/1053777): Handle media action for VKEY_MEDIA_PLAY,
// VKEY_MEDIA_PAUSE, VKEY_MEDIA_STOP, and VKEY_OEM_104.
// VKEY_MEDIA_PAUSE, VKEY_MEDIA_STOP, VKEY_OEM_103, and VKEY_OEM_104.
case ui::VKEY_MEDIA_PLAY:
case ui::VKEY_MEDIA_PAUSE:
case ui::VKEY_MEDIA_STOP:
case ui::VKEY_OEM_103: // KEYCODE_MEDIA_REWIND
case ui::VKEY_OEM_104: // KEYCODE_MEDIA_FAST_FORWARD
break;
default:
......
......@@ -41,6 +41,7 @@ class MediaClientImpl : public ash::MediaClient,
void HandleMediaPause() override;
void HandleMediaStop() override;
void HandleMediaPrevTrack() override;
void HandleMediaSeekBackward() override;
void HandleMediaSeekForward() override;
void RequestCaptureState() override;
void SuspendMediaSessions() override;
......
......@@ -151,6 +151,9 @@ TEST_F(MediaClientTest, HandleMediaAccelerators) {
{ui::Accelerator(ui::VKEY_MEDIA_PREV_TRACK, ui::EF_NONE),
base::BindRepeating(&MediaClientImpl::HandleMediaPrevTrack,
base::Unretained(client()))},
{ui::Accelerator(ui::VKEY_OEM_103, ui::EF_NONE),
base::BindRepeating(&MediaClientImpl::HandleMediaSeekBackward,
base::Unretained(client()))},
{ui::Accelerator(ui::VKEY_OEM_104, ui::EF_NONE),
base::BindRepeating(&MediaClientImpl::HandleMediaSeekForward,
base::Unretained(client()))}};
......
......@@ -19,7 +19,8 @@ enum class MediaHardwareKeyAction {
kPreviousTrack,
kPlayPause,
kSeekForward,
kMaxValue = kSeekForward
kSeekBackward,
kMaxValue = kSeekBackward
};
// The name of the histogram that records |MediaHardwareKeyAction|.
......
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