Chromium Code Reviews| 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 |