Skip to content

Commit

Permalink
GMC V2: add progress bar.
Browse files Browse the repository at this point in the history
Add progress bar to Zenith V2 UI.

Bug: 1191701

Change-Id: I613aa6cb15e9c99b3bcd592cf8650ae0b5a244ce
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2569680
Commit-Queue: Jazz Xu <jazzhsu@chromium.org>
Reviewed-by: Tommy Steimel <steimel@chromium.org>
Cr-Commit-Position: refs/heads/master@{#867937}
  • Loading branch information
Jazz Xu authored and Chromium LUCI CQ committed Mar 31, 2021
1 parent f173a03 commit 3e42ba3
Show file tree
Hide file tree
Showing 13 changed files with 74 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ class CastMediaNotificationItem
void SetView(media_message_center::MediaNotificationView* view) override;
void OnMediaSessionActionButtonPressed(
media_session::mojom::MediaSessionAction action) override;
void SeekTo(base::TimeDelta time) override {}
void Dismiss() override;
media_message_center::SourceType SourceType() override;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ class MockMediaNotificationView
void(const media_session::MediaMetadata&));
MOCK_METHOD1(UpdateWithMediaActions,
void(const base::flat_set<MediaSessionAction>&));
MOCK_METHOD1(UpdateWithMediaPosition,
void(const media_session::MediaPosition&));
MOCK_METHOD1(UpdateWithMediaArtwork, void(const gfx::ImageSkia&));
MOCK_METHOD1(UpdateWithFavicon, void(const gfx::ImageSkia&));
MOCK_METHOD1(UpdateWithVectorIcon, void(const gfx::VectorIcon& vector_icon));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ class MockMediaNotificationView
MOCK_METHOD1(
UpdateWithMediaActions,
void(const base::flat_set<media_session::mojom::MediaSessionAction>&));
MOCK_METHOD1(UpdateWithMediaPosition,
void(const media_session::MediaPosition&));
MOCK_METHOD1(UpdateWithMediaArtwork, void(const gfx::ImageSkia&));
MOCK_METHOD1(UpdateWithFavicon, void(const gfx::ImageSkia&));
MOCK_METHOD1(UpdateWithVectorIcon, void(const gfx::VectorIcon& vector_icon));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ class PresentationRequestNotificationItem final
void SetView(media_message_center::MediaNotificationView* view) final;
void OnMediaSessionActionButtonPressed(
media_session::mojom::MediaSessionAction action) final;
void SeekTo(base::TimeDelta time) final {}
media_message_center::SourceType SourceType() override;

const std::string id_;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class MockMediaNotificationItem
MOCK_METHOD(void,
OnMediaSessionActionButtonPressed,
(media_session::mojom::MediaSessionAction));
MOCK_METHOD(void, SeekTo, (base::TimeDelta));
MOCK_METHOD(void, Dismiss, ());
MOCK_METHOD(media_message_center::SourceType, SourceType, ());

Expand Down
3 changes: 3 additions & 0 deletions components/media_message_center/media_notification_item.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaNotificationItem {
virtual void OnMediaSessionActionButtonPressed(
media_session::mojom::MediaSessionAction action) = 0;

// Called by MediaNotificationViewImpl when progress bar is clicked to seek.
virtual void SeekTo(base::TimeDelta time) = 0;

// Hides the media notification.
virtual void Dismiss() = 0;

Expand Down
2 changes: 2 additions & 0 deletions components/media_message_center/media_notification_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaNotificationView
virtual void UpdateWithMediaActions(
const base::flat_set<media_session::mojom::MediaSessionAction>&
actions) = 0;
virtual void UpdateWithMediaPosition(
const media_session::MediaPosition& position) = 0;
virtual void UpdateWithMediaArtwork(const gfx::ImageSkia& image) = 0;
// Updates the background color to match that of the favicon.
virtual void UpdateWithFavicon(const gfx::ImageSkia& icon) = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaNotificationViewImpl
void UpdateWithMediaActions(
const base::flat_set<media_session::mojom::MediaSessionAction>& actions)
override;
void UpdateWithMediaPosition(
const media_session::MediaPosition& position) override {}
void UpdateWithMediaArtwork(const gfx::ImageSkia& image) override;
void UpdateWithFavicon(const gfx::ImageSkia& icon) override;
void UpdateWithVectorIcon(const gfx::VectorIcon& vector_icon) override;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

#include "base/containers/contains.h"
#include "base/metrics/histogram_macros.h"
#include "base/stl_util.h"
#include "components/media_message_center/media_controls_progress_view.h"
#include "components/media_message_center/media_notification_background_impl.h"
#include "components/media_message_center/media_notification_constants.h"
#include "components/media_message_center/media_notification_container.h"
Expand Down Expand Up @@ -309,6 +311,12 @@ MediaNotificationViewModernImpl::MediaNotificationViewModernImpl(
AddChildView(std::move(info_container));
}

auto progress_view =
std::make_unique<MediaControlsProgressView>(base::BindRepeating(
&MediaNotificationViewModernImpl::SeekTo, base::Unretained(this)));
progress_ = AddChildView(std::move(progress_view));
progress_->SetVisible(true);

{
// The media controls container contains buttons for media playback. This
// includes play/pause, fast-forward/rewind, and skip controls.
Expand Down Expand Up @@ -473,6 +481,12 @@ void MediaNotificationViewModernImpl::UpdateWithMediaActions(
SchedulePaint();
}

void MediaNotificationViewModernImpl::UpdateWithMediaPosition(
const media_session::MediaPosition& position) {
position_ = position;
progress_->UpdateProgress(position);
}

void MediaNotificationViewModernImpl::UpdateWithMediaArtwork(
const gfx::ImageSkia& image) {
GetMediaNotificationBackground()->UpdateArtwork(image);
Expand Down Expand Up @@ -616,6 +630,10 @@ void MediaNotificationViewModernImpl::ButtonPressed(views::Button* button) {
item_->OnMediaSessionActionButtonPressed(GetActionFromButtonTag(*button));
}

void MediaNotificationViewModernImpl::SeekTo(double seek_progress) {
item_->SeekTo(seek_progress * position_.duration());
}

BEGIN_METADATA(MediaNotificationViewModernImpl, views::View)
END_METADATA

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ namespace {
class MediaArtworkView;
} // anonymous namespace

class MediaControlsProgressView;
class MediaNotificationBackground;
class MediaNotificationContainer;
class MediaNotificationItem;
Expand Down Expand Up @@ -82,6 +83,8 @@ class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaNotificationViewModernImpl
void UpdateWithMediaActions(
const base::flat_set<media_session::mojom::MediaSessionAction>& actions)
override;
void UpdateWithMediaPosition(
const media_session::MediaPosition& position) override;
void UpdateWithMediaArtwork(const gfx::ImageSkia& image) override;
void UpdateWithFavicon(const gfx::ImageSkia& icon) override;
void UpdateWithVectorIcon(const gfx::VectorIcon& vector_icon) override {}
Expand Down Expand Up @@ -121,6 +124,8 @@ class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaNotificationViewModernImpl

void ButtonPressed(views::Button* button);

void SeekTo(double seek_progress);

// Container that receives events.
MediaNotificationContainer* const container_;

Expand All @@ -139,6 +144,8 @@ class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaNotificationViewModernImpl

MediaNotificationBackground* background_;

media_session::MediaPosition position_;

// Container views directly attached to this view.
views::View* artwork_container_ = nullptr;
MediaArtworkView* artwork_ = nullptr;
Expand All @@ -148,6 +155,7 @@ class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaNotificationViewModernImpl
views::View* notification_controls_spacer_ = nullptr;
views::View* media_controls_container_ = nullptr;
views::ToggleImageButton* play_pause_button_ = nullptr;
MediaControlsProgressView* progress_ = nullptr;
};

} // namespace media_message_center
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include "base/test/task_environment.h"
#include "base/unguessable_token.h"
#include "build/build_config.h"
#include "components/media_message_center/media_controls_progress_view.h"
#include "components/media_message_center/media_notification_background_impl.h"
#include "components/media_message_center/media_notification_constants.h"
#include "components/media_message_center/media_notification_container.h"
Expand Down Expand Up @@ -230,6 +231,8 @@ class MediaNotificationViewModernImplTest : public views::ViewsTestBase {
return view()->picture_in_picture_button_;
}

MediaControlsProgressView* progress_view() const { return view()->progress_; }

views::Button* GetButtonForAction(MediaSessionAction action) const {
auto buttons = media_control_buttons();
const auto i = std::find_if(
Expand Down Expand Up @@ -689,6 +692,13 @@ TEST_F(MAYBE_MediaNotificationViewModernImplTest, UpdateArtworkFromItem) {
EXPECT_EQ(size, view()->size());
}

TEST_F(MAYBE_MediaNotificationViewModernImplTest, UpdateProgressBar) {
media_session::MediaPosition media_position(
1.0, base::TimeDelta::FromSeconds(600), base::TimeDelta::FromSeconds(0));
GetItem()->MediaSessionPositionChanged(media_position);
EXPECT_EQ(progress_view()->duration_for_testing(), u"10:00");
}

TEST_F(MAYBE_MediaNotificationViewModernImplTest, AccessibleNodeData) {
ui::AXNodeData data;
view()->GetAccessibleNodeData(&data);
Expand Down
20 changes: 20 additions & 0 deletions components/media_message_center/media_session_notification_item.cc
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,17 @@ void MediaSessionNotificationItem::MediaSessionActionsChanged(
}
}

void MediaSessionNotificationItem::MediaSessionPositionChanged(
const base::Optional<media_session::MediaPosition>& position) {
session_position_ = position;
if (!position.has_value())
return;

if (view_ && !frozen_) {
view_->UpdateWithMediaPosition(*position);
}
}

void MediaSessionNotificationItem::MediaControllerImageChanged(
media_session::mojom::MediaSessionImageType type,
const SkBitmap& bitmap) {
Expand Down Expand Up @@ -141,6 +152,8 @@ void MediaSessionNotificationItem::SetView(MediaNotificationView* view) {
view_->UpdateWithMediaMetadata(session_metadata_);
view_->UpdateWithMediaActions(session_actions_);

if (session_position_.has_value())
view_->UpdateWithMediaPosition(*session_position_);
if (session_artwork_.has_value())
view_->UpdateWithMediaArtwork(*session_artwork_);
if (session_favicon_.has_value())
Expand All @@ -159,6 +172,11 @@ void MediaSessionNotificationItem::OnMediaSessionActionButtonPressed(
media_session::PerformMediaSessionAction(action, media_controller_remote_);
}

void MediaSessionNotificationItem::SeekTo(base::TimeDelta time) {
if (!frozen_)
media_controller_remote_->SeekTo(time);
}

void MediaSessionNotificationItem::Dismiss() {
if (media_controller_remote_.is_bound())
media_controller_remote_->Stop();
Expand Down Expand Up @@ -284,6 +302,8 @@ void MediaSessionNotificationItem::Unfreeze() {
view_->UpdateWithMediaMetadata(session_metadata_);
view_->UpdateWithMediaActions(session_actions_);

if (session_position_.has_value())
view_->UpdateWithMediaPosition(*session_position_);
if (session_artwork_.has_value())
view_->UpdateWithMediaArtwork(*session_artwork_);
if (session_favicon_.has_value())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaSessionNotificationItem
void MediaSessionChanged(
const base::Optional<base::UnguessableToken>& request_id) override {}
void MediaSessionPositionChanged(
const base::Optional<media_session::MediaPosition>& position) override {}
const base::Optional<media_session::MediaPosition>& position) override;

// media_session::mojom::MediaControllerImageObserver:
void MediaControllerImageChanged(
Expand All @@ -65,6 +65,7 @@ class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaSessionNotificationItem
void SetView(MediaNotificationView* view) override;
void OnMediaSessionActionButtonPressed(
media_session::mojom::MediaSessionAction action) override;
void SeekTo(base::TimeDelta time) override;
// This will stop the media session associated with this item. The item will
// then call |MediaNotificationController::RemoveItem()| to ensure removal.
void Dismiss() override;
Expand Down Expand Up @@ -130,6 +131,8 @@ class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaSessionNotificationItem

base::flat_set<media_session::mojom::MediaSessionAction> session_actions_;

base::Optional<media_session::MediaPosition> session_position_;

base::Optional<gfx::ImageSkia> session_artwork_;

base::Optional<gfx::ImageSkia> session_favicon_;
Expand Down

0 comments on commit 3e42ba3

Please sign in to comment.