OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "components/ntp_snippets/user_classifier.h" | |
6 | |
7 #include <algorithm> | |
8 #include <string> | |
9 | |
10 #include "base/metrics/histogram_macros.h" | |
11 #include "base/strings/string_number_conversions.h" | |
12 #include "components/ntp_snippets/pref_names.h" | |
13 #include "components/prefs/pref_registry_simple.h" | |
14 #include "components/prefs/pref_service.h" | |
15 | |
16 namespace { | |
17 | |
18 // TODO(jkrcal): Make all of this Finch configurable. | |
rkaplow
2016/09/07 13:33:10
nit, variations_service is the external chromium n
jkrcal
2016/09/07 14:19:08
Done.
| |
19 // Default values to start the discounted-average metrics with. | |
20 const double kDefaultAverageHoursToOpenNTP = 24; | |
21 const double kDefaultAverageHoursToShowSuggestions = 48; | |
22 const double kDefaultAverageHoursToUseSuggestions = 96; | |
23 // The discount factor for computing the discounted-average metrics. | |
24 const double kDiscountFactor = 0.25; | |
25 // Never consider any larger interval than this (so that extreme situations such | |
26 // as loosing your phone or going for a long offline vacation do not skew the | |
Marc Treib
2016/09/07 13:23:48
nit: s/loosing/losing/
Bernhard Bauer
2016/09/07 13:46:45
Nit: "losing"
jkrcal
2016/09/07 14:19:08
Done.
| |
27 // avg too much). | |
28 const double kMaxHours = 14*24; | |
29 | |
30 const char kHistogramAverageHoursToOpenNTP[] = | |
31 "NewTabPage.UserClassifier.AverageHoursToOpenNTP"; | |
32 const char kHistogramAverageHoursToShowSuggestions[] = | |
33 "NewTabPage.UserClassifier.AverageHoursToShowSuggestions"; | |
34 const char kHistogramAverageHoursToUseSuggestions[] = | |
35 "NewTabPage.UserClassifier.AverageHoursToUseSuggestions"; | |
36 | |
37 } // namespace | |
38 | |
39 namespace ntp_snippets { | |
40 | |
41 UserClassifier::UserClassifier(PrefService* pref_service) | |
42 : pref_service_(pref_service) {} | |
43 | |
44 UserClassifier::~UserClassifier() {} | |
45 | |
46 // static | |
47 void UserClassifier::RegisterProfilePrefs(PrefRegistrySimple* registry) { | |
48 registry->RegisterDoublePref(prefs::kUserClassifierAverageHoursToOpenNTP, | |
49 kDefaultAverageHoursToOpenNTP); | |
50 registry->RegisterDoublePref( | |
51 prefs::kUserClassifierAverageHoursToShowSuggestions, | |
52 kDefaultAverageHoursToShowSuggestions); | |
53 registry->RegisterDoublePref( | |
54 prefs::kUserClassifierAverageHoursToUseSuggestions, | |
55 kDefaultAverageHoursToUseSuggestions); | |
56 | |
57 registry->RegisterInt64Pref(prefs::kUserClassifierLastTimeToOpenNTP, 0); | |
58 registry->RegisterInt64Pref(prefs::kUserClassifierLastTimeToShowSuggestions, | |
59 0); | |
60 registry->RegisterInt64Pref(prefs::kUserClassifierLastTimeToUseSuggestions, | |
61 0); | |
62 } | |
63 | |
64 void UserClassifier::OnNTPOpened() { | |
65 double avg = UpdateMetric(prefs::kUserClassifierAverageHoursToOpenNTP, | |
66 prefs::kUserClassifierLastTimeToOpenNTP, | |
67 kDefaultAverageHoursToOpenNTP); | |
68 UMA_HISTOGRAM_CUSTOM_COUNTS(kHistogramAverageHoursToOpenNTP, avg, 1, | |
69 kMaxHours, 50); | |
70 } | |
71 | |
72 void UserClassifier::OnSuggestionsShown() { | |
73 double avg = UpdateMetric(prefs::kUserClassifierAverageHoursToShowSuggestions, | |
74 prefs::kUserClassifierLastTimeToShowSuggestions, | |
75 kDefaultAverageHoursToShowSuggestions); | |
76 UMA_HISTOGRAM_CUSTOM_COUNTS(kHistogramAverageHoursToShowSuggestions, avg, 1, | |
77 kMaxHours, 50); | |
78 } | |
79 | |
80 void UserClassifier::OnSuggestionsUsed() { | |
81 double avg = UpdateMetric(prefs::kUserClassifierAverageHoursToUseSuggestions, | |
82 prefs::kUserClassifierLastTimeToUseSuggestions, | |
83 kDefaultAverageHoursToUseSuggestions); | |
84 UMA_HISTOGRAM_CUSTOM_COUNTS(kHistogramAverageHoursToUseSuggestions, avg, 1, | |
85 kMaxHours, 50); | |
86 } | |
87 | |
88 double UserClassifier::UpdateMetric(const char* metric_pref_name, | |
89 const char* last_time_pref_name, | |
Bernhard Bauer
2016/09/07 13:46:45
Nit: Align arguments.
jkrcal
2016/09/07 14:19:08
Done.
| |
90 double default_metric_value) { | |
rkaplow
2016/09/07 13:33:10
align
jkrcal
2016/09/07 14:19:08
Done.
| |
91 if (!pref_service_) | |
92 return default_metric_value; | |
93 | |
94 double hours_since_last_time = std::min( | |
95 kMaxHours, | |
96 GetHoursSinceLastTime(last_time_pref_name, default_metric_value)); | |
97 SetLastTimeToNow(last_time_pref_name); | |
98 | |
99 double avg = pref_service_->GetDouble(metric_pref_name); | |
100 // Compute and store the new discounted average. | |
101 avg = hours_since_last_time * kDiscountFactor + avg * (1 - kDiscountFactor); | |
rkaplow
2016/09/07 13:33:10
is it best to discount after rounding down to the
jkrcal
2016/09/07 14:19:08
I do not understand. I treat the number always as
| |
102 pref_service_->SetDouble(metric_pref_name, avg); | |
103 return avg; | |
104 } | |
105 | |
106 double UserClassifier::GetHoursSinceLastTime( | |
107 const char* last_time_pref_name, | |
108 double default_hours_since_last_time) { | |
109 if (!pref_service_->HasPrefPath(last_time_pref_name)) | |
110 return default_hours_since_last_time; | |
111 | |
112 base::TimeDelta since_last_time = | |
113 base::Time::Now() - base::Time::FromInternalValue( | |
114 pref_service_->GetInt64(last_time_pref_name)); | |
115 return since_last_time.InSecondsF() / 3600; | |
116 } | |
117 | |
118 void UserClassifier::SetLastTimeToNow(const char* last_time_pref_name) { | |
119 pref_service_->SetInt64(last_time_pref_name, | |
120 base::Time::Now().ToInternalValue()); | |
121 } | |
122 | |
123 } // namespace ntp_snippets | |
OLD | NEW |