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;
constexpr int kHoldingSpaceCornerRadius = 8;
constexpr int kHoldingSpaceDownloadsChevronIconSize = 20;
constexpr int kHoldingSpaceDownloadsHeaderSpacing = 16;
constexpr int kHoldingSpacePinIconSize = 20;
constexpr int kHoldingSpaceIconSize = 20;
constexpr int kHoldingSpaceRowSpacing = 8;
constexpr gfx::Insets kHoldingSpaceScreenCapturePadding(8);
constexpr gfx::Size kHoldingSpaceScreenCapturePinButtonSize(24, 24);
constexpr gfx::Size kHoldingSpaceScreenCapturePlayIconSize(32, 32);
constexpr int kHoldingSpaceScreenCaptureSpacing = 8;
constexpr gfx::Size kHoldingSpaceScreenCaptureSize(104, 80);
constexpr gfx::Insets kHoldingSpaceScreenCapturesContainerPadding(8, 0);
......
......@@ -53,7 +53,7 @@ class HoldingSpaceItemChipView::LabelMaskLayerOwner : public ui::LayerDelegate {
cc::PaintFlags flags;
flags.setAntiAlias(false);
gfx::Point gradient_end(size.width() - kHoldingSpacePinIconSize, 0);
gfx::Point gradient_end(size.width() - kHoldingSpaceIconSize, 0);
gfx::Point gradient_start(
gradient_end.x() - kHoldingSpaceChipLabelMaskGradientWidth,
gradient_end.y());
......
......@@ -36,6 +36,9 @@ HoldingSpaceItemScreenCaptureView::HoldingSpaceItemScreenCaptureView(
UpdateImage();
if (item->type() == HoldingSpaceItem::Type::kScreenRecording)
AddPlayIcon();
views::View* pin_button_container =
AddChildView(std::make_unique<views::View>());
......@@ -65,6 +68,27 @@ void HoldingSpaceItemScreenCaptureView::UpdateImage() {
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)
END_METADATA
......
......@@ -32,6 +32,9 @@ class ASH_EXPORT HoldingSpaceItemScreenCaptureView
private:
void UpdateImage();
// Overlays a play icon over the Screen Capture preview.
void AddPlayIcon();
RoundedImageView* image_ = nullptr;
base::CallbackListSubscription image_subscription_;
......
......@@ -13,6 +13,7 @@
#include "ash/style/ash_color_provider.h"
#include "ash/system/holding_space/holding_space_item_view_delegate.h"
#include "base/bind.h"
#include "components/vector_icons/vector_icons.h"
#include "ui/base/class_property.h"
#include "ui/base/dragdrop/drag_drop_types.h"
#include "ui/gfx/canvas.h"
......@@ -241,9 +242,9 @@ views::ToggleImageButton* HoldingSpaceItemView::AddPin(views::View* parent) {
AshColorProvider::ContentLayerType::kButtonIconColor);
const gfx::ImageSkia unpinned_icon = gfx::CreateVectorIcon(
views::kUnpinIcon, kHoldingSpacePinIconSize, icon_color);
const gfx::ImageSkia pinned_icon = gfx::CreateVectorIcon(
views::kPinIcon, kHoldingSpacePinIconSize, icon_color);
views::kUnpinIcon, kHoldingSpaceIconSize, icon_color);
const gfx::ImageSkia pinned_icon =
gfx::CreateVectorIcon(views::kPinIcon, kHoldingSpaceIconSize, icon_color);
pin_->SetImage(views::Button::STATE_NORMAL, unpinned_icon);
pin_->SetToggledImage(views::Button::STATE_NORMAL, &pinned_icon);
......@@ -259,6 +260,23 @@ views::ToggleImageButton* HoldingSpaceItemView::AddPin(views::View* parent) {
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) {
if (!HasFocus())
return;
......
......@@ -9,6 +9,7 @@
#include "ash/ash_export.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"
namespace views {
......@@ -64,8 +65,13 @@ class ASH_EXPORT HoldingSpaceItemView : public views::InkDropHostView {
void SetSelected(bool selected);
bool selected() const { return selected_; }
views::View* play_icon() { return play_icon_; }
protected:
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) {}
private:
......@@ -83,6 +89,7 @@ class ASH_EXPORT HoldingSpaceItemView : public views::InkDropHostView {
const std::string item_id_;
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.
std::unique_ptr<ui::LayerOwner> selected_layer_owner_;
......
......@@ -1316,6 +1316,31 @@ TEST_P(HoldingSpaceTrayTest,
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());
} // 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