Commit 944e7275 authored by Mia Bergeron's avatar Mia Bergeron Committed by Commit Bot

Freeze CrOS lock screen media controls on focus loss

LockScreenMediaControlsView currently handles the scenario where there
is a single media session and it briefly flashes to null between
tracks. However, if there are multiple media sessions, the UI will
briefly flash to the "secondary" session. This CL handles both
scenarios by waiting for the first media session ID to resume.

Bug: 982022
Change-Id: Icaf13d4d0bed37b474adc746a3c13e0d5d9b98ed
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1732878Reviewed-by: default avatarBecca Hughes <beccahughes@chromium.org>
Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Commit-Queue: Mia Bergeron <miaber@google.com>
Cr-Commit-Position: refs/heads/master@{#684180}
parent ba956ce1
......@@ -385,20 +385,23 @@ void LockScreenMediaControlsView::MediaSessionActionsChanged(
void LockScreenMediaControlsView::MediaSessionChanged(
const base::Optional<base::UnguessableToken>& request_id) {
// If a new media session began while waiting, keep showing the controls.
if (hide_controls_timer_->IsRunning() && request_id.has_value()) {
if (!media_session_id_.has_value()) {
media_session_id_ = request_id;
return;
}
// If |media_session_id_| resumed while waiting, don't hide the controls.
if (hide_controls_timer_->IsRunning() && request_id == media_session_id_) {
hide_controls_timer_->Stop();
enabled_actions_.clear();
}
// If there is no current session but there was a previous one, wait to see
// if a new session starts before hiding the controls.
if (!request_id.has_value() && media_session_id_.has_value()) {
// If this session is different than the previous one, wait to see if the
// previous one resumes before hiding the controls.
if (request_id != media_session_id_) {
hide_controls_timer_->Start(FROM_HERE, kNextMediaDelay,
hide_media_controls_);
}
media_session_id_ = request_id;
}
void LockScreenMediaControlsView::MediaSessionPositionChanged(
......
......@@ -238,43 +238,57 @@ class LockScreenMediaControlsViewTest : public LoginTestBase {
DISALLOW_COPY_AND_ASSIGN(LockScreenMediaControlsViewTest);
};
TEST_F(LockScreenMediaControlsViewTest, KeepMediaSessionDataBetweenSessions) {
// Simulate media session stopping.
media_controls_view_->MediaSessionChanged(base::nullopt);
TEST_F(LockScreenMediaControlsViewTest, DoNotUpdateMetadataBetweenSessions) {
// Set app name for current session
media_session::MediaMetadata metadata;
metadata.source_title = kTestAppName;
media_controls_view_->MediaSessionMetadataChanged(metadata);
// Simulate new media session starting within the timer delay.
// Simulate new media session starting.
metadata.source_title = base::ASCIIToUTF16("AppName2");
SimulateMediaSessionChanged(
media_session::mojom::MediaPlaybackState::kPlaying);
media_controls_view_->MediaSessionMetadataChanged(metadata);
// Set icon for new media session.
SkBitmap bitmap;
bitmap.allocN32Pixels(kAppIconSize, kAppIconSize);
EXPECT_EQ(kTestAppName, GetAppName());
}
TEST_F(LockScreenMediaControlsViewTest, DoNotUpdateArtworkBetweenSessions) {
SkBitmap image;
image.allocN32Pixels(10, 10);
image.eraseColor(SK_ColorMAGENTA);
SimulateMediaSessionChanged(
media_session::mojom::MediaPlaybackState::kPlaying);
media_controls_view_->MediaControllerImageChanged(
media_session::mojom::MediaSessionImageType::kSourceIcon, bitmap);
media_session::mojom::MediaSessionImageType::kArtwork, image);
// Default icon.
gfx::ImageSkia default_icon = gfx::CreateVectorIcon(
message_center::kProductIcon, kAppIconSize, gfx::kChromeIconGrey);
EXPECT_TRUE(artwork_view()->GetImage().isNull());
}
// Verify that the default icon is not drawn.
EXPECT_FALSE(icon_view()->GetImage().BackedBySameObjectAs(default_icon));
TEST_F(LockScreenMediaControlsViewTest,
DoNotUpdatePlaybackStateBetweenSessions) {
EnableAction(MediaSessionAction::kPlay);
EnableAction(MediaSessionAction::kPause);
// Set artwork for new media session.
SkBitmap artwork;
artwork.allocN32Pixels(kArtworkViewWidth, kArtworkViewHeight);
media_controls_view_->MediaControllerImageChanged(
media_session::mojom::MediaSessionImageType::kArtwork, artwork);
SimulateMediaSessionChanged(
media_session::mojom::MediaPlaybackState::kPaused);
EXPECT_TRUE(GetButtonForAction(MediaSessionAction::kPause));
EXPECT_FALSE(GetButtonForAction(MediaSessionAction::kPlay));
}
// Verify that the default artwork is not drawn.
EXPECT_FALSE(artwork_view()->GetImage().isNull());
TEST_F(LockScreenMediaControlsViewTest, DoNotUpdateActionsBetweenSessions) {
EXPECT_FALSE(
GetButtonForAction(MediaSessionAction::kSeekForward)->GetVisible());
// Set app name for new media session.
media_session::MediaMetadata metadata;
metadata.source_title = kTestAppName;
media_controls_view_->MediaSessionMetadataChanged(metadata);
SimulateMediaSessionChanged(
media_session::mojom::MediaPlaybackState::kPlaying);
// Verify that the default name is not used.
EXPECT_EQ(kTestAppName, GetAppName());
EnableAction(MediaSessionAction::kSeekForward);
EXPECT_FALSE(
GetButtonForAction(MediaSessionAction::kSeekForward)->GetVisible());
}
TEST_F(LockScreenMediaControlsViewTest, ButtonsSanityCheck) {
......
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