Commit 60756810 authored by Jazz Xu's avatar Jazz Xu Committed by Commit Bot

CrOS GMC: Add a timer for updating artwork.

This CL adds a |hide_artwork_timer_| which makes the artwork view wait
for a certain delay to disappear when receiving an empty artwork. This
avoid flashing relayout between sessions when loading artwork.
(e.g. Getting an empty artwork in a new session, and artwork comes in
later because of slow network, which will makes the artwork view
disappear and reappear.)

Bug: 1128883
Change-Id: Iae6693af7dc6d21559c9f9a8190169b23b9cab35
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2427586Reviewed-by: default avatarTetsui Ohkubo <tetsui@chromium.org>
Reviewed-by: default avatarTommy Steimel <steimel@chromium.org>
Commit-Queue: Jazz Xu <jazzhsu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#811743}
parent 11ec7560
......@@ -10,6 +10,7 @@
#include "services/media_session/public/cpp/util.h"
#include "services/media_session/public/mojom/media_session.mojom.h"
#include "services/media_session/public/mojom/media_session_service.mojom.h"
#include "ui/views/controls/image_view.h"
#include "ui/views/view.h"
namespace ash {
......@@ -23,6 +24,10 @@ constexpr int kDisiredArtworkSize = 48;
constexpr base::TimeDelta kHideControlsDelay =
base::TimeDelta::FromMilliseconds(2000);
// Time to wait for new artwork.
constexpr base::TimeDelta kHideArtworkDelay =
base::TimeDelta::FromMilliseconds(2000);
} // namespace
UnifiedMediaControlsController::UnifiedMediaControlsController(
......@@ -137,10 +142,28 @@ void UnifiedMediaControlsController::MediaControllerImageChanged(
}
}
base::Optional<gfx::ImageSkia> session_artwork;
if (!converted_bitmap.empty())
session_artwork = gfx::ImageSkia::CreateFrom1xBitmap(converted_bitmap);
media_controls_->SetArtwork(session_artwork);
// If we do get an artwork, set the artwork immediately and stop
// |hide_artwork_timer_| if necessary.
if (!converted_bitmap.empty()) {
if (hide_artwork_timer_->IsRunning())
hide_artwork_timer_->Stop();
media_controls_->SetArtwork(
gfx::ImageSkia::CreateFrom1xBitmap(converted_bitmap));
return;
}
if (media_controls_->artwork_view()->GetImage().isNull())
return;
// Start |hide_artork_timer_} if not already started and wait for
// artwork update.
if (!hide_artwork_timer_->IsRunning()) {
hide_artwork_timer_->Start(
FROM_HERE, kHideArtworkDelay,
base::BindOnce(&UnifiedMediaControlsView::SetArtwork,
base::Unretained(media_controls_), base::nullopt));
}
}
void UnifiedMediaControlsController::OnMediaControlsViewClicked() {
......
......@@ -89,6 +89,9 @@ class ASH_EXPORT UnifiedMediaControlsController
std::unique_ptr<base::OneShotTimer> hide_controls_timer_ =
std::make_unique<base::OneShotTimer>();
std::unique_ptr<base::OneShotTimer> hide_artwork_timer_ =
std::make_unique<base::OneShotTimer>();
base::Optional<base::UnguessableToken> media_session_id_;
base::flat_set<media_session::mojom::MediaSessionAction> enabled_actions_;
......
......@@ -25,6 +25,7 @@ using media_session::test::TestMediaController;
namespace {
constexpr int kHideControlsDelay = 2000; /* in milliseconds */
constexpr int kHideArtworkDelay = 2000; /* in milliseconds */
constexpr int kArtworkCornerRadius = 4;
constexpr int kArtworkHeight = 48;
......@@ -305,10 +306,60 @@ TEST_F(UnifiedMediaControlsControllerTest, UpdateArtwork) {
EXPECT_EQ(path, GetArtworkClipPath());
}
// Test that artwork view will be hidden if we get an empty artowrk.
// Test that artwork view will be hidden after |kHideArtworkDelay| ms if
// we get an empty artowrk.
artwork.reset();
controller()->MediaControllerImageChanged(
media_session::mojom::MediaSessionImageType::kArtwork, artwork);
task_environment()->FastForwardBy(
base::TimeDelta::FromMilliseconds(kHideArtworkDelay));
EXPECT_FALSE(artwork_view()->GetVisible());
}
// Test that artwork views hides after a certain delay
// when received a null artwork image.
TEST_F(UnifiedMediaControlsControllerTest, HideArtwork) {
// Artwork view starts hidden.
EXPECT_FALSE(artwork_view()->GetVisible());
// Artwork view should be visible after getting an artowrk image update.
SkBitmap artwork;
artwork.allocN32Pixels(40, 40);
controller()->MediaControllerImageChanged(
media_session::mojom::MediaSessionImageType::kArtwork, artwork);
EXPECT_TRUE(artwork_view()->GetVisible());
// Artwork should still be visible after getting an empty artowrk.
artwork.reset();
controller()->MediaControllerImageChanged(
media_session::mojom::MediaSessionImageType::kArtwork, artwork);
EXPECT_TRUE(artwork_view()->GetVisible());
// Artwork should still be visible if we are within hide artwork delay
// time frame.
task_environment()->FastForwardBy(
base::TimeDelta::FromMilliseconds(kHideArtworkDelay - 1));
EXPECT_TRUE(artwork_view()->GetVisible());
// Artwork should be visible after getting an artwork update and the
// timer should be stopped.
artwork.allocN32Pixels(40, 40);
controller()->MediaControllerImageChanged(
media_session::mojom::MediaSessionImageType::kArtwork, artwork);
EXPECT_TRUE(artwork_view()->GetVisible());
// Artwork should stay visible.
task_environment()->FastForwardBy(
base::TimeDelta::FromMilliseconds(kHideArtworkDelay));
EXPECT_TRUE(artwork_view()->GetVisible());
// Wait for |kHideartworkDelay| ms after getting an empty artwork,
// artwork view should now be hidden.
artwork.reset();
controller()->MediaControllerImageChanged(
media_session::mojom::MediaSessionImageType::kArtwork, artwork);
task_environment()->FastForwardBy(
base::TimeDelta::FromMilliseconds(kHideArtworkDelay));
EXPECT_FALSE(artwork_view()->GetVisible());
}
......
......@@ -43,6 +43,8 @@ class ASH_EXPORT UnifiedMediaControlsView : public views::Button,
const base::flat_set<media_session::mojom::MediaSessionAction>&
enabled_actions);
views::ImageView* artwork_view() { return artwork_view_; }
private:
friend class UnifiedMediaControlsControllerTest;
......
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