summaryrefslogtreecommitdiff
path: root/chromium/components/ntp_snippets/user_classifier.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/ntp_snippets/user_classifier.h')
-rw-r--r--chromium/components/ntp_snippets/user_classifier.h109
1 files changed, 109 insertions, 0 deletions
diff --git a/chromium/components/ntp_snippets/user_classifier.h b/chromium/components/ntp_snippets/user_classifier.h
new file mode 100644
index 00000000000..4f8c9848d62
--- /dev/null
+++ b/chromium/components/ntp_snippets/user_classifier.h
@@ -0,0 +1,109 @@
+// Copyright 2016 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 COMPONENTS_NTP_SNIPPETS_USER_CLASSIFIER_H_
+#define COMPONENTS_NTP_SNIPPETS_USER_CLASSIFIER_H_
+
+#include <string>
+
+#include "base/macros.h"
+#include "base/time/time.h"
+
+class PrefRegistrySimple;
+class PrefService;
+
+namespace ntp_snippets {
+
+// Collects data about user usage patterns of content suggestions, computes
+// long-term user metrics locally using pref, and reports the metrics to UMA.
+// Based on these long-term user metrics, it classifies the user in a UserClass.
+class UserClassifier {
+ public:
+ // Enumeration listing user classes
+ enum class UserClass {
+ RARE_NTP_USER,
+ ACTIVE_NTP_USER,
+ ACTIVE_SUGGESTIONS_CONSUMER,
+ };
+
+ // For estimating the average length of the intervals between two successive
+ // events, we keep a simple frequency model, a single value that we call
+ // "metric" below.
+ // We track exponentially-discounted rate of the given event per hour where
+ // the continuous utility function between two successive events (e.g. opening
+ // a NTP) at times t1 < t2 is 1 / (t2-t1), i.e. intuitively the rate of this
+ // event in this time interval.
+ // See https://en.wikipedia.org/wiki/Exponential_discounting for more details.
+ // We keep track of the following events.
+ // NOTE: if you add any element, add it also in the static arrays in .cc and
+ // create another histogram.
+ enum class Metric {
+ NTP_OPENED, // When the user opens a new NTP - this indicates potential
+ // use of content suggestions.
+ SUGGESTIONS_SHOWN, // When the content suggestions are shown to the user -
+ // in the current implementation when the user scrolls
+ // below the fold.
+ SUGGESTIONS_USED, // When the user clicks on some suggestions or on some
+ // "More" button.
+ COUNT // Keep this as the last element.
+ };
+
+ // The provided |pref_service| may be nullptr in unit-tests.
+ explicit UserClassifier(PrefService* pref_service);
+ ~UserClassifier();
+
+ // Registers profile prefs for all metrics. Called from browser_prefs.cc.
+ static void RegisterProfilePrefs(PrefRegistrySimple* registry);
+
+ // Informs the UserClassifier about a new event for |metric|. The
+ // classification is based on these calls.
+ void OnEvent(Metric metric);
+
+ // Get the estimate average length of the interval between two successive
+ // events of the given type.
+ double GetEstimatedAvgTime(Metric metric) const;
+
+ // Return the classification of the current user.
+ UserClass GetUserClass() const;
+ std::string GetUserClassDescriptionForDebugging() const;
+
+ // Resets the classification (emulates a fresh upgrade / install).
+ void ClearClassificationForDebugging();
+
+ private:
+ // The event has happened, recompute the metric accordingly. Then store and
+ // return the new value.
+ double UpdateMetricOnEvent(Metric metric);
+ // No event has happened but we need to get up-to-date metric, recompute and
+ // return the new value. This function does not store the recomputed metric.
+ double GetUpToDateMetricValue(Metric metric) const;
+
+ // Returns the number of hours since the last event of the same type.
+ // If there is no last event of that type, assume it happened just now and
+ // return 0.
+ double GetHoursSinceLastTime(Metric metric) const;
+ bool HasLastTime(Metric metric) const;
+ void SetLastTimeToNow(Metric metric);
+
+ double GetMetricValue(Metric metric) const;
+ void SetMetricValue(Metric metric, double metric_value);
+ void ClearMetricValue(Metric metric);
+
+ PrefService* pref_service_;
+
+ // Params of the metric.
+ const double discount_rate_per_hour_;
+ const double min_hours_;
+ const double max_hours_;
+
+ // Params of the classification.
+ const double active_consumer_scrolls_at_least_once_per_hours_;
+ const double rare_user_opens_ntp_at_most_once_per_hours_;
+
+ DISALLOW_COPY_AND_ASSIGN(UserClassifier);
+};
+
+} // namespace ntp_snippets
+
+#endif // COMPONENTS_NTP_SNIPPETS_USER_CLASSIFIER_H_