Commit c64f63ad authored by Ana Salazar's avatar Ana Salazar Committed by Chromium LUCI CQ

Add play icon to screen recordings in holding space

In the Holding Space's Screen Capture section, we display screenshots
and screen recordings. At the moment, both previews display as still
images.
In order to differentiate between screenshots and screen recordings, we
add a play icon over the screen recordings.

Screenshot: https://screenshot.googleplex.com/9YVVkvvyAk7Duds

Bug: 1144927
Change-Id: Id1614a867caa73676d24c9ab59289337fea88c63
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2566051
Commit-Queue: Ana Salazar <anasalazar@chromium.org>
Reviewed-by: default avatarToni Baržić <tbarzic@chromium.org>
Cr-Commit-Position: refs/heads/master@{#833785}
parent e618195a
...@@ -29,10 +29,11 @@ constexpr int kHoldingSpaceContextMenuMargin = 8; ...@@ -29,10 +29,11 @@ constexpr int kHoldingSpaceContextMenuMargin = 8;
constexpr int kHoldingSpaceCornerRadius = 8; constexpr int kHoldingSpaceCornerRadius = 8;
constexpr int kHoldingSpaceDownloadsChevronIconSize = 20; constexpr int kHoldingSpaceDownloadsChevronIconSize = 20;
constexpr int kHoldingSpaceDownloadsHeaderSpacing = 16; constexpr int kHoldingSpaceDownloadsHeaderSpacing = 16;
constexpr int kHoldingSpacePinIconSize = 20; constexpr int kHoldingSpaceIconSize = 20;
constexpr int kHoldingSpaceRowSpacing = 8; constexpr int kHoldingSpaceRowSpacing = 8;
constexpr gfx::Insets kHoldingSpaceScreenCapturePadding(8); constexpr gfx::Insets kHoldingSpaceScreenCapturePadding(8);
constexpr gfx::Size kHoldingSpaceScreenCapturePinButtonSize(24, 24); constexpr gfx::Size kHoldingSpaceScreenCapturePinButtonSize(24, 24);
constexpr gfx::Size kHoldingSpaceScreenCapturePlayIconSize(32, 32);
constexpr int kHoldingSpaceScreenCaptureSpacing = 8; constexpr int kHoldingSpaceScreenCaptureSpacing = 8;
constexpr gfx::Size kHoldingSpaceScreenCaptureSize(104, 80); constexpr gfx::Size kHoldingSpaceScreenCaptureSize(104, 80);
constexpr gfx::Insets kHoldingSpaceScreenCapturesContainerPadding(8, 0); constexpr gfx::Insets kHoldingSpaceScreenCapturesContainerPadding(8, 0);
......
...@@ -53,7 +53,7 @@ class HoldingSpaceItemChipView::LabelMaskLayerOwner : public ui::LayerDelegate { ...@@ -53,7 +53,7 @@ class HoldingSpaceItemChipView::LabelMaskLayerOwner : public ui::LayerDelegate {
cc::PaintFlags flags; cc::PaintFlags flags;
flags.setAntiAlias(false); flags.setAntiAlias(false);
gfx::Point gradient_end(size.width() - kHoldingSpacePinIconSize, 0); gfx::Point gradient_end(size.width() - kHoldingSpaceIconSize, 0);
gfx::Point gradient_start( gfx::Point gradient_start(
gradient_end.x() - kHoldingSpaceChipLabelMaskGradientWidth, gradient_end.x() - kHoldingSpaceChipLabelMaskGradientWidth,
gradient_end.y()); gradient_end.y());
......
...@@ -36,6 +36,9 @@ HoldingSpaceItemScreenCaptureView::HoldingSpaceItemScreenCaptureView( ...@@ -36,6 +36,9 @@ HoldingSpaceItemScreenCaptureView::HoldingSpaceItemScreenCaptureView(
UpdateImage(); UpdateImage();
if (item->type() == HoldingSpaceItem::Type::kScreenRecording)
AddPlayIcon();
views::View* pin_button_container = views::View* pin_button_container =
AddChildView(std::make_unique<views::View>()); AddChildView(std::make_unique<views::View>());
...@@ -65,6 +68,27 @@ void HoldingSpaceItemScreenCaptureView::UpdateImage() { ...@@ -65,6 +68,27 @@ void HoldingSpaceItemScreenCaptureView::UpdateImage() {
SchedulePaint(); SchedulePaint();
} }
void HoldingSpaceItemScreenCaptureView::AddPlayIcon() {
views::View* play_icon_container =
AddChildView(std::make_unique<views::View>());
auto* layout =
play_icon_container->SetLayoutManager(std::make_unique<views::BoxLayout>(
views::BoxLayout::Orientation::kHorizontal,
kHoldingSpaceScreenCapturePadding));
layout->set_main_axis_alignment(views::BoxLayout::MainAxisAlignment::kCenter);
layout->set_cross_axis_alignment(
views::BoxLayout::CrossAxisAlignment::kCenter);
views::View* play_icon = CreatePlayIcon(play_icon_container);
// Create contrasting background for the play icon.
play_icon->SetBackground(views::CreateRoundedRectBackground(
HoldingSpaceColorProvider::Get()->GetBackgroundColor(),
kHoldingSpaceScreenCapturePlayIconSize.width() / 2));
play_icon->SetPreferredSize(kHoldingSpaceScreenCapturePlayIconSize);
}
BEGIN_METADATA(HoldingSpaceItemScreenCaptureView, HoldingSpaceItemView) BEGIN_METADATA(HoldingSpaceItemScreenCaptureView, HoldingSpaceItemView)
END_METADATA END_METADATA
......
...@@ -32,6 +32,9 @@ class ASH_EXPORT HoldingSpaceItemScreenCaptureView ...@@ -32,6 +32,9 @@ class ASH_EXPORT HoldingSpaceItemScreenCaptureView
private: private:
void UpdateImage(); void UpdateImage();
// Overlays a play icon over the Screen Capture preview.
void AddPlayIcon();
RoundedImageView* image_ = nullptr; RoundedImageView* image_ = nullptr;
base::CallbackListSubscription image_subscription_; base::CallbackListSubscription image_subscription_;
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "ash/style/ash_color_provider.h" #include "ash/style/ash_color_provider.h"
#include "ash/system/holding_space/holding_space_item_view_delegate.h" #include "ash/system/holding_space/holding_space_item_view_delegate.h"
#include "base/bind.h" #include "base/bind.h"
#include "components/vector_icons/vector_icons.h"
#include "ui/base/class_property.h" #include "ui/base/class_property.h"
#include "ui/base/dragdrop/drag_drop_types.h" #include "ui/base/dragdrop/drag_drop_types.h"
#include "ui/gfx/canvas.h" #include "ui/gfx/canvas.h"
...@@ -241,9 +242,9 @@ views::ToggleImageButton* HoldingSpaceItemView::AddPin(views::View* parent) { ...@@ -241,9 +242,9 @@ views::ToggleImageButton* HoldingSpaceItemView::AddPin(views::View* parent) {
AshColorProvider::ContentLayerType::kButtonIconColor); AshColorProvider::ContentLayerType::kButtonIconColor);
const gfx::ImageSkia unpinned_icon = gfx::CreateVectorIcon( const gfx::ImageSkia unpinned_icon = gfx::CreateVectorIcon(
views::kUnpinIcon, kHoldingSpacePinIconSize, icon_color); views::kUnpinIcon, kHoldingSpaceIconSize, icon_color);
const gfx::ImageSkia pinned_icon = gfx::CreateVectorIcon( const gfx::ImageSkia pinned_icon =
views::kPinIcon, kHoldingSpacePinIconSize, icon_color); gfx::CreateVectorIcon(views::kPinIcon, kHoldingSpaceIconSize, icon_color);
pin_->SetImage(views::Button::STATE_NORMAL, unpinned_icon); pin_->SetImage(views::Button::STATE_NORMAL, unpinned_icon);
pin_->SetToggledImage(views::Button::STATE_NORMAL, &pinned_icon); pin_->SetToggledImage(views::Button::STATE_NORMAL, &pinned_icon);
...@@ -259,6 +260,23 @@ views::ToggleImageButton* HoldingSpaceItemView::AddPin(views::View* parent) { ...@@ -259,6 +260,23 @@ views::ToggleImageButton* HoldingSpaceItemView::AddPin(views::View* parent) {
return pin_; return pin_;
} }
views::View* HoldingSpaceItemView::CreatePlayIcon(views::View* parent) {
DCHECK(!play_icon_);
play_icon_ = parent->AddChildView(std::make_unique<views::ImageView>());
play_icon_->SetFocusBehavior(views::View::FocusBehavior::NEVER);
play_icon_->SetVisible(true);
const SkColor icon_color = AshColorProvider::Get()->GetContentLayerColor(
AshColorProvider::ContentLayerType::kButtonIconColor);
const gfx::ImageSkia play_icon_image = gfx::CreateVectorIcon(
vector_icons::kPlayArrowIcon, kHoldingSpaceIconSize, icon_color);
play_icon_->SetImage(&play_icon_image);
return play_icon_;
}
void HoldingSpaceItemView::OnPaintFocus(gfx::Canvas* canvas, gfx::Size size) { void HoldingSpaceItemView::OnPaintFocus(gfx::Canvas* canvas, gfx::Size size) {
if (!HasFocus()) if (!HasFocus())
return; return;
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "ash/ash_export.h" #include "ash/ash_export.h"
#include "ui/views/animation/ink_drop_host_view.h" #include "ui/views/animation/ink_drop_host_view.h"
#include "ui/views/controls/image_view.h"
#include "ui/views/metadata/metadata_header_macros.h" #include "ui/views/metadata/metadata_header_macros.h"
namespace views { namespace views {
...@@ -64,8 +65,13 @@ class ASH_EXPORT HoldingSpaceItemView : public views::InkDropHostView { ...@@ -64,8 +65,13 @@ class ASH_EXPORT HoldingSpaceItemView : public views::InkDropHostView {
void SetSelected(bool selected); void SetSelected(bool selected);
bool selected() const { return selected_; } bool selected() const { return selected_; }
views::View* play_icon() { return play_icon_; }
protected: protected:
views::ToggleImageButton* AddPin(views::View* parent); views::ToggleImageButton* AddPin(views::View* parent);
// Creates a View consisting of a play icon.
views::View* CreatePlayIcon(views::View* parent);
virtual void OnPinVisiblityChanged(bool pin_visible) {} virtual void OnPinVisiblityChanged(bool pin_visible) {}
private: private:
...@@ -83,6 +89,7 @@ class ASH_EXPORT HoldingSpaceItemView : public views::InkDropHostView { ...@@ -83,6 +89,7 @@ class ASH_EXPORT HoldingSpaceItemView : public views::InkDropHostView {
const std::string item_id_; const std::string item_id_;
views::ToggleImageButton* pin_ = nullptr; // Owned by view hierarchy. views::ToggleImageButton* pin_ = nullptr; // Owned by view hierarchy.
views::ImageView* play_icon_ = nullptr; // Owned by view hierarchy.
// Owners for the layers used to paint focused and selected states. // Owners for the layers used to paint focused and selected states.
std::unique_ptr<ui::LayerOwner> selected_layer_owner_; std::unique_ptr<ui::LayerOwner> selected_layer_owner_;
......
...@@ -1316,6 +1316,31 @@ TEST_P(HoldingSpaceTrayTest, ...@@ -1316,6 +1316,31 @@ TEST_P(HoldingSpaceTrayTest,
test_api()->Close(); test_api()->Close();
} }
// Screen recordings should have an overlaying play icon.
TEST_P(HoldingSpaceTrayTest, PlayIconForScreenRecordings) {
StartSession();
test_api()->Show();
// Add one screenshot item and one screen recording item.
HoldingSpaceItem* screenshot_item = AddItem(
HoldingSpaceItem::Type::kScreenshot, base::FilePath("/tmp/fake_1"));
HoldingSpaceItem* screen_recording_item = AddItem(
HoldingSpaceItem::Type::kScreenRecording, base::FilePath("/tmp/fake_2"));
EXPECT_TRUE(test_api()->RecentFilesContainerShown());
std::vector<views::View*> screen_capture_chips =
test_api()->GetScreenCaptureViews();
EXPECT_EQ(2u, screen_capture_chips.size());
EXPECT_EQ(screenshot_item->id(),
HoldingSpaceItemView::Cast(screen_capture_chips[1])->item()->id());
EXPECT_FALSE(HoldingSpaceItemView::Cast(screen_capture_chips[1])->play_icon());
EXPECT_EQ(screen_recording_item->id(),
HoldingSpaceItemView::Cast(screen_capture_chips[0])->item()->id());
EXPECT_TRUE(HoldingSpaceItemView::Cast(screen_capture_chips[0])->play_icon());
}
INSTANTIATE_TEST_SUITE_P(All, HoldingSpaceTrayTest, testing::Bool()); INSTANTIATE_TEST_SUITE_P(All, HoldingSpaceTrayTest, testing::Bool());
} // namespace ash } // namespace ash
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