[Files Ranking] Add metrics for files ranking.

Adds 2 metrics for file ranking:
1. Number of clicks according to different search result's display type
in zero-state.
2. Number of file opens according to different open types.

Bug: 959679
Change-Id: I57e531162c5fdbb826a5e6cb4b0e266694c1e25e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1616926
Reviewed-by: Steven Holte <holte@chromium.org>
Reviewed-by: calamity <calamity@chromium.org>
Reviewed-by: Jia Meng <jiameng@chromium.org>
Commit-Queue: Thanh Nguyen <thanhdng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#663367}
diff --git a/chrome/browser/ui/app_list/search/search_controller.cc b/chrome/browser/ui/app_list/search/search_controller.cc
index 0b3cca4c..c873594 100644
--- a/chrome/browser/ui/app_list/search/search_controller.cc
+++ b/chrome/browser/ui/app_list/search/search_controller.cc
@@ -12,6 +12,7 @@
 #include "ash/public/cpp/app_list/app_list_config.h"
 #include "ash/public/cpp/app_list/app_list_features.h"
 #include "base/bind.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
@@ -34,6 +35,9 @@
 
 namespace {
 
+constexpr char kLogDisplayTypeClickedResultZeroState[] =
+    "Apps.LogDisplayTypeClickedResultZeroState";
+
 // Normalizes training targets by removing any scheme prefix and trailing slash:
 // "arc://[id]/" to "[id]". This is necessary because apps launched from
 // different parts of the launcher have differently formatted IDs.
@@ -87,6 +91,13 @@
   if (!result)
     return;
 
+  // Log the display type of the clicked result in zero-state
+  if (query_for_recommendation_) {
+    UMA_HISTOGRAM_ENUMERATION(kLogDisplayTypeClickedResultZeroState,
+                              result->display_type(),
+                              ash::SearchResultDisplayType::kLast);
+  }
+
   result->Open(event_flags);
 
   // Launching apps can take some time. It looks nicer to dismiss the app list.
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.cc b/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.cc
index 6d497db..a89f71d 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.cc
@@ -10,6 +10,7 @@
 #include "ash/public/cpp/app_list/app_list_types.h"
 #include "base/macros.h"
 #include "base/metrics/field_trial_params.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/strings/string_number_conversions.h"
 #include "chrome/browser/chromeos/file_manager/file_tasks_notifier.h"
 #include "chrome/browser/chromeos/file_manager/file_tasks_notifier_factory.h"
@@ -24,10 +25,13 @@
 
 using base::Time;
 using base::TimeDelta;
+using file_manager::file_tasks::FileTasksObserver;
 
 // Limits how frequently models are queried for ranking results.
 constexpr TimeDelta kMinSecondsBetweenFetches = TimeDelta::FromSeconds(1);
 
+constexpr char kLogFileOpenType[] = "RecurrenceRanker.LogFileOpenType";
+
 // Represents each model used within the SearchResultRanker.
 enum class Model { NONE, RESULTS_LIST_GROUP_RANKER };
 
@@ -47,6 +51,33 @@
   }
 }
 
+// Represents various open types of file open events. These values persist to
+// logs. Entries should not be renumbered and numeric values should never
+// be reused.
+enum class FileOpenType {
+  kUnknown = 0,
+  kLaunch = 1,
+  kOpen = 2,
+  kSaveAs = 3,
+  kDownload = 4,
+  kMaxValue = kDownload,
+};
+
+FileOpenType GetTypeFromFileTaskNotifier(FileTasksObserver::OpenType type) {
+  switch (type) {
+    case FileTasksObserver::OpenType::kLaunch:
+      return FileOpenType::kLaunch;
+    case FileTasksObserver::OpenType::kOpen:
+      return FileOpenType::kOpen;
+    case FileTasksObserver::OpenType::kSaveAs:
+      return FileOpenType::kSaveAs;
+    case FileTasksObserver::OpenType::kDownload:
+      return FileOpenType::kDownload;
+    default:
+      return FileOpenType::kUnknown;
+  }
+}
+
 }  // namespace
 
 SearchResultRanker::SearchResultRanker(Profile* profile)
@@ -75,15 +106,14 @@
         app_list_features::kEnableQueryBasedMixedTypesRanker,
         "boost_coefficient", 0.1);
   }
-
   profile_ = profile;
-  if (enable_zero_state_mixed_types_) {
-    if (auto* notifier =
-            file_manager::file_tasks::FileTasksNotifier::GetForProfile(
-                profile_)) {
-      notifier->AddObserver(this);
-    }
 
+  if (auto* notifier =
+          file_manager::file_tasks::FileTasksNotifier::GetForProfile(
+              profile_)) {
+    notifier->AddObserver(this);
+  }
+  if (enable_zero_state_mixed_types_) {
     RecurrenceRankerConfigProto config;
     config.set_min_seconds_between_saves(240u);
     config.set_condition_limit(0u);
@@ -107,12 +137,10 @@
 }
 
 SearchResultRanker::~SearchResultRanker() {
-  if (enable_zero_state_mixed_types_) {
-    if (auto* notifier =
-            file_manager::file_tasks::FileTasksNotifier::GetForProfile(
-                profile_)) {
-      notifier->RemoveObserver(this);
-    }
+  if (auto* notifier =
+          file_manager::file_tasks::FileTasksNotifier::GetForProfile(
+              profile_)) {
+    notifier->RemoveObserver(this);
   }
 }
 
@@ -175,6 +203,10 @@
     for (const auto& file_open : file_opens)
       zero_state_mixed_types_ranker_->Record(file_open.path.value());
   }
+  // Log the open type of file open events
+  for (const auto& file_open : file_opens)
+    UMA_HISTOGRAM_ENUMERATION(kLogFileOpenType,
+                              GetTypeFromFileTaskNotifier(file_open.open_type));
 }
 
 RecurrenceRanker* SearchResultRanker::get_zero_state_mixed_types_ranker() {
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 2606424..512f295 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -2192,6 +2192,7 @@
   <int value="1" label="LIST"/>
   <int value="2" label="TILE"/>
   <int value="3" label="RECOMMENDATION"/>
+  <int value="4" label="CARD"/>
 </enum>
 
 <enum name="ApplistSearchResultOpenedSource">
@@ -24484,6 +24485,14 @@
   <int value="14" label="Async DeleteFile Failed"/>
 </enum>
 
+<enum name="FileOpenType">
+  <int value="0" label="Unknown"/>
+  <int value="1" label="Launch"/>
+  <int value="2" label="Open"/>
+  <int value="3" label="SaveAs"/>
+  <int value="4" label="Download"/>
+</enum>
+
 <enum name="FileReaderLoaderFailureType">
   <int value="0" label="Mojo pipe creation failed"/>
   <int value="1" label="Data incomplete after synchronous reading"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 143baeb..0308867 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -4803,6 +4803,17 @@
   </summary>
 </histogram>
 
+<histogram name="Apps.LogDisplayTypeClickedResultZeroState"
+    enum="AppListSearchResultDisplayType" expires_after="2019-12-31">
+  <owner>jiameng@chromium.org</owner>
+  <owner>thanhdng@chromium.org</owner>
+  <owner>tby@chromium.org</owner>
+  <summary>
+    Records number of clicks on search result for different display types in
+    zero-state.
+  </summary>
+</histogram>
+
 <histogram name="Apps.NoteTakingApp.DefaultLaunchResult"
     enum="NoteTakingAppLaunchResult">
   <owner>derat@chromium.org</owner>
@@ -102243,6 +102254,16 @@
   <summary>Log each stage of a recovery component event.</summary>
 </histogram>
 
+<histogram name="RecurrenceRanker.LogFileOpenType" enum="FileOpenType"
+    expires_after="2019-12-31">
+  <owner>jiameng@chromium.org</owner>
+  <owner>thanhdng@chromium.org</owner>
+  <owner>tby@chromium.org</owner>
+  <summary>
+    Records number of file opens for each file open type events.
+  </summary>
+</histogram>
+
 <histogram name="Referrer.HeaderLength" units="bytes">
   <owner>mkwst@chromium.org</owner>
   <summary>