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 @@ ...@@ -10,6 +10,7 @@
#include "services/media_session/public/cpp/util.h" #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.mojom.h"
#include "services/media_session/public/mojom/media_session_service.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" #include "ui/views/view.h"
namespace ash { namespace ash {
...@@ -23,6 +24,10 @@ constexpr int kDisiredArtworkSize = 48; ...@@ -23,6 +24,10 @@ constexpr int kDisiredArtworkSize = 48;
constexpr base::TimeDelta kHideControlsDelay = constexpr base::TimeDelta kHideControlsDelay =
base::TimeDelta::FromMilliseconds(2000); base::TimeDelta::FromMilliseconds(2000);
// Time to wait for new artwork.
constexpr base::TimeDelta kHideArtworkDelay =
base::TimeDelta::FromMilliseconds(2000);
} // namespace } // namespace
UnifiedMediaControlsController::UnifiedMediaControlsController( UnifiedMediaControlsController::UnifiedMediaControlsController(
...@@ -137,10 +142,28 @@ void UnifiedMediaControlsController::MediaControllerImageChanged( ...@@ -137,10 +142,28 @@ void UnifiedMediaControlsController::MediaControllerImageChanged(
} }
} }
base::Optional<gfx::ImageSkia> session_artwork; // If we do get an artwork, set the artwork immediately and stop
if (!converted_bitmap.empty()) // |hide_artwork_timer_| if necessary.
session_artwork = gfx::ImageSkia::CreateFrom1xBitmap(converted_bitmap); if (!converted_bitmap.empty()) {
media_controls_->SetArtwork(session_artwork); 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() { void UnifiedMediaControlsController::OnMediaControlsViewClicked() {
......
...@@ -89,6 +89,9 @@ class ASH_EXPORT UnifiedMediaControlsController ...@@ -89,6 +89,9 @@ class ASH_EXPORT UnifiedMediaControlsController
std::unique_ptr<base::OneShotTimer> hide_controls_timer_ = std::unique_ptr<base::OneShotTimer> hide_controls_timer_ =
std::make_unique<base::OneShotTimer>(); 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::Optional<base::UnguessableToken> media_session_id_;
base::flat_set<media_session::mojom::MediaSessionAction> enabled_actions_; base::flat_set<media_session::mojom::MediaSessionAction> enabled_actions_;
......
...@@ -25,6 +25,7 @@ using media_session::test::TestMediaController; ...@@ -25,6 +25,7 @@ using media_session::test::TestMediaController;
namespace { namespace {
constexpr int kHideControlsDelay = 2000; /* in milliseconds */ constexpr int kHideControlsDelay = 2000; /* in milliseconds */
constexpr int kHideArtworkDelay = 2000; /* in milliseconds */
constexpr int kArtworkCornerRadius = 4; constexpr int kArtworkCornerRadius = 4;
constexpr int kArtworkHeight = 48; constexpr int kArtworkHeight = 48;
...@@ -305,10 +306,60 @@ TEST_F(UnifiedMediaControlsControllerTest, UpdateArtwork) { ...@@ -305,10 +306,60 @@ TEST_F(UnifiedMediaControlsControllerTest, UpdateArtwork) {
EXPECT_EQ(path, GetArtworkClipPath()); 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(); artwork.reset();
controller()->MediaControllerImageChanged( controller()->MediaControllerImageChanged(
media_session::mojom::MediaSessionImageType::kArtwork, artwork); 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()); EXPECT_FALSE(artwork_view()->GetVisible());
} }
......
...@@ -43,6 +43,8 @@ class ASH_EXPORT UnifiedMediaControlsView : public views::Button, ...@@ -43,6 +43,8 @@ class ASH_EXPORT UnifiedMediaControlsView : public views::Button,
const base::flat_set<media_session::mojom::MediaSessionAction>& const base::flat_set<media_session::mojom::MediaSessionAction>&
enabled_actions); enabled_actions);
views::ImageView* artwork_view() { return artwork_view_; }
private: private:
friend class UnifiedMediaControlsControllerTest; 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