Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 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/metrics/daily_event.h" | |
| 6 | |
| 7 #include "base/i18n/time_formatting.h" | |
| 8 #include "base/metrics/histogram.h" | |
| 9 #include "base/prefs/pref_registry_simple.h" | |
| 10 #include "base/prefs/pref_service.h" | |
| 11 | |
| 12 namespace metrics { | |
| 13 | |
| 14 namespace { | |
| 15 | |
| 16 enum IntervalType { | |
| 17 FIRST_RUN, | |
| 18 DAY_ELAPSED, | |
| 19 CLOCK_CHANGED, | |
| 20 NUM_INTERVAL_TYPES | |
| 21 }; | |
| 22 | |
| 23 void RecordIntervalTypeHistogram(const std::string& histogram_name, | |
| 24 IntervalType t) { | |
|
Alexei Svitkine (slow)
2014/09/15 21:32:32
Nit: t -> type
Steven Holte
2014/09/15 21:43:09
Done.
| |
| 25 base::Histogram::FactoryGet( | |
| 26 histogram_name, | |
| 27 1, | |
| 28 NUM_INTERVAL_TYPES, | |
| 29 NUM_INTERVAL_TYPES + 1, | |
| 30 base::HistogramBase::kUmaTargetedHistogramFlag)->Add(t); | |
| 31 } | |
| 32 | |
| 33 } // namespace | |
| 34 | |
| 35 DailyEvent::Observer::Observer() { | |
| 36 } | |
| 37 | |
| 38 DailyEvent::Observer::~Observer() { | |
| 39 } | |
| 40 | |
| 41 DailyEvent::DailyEvent(PrefService* pref_service, | |
| 42 const char* pref_name, | |
| 43 const std::string& histogram_name) | |
| 44 : pref_service_(pref_service), | |
| 45 pref_name_(pref_name), | |
| 46 histogram_name_(histogram_name) { | |
| 47 } | |
| 48 | |
| 49 DailyEvent::~DailyEvent() { | |
| 50 } | |
| 51 | |
| 52 // static | |
| 53 void DailyEvent::RegisterPref(PrefRegistrySimple* registry, | |
| 54 const char* pref_name) { | |
| 55 registry->RegisterInt64Pref(pref_name, base::Time().ToInternalValue()); | |
| 56 } | |
| 57 | |
| 58 void DailyEvent::AddObserver(scoped_ptr<DailyEvent::Observer> observer) { | |
| 59 DVLOG(2) << "DailyEvent observer added."; | |
| 60 DCHECK(last_fired_.is_null()); | |
| 61 observers_.push_back(observer.release()); | |
| 62 } | |
| 63 | |
| 64 void DailyEvent::CheckInterval() { | |
| 65 base::Time now = base::Time::Now(); | |
| 66 if (last_fired_.is_null()) { | |
| 67 // The first time we call CheckInterval, we read the time stored in prefs. | |
| 68 last_fired_ = base::Time::FromInternalValue( | |
| 69 pref_service_->GetInt64(pref_name_)); | |
| 70 DVLOG(1) << "DailyEvent time loaded: " | |
| 71 << base::TimeFormatShortDateAndTime(last_fired_); | |
| 72 if (last_fired_.is_null()) { | |
| 73 DVLOG(1) << "DailyEvent first run."; | |
| 74 RecordIntervalTypeHistogram(pref_name_, FIRST_RUN); | |
| 75 OnInterval(now); | |
| 76 return; | |
| 77 } | |
| 78 } | |
| 79 int days_elapsed = (now - last_fired_).InDays(); | |
| 80 if (days_elapsed >= 1) { | |
| 81 DVLOG(1) << "DailyEvent day elapsed."; | |
| 82 RecordIntervalTypeHistogram(pref_name_, DAY_ELAPSED); | |
| 83 OnInterval(now); | |
| 84 } else if (days_elapsed <= -1) { | |
| 85 // The "last fired" time is more than a day in the future, so the clock | |
| 86 // must have been changed. | |
| 87 DVLOG(1) << "DailyEvent clock change detected."; | |
| 88 RecordIntervalTypeHistogram(pref_name_, CLOCK_CHANGED); | |
| 89 OnInterval(now); | |
| 90 } | |
| 91 } | |
| 92 | |
| 93 void DailyEvent::OnInterval(base::Time now) { | |
| 94 DCHECK(!now.is_null()); | |
| 95 last_fired_ = now; | |
| 96 pref_service_->SetInt64(pref_name_, last_fired_.ToInternalValue()); | |
| 97 | |
| 98 // Notify all observers | |
| 99 for (ScopedVector<DailyEvent::Observer>::iterator it = observers_.begin(); | |
| 100 it != observers_.end(); | |
| 101 ++it) { | |
| 102 (*it)->OnDailyEvent(); | |
| 103 } | |
| 104 } | |
| 105 | |
| 106 } // namespace metrics | |
| OLD | NEW |