Index: ios/chrome/browser/metrics/first_user_action_recorder.h |
diff --git a/ios/chrome/browser/metrics/first_user_action_recorder.h b/ios/chrome/browser/metrics/first_user_action_recorder.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..202335799da74fb71f254c6b2192010ec225e57a |
--- /dev/null |
+++ b/ios/chrome/browser/metrics/first_user_action_recorder.h |
@@ -0,0 +1,94 @@ |
+// Copyright 2013 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 IOS_CHROME_BROWSER_METRICS_FIRST_USER_ACTION_RECORDER_H_ |
+#define IOS_CHROME_BROWSER_METRICS_FIRST_USER_ACTION_RECORDER_H_ |
+ |
+#include <vector> |
+ |
+#include "base/metrics/user_metrics.h" |
+#include "base/time/time.h" |
+ |
+// Histogram names (visible for testing only). |
+// Each is a 2-element array where the first element is the |
+// name of the histogram for handsets and the second is the name of the |
+// histogram for tablets. |
+ |
+// The histogram to plot background duration before 'new task' actions. |
+extern const char* kFirstUserActionNewTaskHistogramName[]; |
+ |
+// The histogram to plot background duration before 'continuation' actions. |
+extern const char* kFirstUserActionContinuationHistogramName[]; |
+ |
+// The histogram to plot background duration before 'expiration' actions. |
+extern const char* kFirstUserActionExpirationHistogramName[]; |
+ |
+// The name of the histogram to plot the type of first user action (see |
+// |FirstUserActionType|). |
+extern const char* kFirstUserActionTypeHistogramName[]; |
+ |
+// Since it logs user actions while it exists, it should only be instantiated |
+// while metrics recording is enabled. |
+class FirstUserActionRecorder { |
+ public: |
+ // Indicies of the histogram name arrays for each device family. |
+ enum DeviceFamilyIndex { HANDSET = 0, TABLET = 1 }; |
+ |
+ // Values of the first user action type histogram. |
+ enum FirstUserActionType { |
+ NEW_TASK = 0, |
+ CONTINUATION, |
+ EXPIRATION, |
+ START_ON_NTP, |
+ FIRST_USER_ACTION_TYPE_COUNT, |
+ }; |
+ |
+ explicit FirstUserActionRecorder(base::TimeDelta background_duration); |
+ virtual ~FirstUserActionRecorder(); |
+ |
+ // Records that no applicable user action occurred. |
+ void Expire(); |
+ |
+ // Records that the app started with the NTP active. |
+ void RecordStartOnNTP(); |
+ |
+ private: |
+ // Records metrics if |action_name| indicates the start of a new task or the |
+ // continuation of an existing task. |
+ void OnUserAction(const std::string& action_name); |
+ |
+ // Records the appropriate metrics for the given action type. |
+ void RecordAction(const FirstUserActionType& action_type, |
+ const std::string& log_message); |
+ |
+ // Returns true if the specified action should be processed, or false if the |
+ // action should be ignored. |
+ bool ShouldProcessAction(const std::string& action_name); |
+ |
+ // Returns true if the given array contains the given string. |
+ bool ArrayContainsString(const char* to_search[], |
+ const size_t to_search_size, |
+ const char* to_find); |
+ |
+ // True if running on a tablet. |
+ const DeviceFamilyIndex device_family_; |
+ |
+ // True if this instance has recorded a 'new task' or 'continuation task' |
+ // metric. |
+ bool recorded_action_; |
+ |
+ // True if this instance has rethrown an action. |
+ bool action_pending_; |
+ |
+ // The amount of time the app was in the background before this recorder was |
+ // created. |
+ base::TimeDelta background_duration_; |
+ |
+ // The callback to invoke when an action is recorded. |
+ base::ActionCallback action_callback_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FirstUserActionRecorder); |
+}; |
+ |
+#endif // IOS_CHROME_BROWSER_METRICS_FIRST_USER_ACTION_RECORDER_H_ |