Commit c2488ca4 authored by David Black's avatar David Black Committed by Commit Bot

Add and record histograms for holding space.

HoldingSpace.Downloads.Action.All
- Records action taken on downloads button in holding space UI.

HoldingSpace.Item.Action.All
- Records action taken by user on items in holding space UI.

HoldingSpace.Item.Action.Copy
HoldingSpace.Item.Action.Drag
HoldingSpace.Item.Action.Launch
HoldingSpace.Item.Action.Pin
HoldingSpace.Item.Action.ShowInFolder
HoldingSpace.Item.Action.Unpin
- Records type of item in holding space UI for which action was taken.

HoldingSpace.Item.Count.All
- Records count of all visible items in holding space UI at launch.

HoldingSpace.Item.Count.Download
HoldingSpace.Item.Count.PinnedFile
HoldingSpace.Item.Count.Screenshot
- Records count of all visible items of a given type in holding space
  UI at launch.

HoldingSpace.Pod.Action.All
- Records action taken on holding space pod in shelf.

Bug: 1131266
Change-Id: Ib91e74b49ce131d718aa768f8eed3d6f31c39122
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2429978
Commit-Queue: David Black <dmblack@google.com>
Reviewed-by: default avatarBrian White <bcwhite@chromium.org>
Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Reviewed-by: default avatarAhmed Mehfooz <amehfooz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#811966}
parent 4260dcdd
...@@ -148,6 +148,8 @@ component("cpp") { ...@@ -148,6 +148,8 @@ component("cpp") {
"holding_space/holding_space_image.h", "holding_space/holding_space_image.h",
"holding_space/holding_space_item.cc", "holding_space/holding_space_item.cc",
"holding_space/holding_space_item.h", "holding_space/holding_space_item.h",
"holding_space/holding_space_metrics.cc",
"holding_space/holding_space_metrics.h",
"holding_space/holding_space_model.cc", "holding_space/holding_space_model.cc",
"holding_space/holding_space_model.h", "holding_space/holding_space_model.h",
"holding_space/holding_space_model_observer.h", "holding_space/holding_space_model_observer.h",
......
...@@ -27,8 +27,9 @@ class HoldingSpaceImage; ...@@ -27,8 +27,9 @@ class HoldingSpaceImage;
class ASH_PUBLIC_EXPORT HoldingSpaceItem { class ASH_PUBLIC_EXPORT HoldingSpaceItem {
public: public:
// Items types supported by the holding space. // Items types supported by the holding space.
// NOTE: These values are persisted in preferences so append new values to the // NOTE: These values are recorded in histograms and persisted in preferences
// end and do not change the meaning of existing values. // so append new values to the end and do not change the meaning of existing
// values.
enum class Type { enum class Type {
kPinnedFile = 0, kPinnedFile = 0,
kScreenshot = 1, kScreenshot = 1,
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/public/cpp/holding_space/holding_space_metrics.h"
#include <map>
#include <string>
#include "ash/public/cpp/holding_space/holding_space_item.h"
#include "base/metrics/histogram_functions.h"
#include "base/notreached.h"
namespace ash {
namespace holding_space_metrics {
namespace {
// Helpers ---------------------------------------------------------------------
// Returns the string representation of the specified `action`. Note that these
// values are persisted to histograms so should remain unchanged.
std::string ItemActionToString(ItemAction action) {
switch (action) {
case ItemAction::kCopy:
return "Copy";
case ItemAction::kDrag:
return "Drag";
case ItemAction::kLaunch:
return "Launch";
case ItemAction::kPin:
return "Pin";
case ItemAction::kShowInFolder:
return "ShowInFolder";
case ItemAction::kUnpin:
return "Unpin";
}
NOTREACHED();
return std::string();
}
// Returns the string representation of the specified `type`. Note that these
// values are persisted to histograms so should remain unchanged.
std::string ItemTypeToString(HoldingSpaceItem::Type type) {
switch (type) {
case HoldingSpaceItem::Type::kDownload:
return "Download";
case HoldingSpaceItem::Type::kPinnedFile:
return "PinnedFile";
case HoldingSpaceItem::Type::kScreenshot:
return "Screenshot";
}
NOTREACHED();
return std::string();
}
} // namespace
// Metrics ---------------------------------------------------------------------
void RecordPodAction(PodAction action) {
base::UmaHistogramEnumeration("HoldingSpace.Pod.Action.All", action);
}
void RecordDownloadsAction(DownloadsAction action) {
base::UmaHistogramEnumeration("HoldingSpace.Downloads.Action.All", action);
}
void RecordItemAction(const std::vector<const HoldingSpaceItem*>& items,
ItemAction action) {
for (const HoldingSpaceItem* item : items) {
base::UmaHistogramEnumeration("HoldingSpace.Item.Action.All", action);
base::UmaHistogramEnumeration(
"HoldingSpace.Item.Action." + ItemActionToString(action), item->type());
}
}
void RecordItemCounts(const std::vector<const HoldingSpaceItem*>& items) {
if (items.empty())
return;
base::UmaHistogramCounts1000("HoldingSpace.Item.Count.All", items.size());
std::map<HoldingSpaceItem::Type, int> counts_by_type;
for (const HoldingSpaceItem* item : items)
++counts_by_type[item->type()];
for (const auto& count_by_type : counts_by_type) {
base::UmaHistogramCounts1000(
"HoldingSpace.Item.Count." + ItemTypeToString(count_by_type.first),
count_by_type.second);
}
}
} // namespace holding_space_metrics
} // namespace ash
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ASH_PUBLIC_CPP_HOLDING_SPACE_HOLDING_SPACE_METRICS_H_
#define ASH_PUBLIC_CPP_HOLDING_SPACE_HOLDING_SPACE_METRICS_H_
#include <vector>
#include "ash/public/cpp/ash_public_export.h"
namespace ash {
class HoldingSpaceItem;
namespace holding_space_metrics {
// Enumeration of actions that can be taken on the holding space pod in the
// shelf. Note that these values are persisted to histograms so existing values
// should remain unchanged and new values should be added to the end.
enum class PodAction {
kClick = 0,
kMaxValue = kClick,
};
// Records the specified `action` taken on the holding space pod in the shelf.
ASH_PUBLIC_EXPORT void RecordPodAction(PodAction action);
// Enumeration of actions that can be taken on the holding space downloads
// button. Note that these values are persisted to histograms so existing
// values should remain unchanged and new values should be added to the end.
enum class DownloadsAction {
kClick = 0,
kMaxValue = kClick,
};
// Records the specified `action` taken on the holding space downloads header.
ASH_PUBLIC_EXPORT void RecordDownloadsAction(DownloadsAction action);
// Enumeration of actions that can be taken on holding space items. Note that
// these values are persisted to histograms so existing values should remain
// unchanged and new values should be added to the end.
enum class ItemAction {
kCopy = 0,
kDrag = 1,
kLaunch = 2,
kPin = 3,
kShowInFolder = 4,
kUnpin = 5,
kMaxValue = kUnpin,
};
// Records the specified `action` taken on a set of holding space `items`.
ASH_PUBLIC_EXPORT void RecordItemAction(
const std::vector<const HoldingSpaceItem*>& items,
ItemAction action);
// Records counts for the specified holding space `items`.
ASH_PUBLIC_EXPORT void RecordItemCounts(
const std::vector<const HoldingSpaceItem*>& items);
} // namespace holding_space_metrics
} // namespace ash
#endif // ASH_PUBLIC_CPP_HOLDING_SPACE_HOLDING_SPACE_METRICS_H_
...@@ -126,10 +126,15 @@ HoldingSpaceItemView::~HoldingSpaceItemView() { ...@@ -126,10 +126,15 @@ HoldingSpaceItemView::~HoldingSpaceItemView() {
// static // static
HoldingSpaceItemView* HoldingSpaceItemView::Cast(views::View* view) { HoldingSpaceItemView* HoldingSpaceItemView::Cast(views::View* view) {
DCHECK(view->GetProperty(kIsHoldingSpaceItemViewProperty)); DCHECK(HoldingSpaceItemView::IsInstance(view));
return static_cast<HoldingSpaceItemView*>(view); return static_cast<HoldingSpaceItemView*>(view);
} }
// static
bool HoldingSpaceItemView::IsInstance(views::View* view) {
return view->GetProperty(kIsHoldingSpaceItemViewProperty);
}
SkColor HoldingSpaceItemView::GetInkDropBaseColor() const { SkColor HoldingSpaceItemView::GetInkDropBaseColor() const {
return AshColorProvider::Get()->GetRippleAttributes().base_color; return AshColorProvider::Get()->GetRippleAttributes().base_color;
} }
......
...@@ -34,6 +34,9 @@ class ASH_EXPORT HoldingSpaceItemView : public views::InkDropHostView { ...@@ -34,6 +34,9 @@ class ASH_EXPORT HoldingSpaceItemView : public views::InkDropHostView {
// DCHECK to assert that `view` is in fact a `HoldingSpaceItemView` instance. // DCHECK to assert that `view` is in fact a `HoldingSpaceItemView` instance.
static HoldingSpaceItemView* Cast(views::View* view); static HoldingSpaceItemView* Cast(views::View* view);
// Returns if `view` is an instance of `HoldingSpaceItemView`.
static bool IsInstance(views::View* view);
// views::InkDropHostView: // views::InkDropHostView:
SkColor GetInkDropBaseColor() const override; SkColor GetInkDropBaseColor() const override;
void OnBoundsChanged(const gfx::Rect& previous_bounds) override; void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "ash/public/cpp/holding_space/holding_space_constants.h" #include "ash/public/cpp/holding_space/holding_space_constants.h"
#include "ash/public/cpp/holding_space/holding_space_controller.h" #include "ash/public/cpp/holding_space/holding_space_controller.h"
#include "ash/public/cpp/holding_space/holding_space_item.h" #include "ash/public/cpp/holding_space/holding_space_item.h"
#include "ash/public/cpp/holding_space/holding_space_metrics.h"
#include "ash/public/cpp/holding_space/holding_space_model.h" #include "ash/public/cpp/holding_space/holding_space_model.h"
#include "ash/resources/vector_icons/vector_icons.h" #include "ash/resources/vector_icons/vector_icons.h"
#include "ash/strings/grit/ash_strings.h" #include "ash/strings/grit/ash_strings.h"
...@@ -34,15 +35,15 @@ HoldingSpaceItemViewDelegate* instance = nullptr; ...@@ -34,15 +35,15 @@ HoldingSpaceItemViewDelegate* instance = nullptr;
// Returns the holding space items associated with the specified `views`. // Returns the holding space items associated with the specified `views`.
std::vector<const HoldingSpaceItem*> GetItems( std::vector<const HoldingSpaceItem*> GetItems(
const std::vector<HoldingSpaceItemView*>& views) { const std::vector<const HoldingSpaceItemView*>& views) {
std::vector<const HoldingSpaceItem*> items; std::vector<const HoldingSpaceItem*> items;
for (HoldingSpaceItemView* view : views) for (const HoldingSpaceItemView* view : views)
items.push_back(view->item()); items.push_back(view->item());
return items; return items;
} }
// Attempts to open the holding space items associated with the given `views`. // Attempts to open the holding space items associated with the given `views`.
void OpenItems(const std::vector<HoldingSpaceItemView*>& views) { void OpenItems(const std::vector<const HoldingSpaceItemView*>& views) {
DCHECK_GE(views.size(), 1u); DCHECK_GE(views.size(), 1u);
HoldingSpaceController::Get()->client()->OpenItems(GetItems(views), HoldingSpaceController::Get()->client()->OpenItems(GetItems(views),
base::DoNothing()); base::DoNothing());
...@@ -206,18 +207,23 @@ void HoldingSpaceItemViewDelegate::WriteDragDataForView( ...@@ -206,18 +207,23 @@ void HoldingSpaceItemViewDelegate::WriteDragDataForView(
views::View* sender, views::View* sender,
const gfx::Point& press_pt, const gfx::Point& press_pt,
ui::OSExchangeData* data) { ui::OSExchangeData* data) {
std::vector<const HoldingSpaceItemView*> selection = GetSelection();
DCHECK_GE(selection.size(), 1u);
holding_space_metrics::RecordItemAction(
GetItems(selection), holding_space_metrics::ItemAction::kDrag);
std::vector<ui::FileInfo> filenames; std::vector<ui::FileInfo> filenames;
for (const HoldingSpaceItemView* view : GetSelection()) { for (const HoldingSpaceItemView* view : selection) {
filenames.push_back(ui::FileInfo(view->item()->file_path(), filenames.push_back(ui::FileInfo(view->item()->file_path(),
view->item()->file_path().BaseName())); view->item()->file_path().BaseName()));
} }
DCHECK_GE(filenames.size(), 1u);
data->SetFilenames(filenames); data->SetFilenames(filenames);
} }
void HoldingSpaceItemViewDelegate::ExecuteCommand(int command_id, void HoldingSpaceItemViewDelegate::ExecuteCommand(int command_id,
int event_flags) { int event_flags) {
std::vector<HoldingSpaceItemView*> selection = GetSelection(); std::vector<const HoldingSpaceItemView*> selection = GetSelection();
DCHECK_GE(selection.size(), 1u); DCHECK_GE(selection.size(), 1u);
switch (command_id) { switch (command_id) {
...@@ -243,7 +249,7 @@ void HoldingSpaceItemViewDelegate::ExecuteCommand(int command_id, ...@@ -243,7 +249,7 @@ void HoldingSpaceItemViewDelegate::ExecuteCommand(int command_id,
ui::SimpleMenuModel* HoldingSpaceItemViewDelegate::BuildMenuModel() { ui::SimpleMenuModel* HoldingSpaceItemViewDelegate::BuildMenuModel() {
context_menu_model_ = std::make_unique<ui::SimpleMenuModel>(this); context_menu_model_ = std::make_unique<ui::SimpleMenuModel>(this);
std::vector<HoldingSpaceItemView*> selection = GetSelection(); std::vector<const HoldingSpaceItemView*> selection = GetSelection();
DCHECK_GE(selection.size(), 1u); DCHECK_GE(selection.size(), 1u);
if (selection.size() == 1u) { if (selection.size() == 1u) {
...@@ -273,7 +279,7 @@ ui::SimpleMenuModel* HoldingSpaceItemViewDelegate::BuildMenuModel() { ...@@ -273,7 +279,7 @@ ui::SimpleMenuModel* HoldingSpaceItemViewDelegate::BuildMenuModel() {
} }
const bool is_any_unpinned = std::any_of( const bool is_any_unpinned = std::any_of(
selection.begin(), selection.end(), [](HoldingSpaceItemView* view) { selection.begin(), selection.end(), [](const HoldingSpaceItemView* view) {
return !HoldingSpaceController::Get()->model()->GetItem( return !HoldingSpaceController::Get()->model()->GetItem(
HoldingSpaceItem::GetFileBackedItemId( HoldingSpaceItem::GetFileBackedItemId(
HoldingSpaceItem::Type::kPinnedFile, HoldingSpaceItem::Type::kPinnedFile,
...@@ -300,10 +306,10 @@ ui::SimpleMenuModel* HoldingSpaceItemViewDelegate::BuildMenuModel() { ...@@ -300,10 +306,10 @@ ui::SimpleMenuModel* HoldingSpaceItemViewDelegate::BuildMenuModel() {
return context_menu_model_.get(); return context_menu_model_.get();
} }
std::vector<HoldingSpaceItemView*> std::vector<const HoldingSpaceItemView*>
HoldingSpaceItemViewDelegate::GetSelection() { HoldingSpaceItemViewDelegate::GetSelection() {
std::vector<HoldingSpaceItemView*> selection; std::vector<const HoldingSpaceItemView*> selection;
for (HoldingSpaceItemView* view : views_) { for (const HoldingSpaceItemView* view : views_) {
if (view->selected()) if (view->selected())
selection.push_back(view); selection.push_back(view);
} }
......
...@@ -88,7 +88,7 @@ class ASH_EXPORT HoldingSpaceItemViewDelegate ...@@ -88,7 +88,7 @@ class ASH_EXPORT HoldingSpaceItemViewDelegate
ui::SimpleMenuModel* BuildMenuModel(); ui::SimpleMenuModel* BuildMenuModel();
// Returns the subset of `views_` which are currently selected. // Returns the subset of `views_` which are currently selected.
std::vector<HoldingSpaceItemView*> GetSelection(); std::vector<const HoldingSpaceItemView*> GetSelection();
// Marks `view` as selected. All other `views_` are marked unselected. // Marks `view` as selected. All other `views_` are marked unselected.
void SetSelection(views::View* view); void SetSelection(views::View* view);
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "ash/accessibility/accessibility_controller_impl.h" #include "ash/accessibility/accessibility_controller_impl.h"
#include "ash/public/cpp/holding_space/holding_space_constants.h" #include "ash/public/cpp/holding_space/holding_space_constants.h"
#include "ash/public/cpp/holding_space/holding_space_metrics.h"
#include "ash/public/cpp/shelf_config.h" #include "ash/public/cpp/shelf_config.h"
#include "ash/public/cpp/system_tray_client.h" #include "ash/public/cpp/system_tray_client.h"
#include "ash/resources/vector_icons/vector_icons.h" #include "ash/resources/vector_icons/vector_icons.h"
...@@ -74,6 +75,9 @@ void HoldingSpaceTray::AnchorUpdated() { ...@@ -74,6 +75,9 @@ void HoldingSpaceTray::AnchorUpdated() {
} }
bool HoldingSpaceTray::PerformAction(const ui::Event& event) { bool HoldingSpaceTray::PerformAction(const ui::Event& event) {
holding_space_metrics::RecordPodAction(
holding_space_metrics::PodAction::kClick);
if (bubble_) { if (bubble_) {
CloseBubble(); CloseBubble();
return true; return true;
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
namespace views { namespace views {
class ImageView; class ImageView;
} } // namespace views
namespace ash { namespace ash {
// The HoldingSpaceTray shows the tray button in the bottom area of the screen. // The HoldingSpaceTray shows the tray button in the bottom area of the screen.
......
...@@ -4,9 +4,14 @@ ...@@ -4,9 +4,14 @@
#include "ash/system/holding_space/holding_space_tray_bubble.h" #include "ash/system/holding_space/holding_space_tray_bubble.h"
#include <vector>
#include "ash/public/cpp/holding_space/holding_space_constants.h" #include "ash/public/cpp/holding_space/holding_space_constants.h"
#include "ash/public/cpp/holding_space/holding_space_item.h"
#include "ash/public/cpp/holding_space/holding_space_metrics.h"
#include "ash/public/cpp/shelf_config.h" #include "ash/public/cpp/shelf_config.h"
#include "ash/shelf/shelf.h" #include "ash/shelf/shelf.h"
#include "ash/system/holding_space/holding_space_item_view.h"
#include "ash/system/holding_space/holding_space_tray.h" #include "ash/system/holding_space/holding_space_tray.h"
#include "ash/system/holding_space/pinned_files_container.h" #include "ash/system/holding_space/pinned_files_container.h"
#include "ash/system/holding_space/recent_files_container.h" #include "ash/system/holding_space/recent_files_container.h"
...@@ -20,6 +25,21 @@ ...@@ -20,6 +25,21 @@
namespace ash { namespace ash {
namespace { namespace {
// Helpers ---------------------------------------------------------------------
// Finds all visible `HoldingSpaceItem`s in `parent`'s view hierarchy.
void FindVisibleHoldingSpaceItems(
views::View* parent,
std::vector<const HoldingSpaceItem*>* result) {
for (views::View* view : parent->children()) {
if (view->GetVisible() && HoldingSpaceItemView::IsInstance(view))
result->push_back(HoldingSpaceItemView::Cast(view)->item());
FindVisibleHoldingSpaceItems(view, result);
}
}
// Sets up the layer for the specified `view`.
void SetupViewLayer(views::View* view) { void SetupViewLayer(views::View* view) {
view->SetPaintToLayer(ui::LAYER_SOLID_COLOR); view->SetPaintToLayer(ui::LAYER_SOLID_COLOR);
...@@ -32,6 +52,8 @@ void SetupViewLayer(views::View* view) { ...@@ -32,6 +52,8 @@ void SetupViewLayer(views::View* view) {
layer->SetIsFastRoundedCorner(true); layer->SetIsFastRoundedCorner(true);
} }
// HoldingSpaceBubbleContainerView ---------------------------------------------
class HoldingSpaceBubbleContainerView : public views::View { class HoldingSpaceBubbleContainerView : public views::View {
public: public:
HoldingSpaceBubbleContainerView() { HoldingSpaceBubbleContainerView() {
...@@ -51,8 +73,11 @@ class HoldingSpaceBubbleContainerView : public views::View { ...@@ -51,8 +73,11 @@ class HoldingSpaceBubbleContainerView : public views::View {
private: private:
views::BoxLayout* layout_ = nullptr; views::BoxLayout* layout_ = nullptr;
}; };
} // namespace } // namespace
// HoldingSpaceTrayBubble ------------------------------------------------------
HoldingSpaceTrayBubble::HoldingSpaceTrayBubble( HoldingSpaceTrayBubble::HoldingSpaceTrayBubble(
HoldingSpaceTray* holding_space_tray, HoldingSpaceTray* holding_space_tray,
bool show_by_click) bool show_by_click)
...@@ -100,6 +125,11 @@ HoldingSpaceTrayBubble::HoldingSpaceTrayBubble( ...@@ -100,6 +125,11 @@ HoldingSpaceTrayBubble::HoldingSpaceTrayBubble(
->non_client_view() ->non_client_view()
->frame_view() ->frame_view()
->SetVisible(false); ->SetVisible(false);
// Record visible holding space items.
std::vector<const HoldingSpaceItem*> visible_items;
FindVisibleHoldingSpaceItems(bubble_view, &visible_items);
holding_space_metrics::RecordItemCounts(visible_items);
} }
HoldingSpaceTrayBubble::~HoldingSpaceTrayBubble() { HoldingSpaceTrayBubble::~HoldingSpaceTrayBubble() {
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "ash/public/cpp/holding_space/holding_space_constants.h" #include "ash/public/cpp/holding_space/holding_space_constants.h"
#include "ash/public/cpp/holding_space/holding_space_item.h" #include "ash/public/cpp/holding_space/holding_space_item.h"
#include "ash/public/cpp/holding_space/holding_space_metrics.h"
#include "base/barrier_closure.h" #include "base/barrier_closure.h"
#include "base/bind.h" #include "base/bind.h"
#include "base/notreached.h" #include "base/notreached.h"
...@@ -49,6 +50,9 @@ void HoldingSpaceClientImpl::AddScreenshot(const base::FilePath& file_path) { ...@@ -49,6 +50,9 @@ void HoldingSpaceClientImpl::AddScreenshot(const base::FilePath& file_path) {
void HoldingSpaceClientImpl::CopyImageToClipboard(const HoldingSpaceItem& item, void HoldingSpaceClientImpl::CopyImageToClipboard(const HoldingSpaceItem& item,
SuccessCallback callback) { SuccessCallback callback) {
holding_space_metrics::RecordItemAction(
{&item}, holding_space_metrics::ItemAction::kCopy);
std::string mime_type; std::string mime_type;
if (item.file_path().empty() || if (item.file_path().empty() ||
!net::GetMimeTypeFromFile(item.file_path(), &mime_type) || !net::GetMimeTypeFromFile(item.file_path(), &mime_type) ||
...@@ -56,6 +60,7 @@ void HoldingSpaceClientImpl::CopyImageToClipboard(const HoldingSpaceItem& item, ...@@ -56,6 +60,7 @@ void HoldingSpaceClientImpl::CopyImageToClipboard(const HoldingSpaceItem& item,
std::move(callback).Run(/*success=*/false); std::move(callback).Run(/*success=*/false);
return; return;
} }
// Reading and decoding of the image file needs to be done on an I/O thread. // Reading and decoding of the image file needs to be done on an I/O thread.
base::ThreadPool::PostTaskAndReply( base::ThreadPool::PostTaskAndReply(
FROM_HERE, FROM_HERE,
...@@ -93,6 +98,9 @@ void HoldingSpaceClientImpl::OpenDownloads(SuccessCallback callback) { ...@@ -93,6 +98,9 @@ void HoldingSpaceClientImpl::OpenDownloads(SuccessCallback callback) {
void HoldingSpaceClientImpl::OpenItems( void HoldingSpaceClientImpl::OpenItems(
const std::vector<const HoldingSpaceItem*>& items, const std::vector<const HoldingSpaceItem*>& items,
SuccessCallback callback) { SuccessCallback callback) {
holding_space_metrics::RecordItemAction(
items, holding_space_metrics::ItemAction::kLaunch);
if (items.empty()) { if (items.empty()) {
std::move(callback).Run(/*success=*/false); std::move(callback).Run(/*success=*/false);
return; return;
...@@ -130,10 +138,14 @@ void HoldingSpaceClientImpl::OpenItems( ...@@ -130,10 +138,14 @@ void HoldingSpaceClientImpl::OpenItems(
void HoldingSpaceClientImpl::ShowItemInFolder(const HoldingSpaceItem& item, void HoldingSpaceClientImpl::ShowItemInFolder(const HoldingSpaceItem& item,
SuccessCallback callback) { SuccessCallback callback) {
holding_space_metrics::RecordItemAction(
{&item}, holding_space_metrics::ItemAction::kShowInFolder);
if (item.file_path().empty()) { if (item.file_path().empty()) {
std::move(callback).Run(/*success=*/false); std::move(callback).Run(/*success=*/false);
return; return;
} }
file_manager::util::ShowItemInFolder( file_manager::util::ShowItemInFolder(
profile_, item.file_path(), profile_, item.file_path(),
base::BindOnce( base::BindOnce(
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "ash/public/cpp/holding_space/holding_space_controller.h" #include "ash/public/cpp/holding_space/holding_space_controller.h"
#include "ash/public/cpp/holding_space/holding_space_image.h" #include "ash/public/cpp/holding_space/holding_space_image.h"
#include "ash/public/cpp/holding_space/holding_space_item.h" #include "ash/public/cpp/holding_space/holding_space_item.h"
#include "ash/public/cpp/holding_space/holding_space_metrics.h"
#include "base/barrier_closure.h" #include "base/barrier_closure.h"
#include "base/files/file_path.h" #include "base/files/file_path.h"
#include "base/guid.h" #include "base/guid.h"
...@@ -84,18 +85,32 @@ base::Time HoldingSpaceKeyedService::GetFirstEnabledTime(Profile* profile) { ...@@ -84,18 +85,32 @@ base::Time HoldingSpaceKeyedService::GetFirstEnabledTime(Profile* profile) {
void HoldingSpaceKeyedService::AddPinnedFile( void HoldingSpaceKeyedService::AddPinnedFile(
const storage::FileSystemURL& file_system_url) { const storage::FileSystemURL& file_system_url) {
AddItem(HoldingSpaceItem::CreateFileBackedItem( std::unique_ptr<HoldingSpaceItem> holding_space_item =
HoldingSpaceItem::Type::kPinnedFile, file_system_url.path(), HoldingSpaceItem::CreateFileBackedItem(
file_system_url.ToGURL(), HoldingSpaceItem::Type::kPinnedFile, file_system_url.path(),
holding_space_util::ResolveImage(&thumbnail_loader_, file_system_url.ToGURL(),
HoldingSpaceItem::Type::kPinnedFile, holding_space_util::ResolveImage(&thumbnail_loader_,
file_system_url.path()))); HoldingSpaceItem::Type::kPinnedFile,
file_system_url.path()));
holding_space_metrics::RecordItemAction(
{holding_space_item.get()}, holding_space_metrics::ItemAction::kPin);
AddItem(std::move(holding_space_item));
} }
void HoldingSpaceKeyedService::RemovePinnedFile( void HoldingSpaceKeyedService::RemovePinnedFile(
const storage::FileSystemURL& file_system_url) { const storage::FileSystemURL& file_system_url) {
holding_space_model_.RemoveItem(HoldingSpaceItem::GetFileBackedItemId( const HoldingSpaceItem* holding_space_item =
HoldingSpaceItem::Type::kPinnedFile, file_system_url.path())); holding_space_model_.GetItem(HoldingSpaceItem::GetFileBackedItemId(
HoldingSpaceItem::Type::kPinnedFile, file_system_url.path()));
if (!holding_space_item)
return;
holding_space_metrics::RecordItemAction(
{holding_space_item}, holding_space_metrics::ItemAction::kUnpin);
holding_space_model_.RemoveItem(holding_space_item->id());
} }
bool HoldingSpaceKeyedService::ContainsPinnedFile( bool HoldingSpaceKeyedService::ContainsPinnedFile(
......
...@@ -35414,6 +35414,29 @@ Called by update_gpu_driver_bug_workaround_entries.py.--> ...@@ -35414,6 +35414,29 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="2" label="Different from baseUrl"/> <int value="2" label="Different from baseUrl"/>
</enum> </enum>
<enum name="HoldingSpaceDownloadsAction">
<int value="0" label="kClick"/>
</enum>
<enum name="HoldingSpaceItemAction">
<int value="0" label="kCopy"/>
<int value="1" label="kDrag"/>
<int value="2" label="kLaunch"/>
<int value="3" label="kPin"/>
<int value="4" label="kShowInFolder"/>
<int value="5" label="kUnpin"/>
</enum>
<enum name="HoldingSpaceItemType">
<int value="0" label="kPinnedFile"/>
<int value="1" label="kScreenshot"/>
<int value="2" label="kDownload"/>
</enum>
<enum name="HoldingSpacePodAction">
<int value="0" label="kClick"/>
</enum>
<enum name="HomeButtonPreferenceStateType"> <enum name="HomeButtonPreferenceStateType">
<int value="0" label="User Disabled"/> <int value="0" label="User Disabled"/>
<int value="1" label="User Enabled"/> <int value="1" label="User Enabled"/>
...@@ -43,6 +43,7 @@ tools/metrics/histograms/histograms_xml/google/histograms.xml ...@@ -43,6 +43,7 @@ tools/metrics/histograms/histograms_xml/google/histograms.xml
tools/metrics/histograms/histograms_xml/gpu/histograms.xml tools/metrics/histograms/histograms_xml/gpu/histograms.xml
tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml
tools/metrics/histograms/histograms_xml/history/histograms.xml tools/metrics/histograms/histograms_xml/history/histograms.xml
tools/metrics/histograms/histograms_xml/holding_space/histograms.xml
tools/metrics/histograms/histograms_xml/image/histograms.xml tools/metrics/histograms/histograms_xml/image/histograms.xml
tools/metrics/histograms/histograms_xml/input/histograms.xml tools/metrics/histograms/histograms_xml/input/histograms.xml
tools/metrics/histograms/histograms_xml/installer/histograms.xml tools/metrics/histograms/histograms_xml/installer/histograms.xml
......
<!--
Copyright 2020 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<!--
This file is used to generate a comprehensive list of Holding Space histograms
along with a detailed description for each histogram.
For best practices on writing histogram descriptions, see
https://chromium.googlesource.com/chromium/src.git/+/HEAD/tools/metrics/histograms/README.md
Please send CLs to chromium-metrics-reviews@google.com rather than to specific
individuals. These CLs will be automatically reassigned to a reviewer within
about 5 minutes. This approach helps the metrics team to load-balance incoming
reviews. Googlers can read more about this at go/gwsq-gerrit.
-->
<histogram-configuration>
<histograms>
<histogram name="HoldingSpace.Downloads.Action.All"
enum="HoldingSpaceDownloadsAction" expires_after="2021-09-24">
<owner>dmblack@google.com</owner>
<owner>gzadina@google.com</owner>
<summary>
Records an action taken on the downloads header in holding space UI at the
moment the action is performed.
</summary>
</histogram>
<histogram base="true" name="HoldingSpace.Item.Action"
enum="HoldingSpaceItemType" expires_after="2021-09-24">
<!-- Name completed by histogram_suffixes name="HoldingSpaceActionType" -->
<owner>dmblack@google.com</owner>
<owner>gzadina@google.com</owner>
<summary>
Records the type of item in holding space UI for which an action was taken
at the moment the action is performed.
</summary>
</histogram>
<histogram name="HoldingSpace.Item.Action.All" enum="HoldingSpaceItemAction"
expires_after="2021-09-24">
<owner>dmblack@google.com</owner>
<owner>gzadina@google.com</owner>
<summary>
Records an action taken on an item in holding space UI at the moment the
action is performed.
</summary>
</histogram>
<histogram base="true" name="HoldingSpace.Item.Count" units="count"
expires_after="2021-09-24">
<!-- Name completed by histogram_suffixes name="HoldingSpaceItemType" -->
<owner>dmblack@google.com</owner>
<owner>gzadina@google.com</owner>
<summary>
Records the count of all visible items of a specific type in holding space
at the moment holding space UI is shown.
</summary>
</histogram>
<histogram name="HoldingSpace.Pod.Action.All" enum="HoldingSpacePodAction"
expires_after="2021-09-24">
<owner>dmblack@google.com</owner>
<owner>gzadina@google.com</owner>
<summary>
Records an action taken on the holding space pod in the shelf at the moment
the action is performed.
</summary>
</histogram>
</histograms>
<histogram_suffixes_list>
<histogram_suffixes name="HoldingSpaceItemAction" separator=".">
<suffix name="Copy" label="The user copied the item."/>
<suffix name="Drag" label="The user dragged the item."/>
<suffix name="Launch" label="The user launched the item."/>
<suffix name="Pin" label="The user pinned the item."/>
<suffix name="ShowInFolder" label="The user showed the item in its folder."/>
<suffix name="Unpin" label="The user unpinned the item."/>
<affected-histogram name="HoldingSpace.Item.Action"/>
</histogram_suffixes>
<histogram_suffixes name="HoldingSpaceItemType" separator=".">
<suffix name="All" label="Includes all item types."/>
<suffix name="Download" label="Items backed by a download file."/>
<suffix name="PinnedFile" label="Items pinned explicitly by the user."/>
<suffix name="Screenshot" label="Items backed by a screenshot file."/>
<affected-histogram name="HoldingSpace.Item.Count"/>
</histogram_suffixes>
</histogram_suffixes_list>
</histogram-configuration>
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