summaryrefslogtreecommitdiff
path: root/chromium/components/metrics/daily_event.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/metrics/daily_event.h')
-rw-r--r--chromium/components/metrics/daily_event.h92
1 files changed, 92 insertions, 0 deletions
diff --git a/chromium/components/metrics/daily_event.h b/chromium/components/metrics/daily_event.h
new file mode 100644
index 00000000000..24b31dc58ea
--- /dev/null
+++ b/chromium/components/metrics/daily_event.h
@@ -0,0 +1,92 @@
+// Copyright 2014 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_METRICS_DAILY_EVENT_H_
+#define COMPONENTS_METRICS_DAILY_EVENT_H_
+
+#include "base/macros.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/memory/scoped_vector.h"
+#include "base/time/time.h"
+
+class PrefRegistrySimple;
+class PrefService;
+
+namespace metrics {
+
+// DailyEvent is used for throttling an event to about once per day, even if
+// the program is restarted more frequently. It is based on local machine
+// time, so it could be fired more often if the clock is changed.
+//
+// The service using the DailyEvent should first provide all of the Observers
+// for the interval, and then arrange for CheckInterval() to be called
+// periodically to test if the event should be fired.
+class DailyEvent {
+ public:
+ // Observer receives notifications from a DailyEvent.
+ // Observers must be added before the DailyEvent begins checking time,
+ // and will be owned by the DailyEvent.
+ class Observer {
+ public:
+ Observer();
+ virtual ~Observer();
+
+ // Called when the daily event is fired.
+ virtual void OnDailyEvent() = 0;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(Observer);
+ };
+
+ // Constructs DailyEvent monitor which stores the time it last fired in the
+ // preference |pref_name|. |pref_name| should be registered by calling
+ // RegisterPref before using this object.
+ // Caller is responsible for ensuring that |pref_service| and |pref_name|
+ // outlive the DailyEvent.
+ // |histogram_name| is the name of the UMA metric which record when this
+ // interval fires, and should be registered in histograms.xml
+ DailyEvent(PrefService* pref_service,
+ const char* pref_name,
+ const std::string& histogram_name);
+ ~DailyEvent();
+
+ // Adds a observer to be notified when a day elapses. All observers should
+ // be registered before the the DailyEvent starts checking time.
+ void AddObserver(scoped_ptr<Observer> observer);
+
+ // Checks if a day has elapsed. If it has, OnDailyEvent will be called on
+ // all observers.
+ void CheckInterval();
+
+ // Registers the preference used by this interval.
+ static void RegisterPref(PrefRegistrySimple* registry, const char* pref_name);
+
+ private:
+ // Handles an interval elapsing.
+ void OnInterval(base::Time now);
+
+ // A weak pointer to the PrefService object to read and write preferences
+ // from. Calling code should ensure this object continues to exist for the
+ // lifetime of the DailyEvent object.
+ PrefService* pref_service_;
+
+ // The name of the preference to store the last fired time in.
+ // Calling code should ensure this outlives the DailyEvent.
+ const char* pref_name_;
+
+ // The name of the histogram to record intervals.
+ std::string histogram_name_;
+
+ // A list of observers.
+ ScopedVector<Observer> observers_;
+
+ // The time that the daily event was last fired.
+ base::Time last_fired_;
+
+ DISALLOW_COPY_AND_ASSIGN(DailyEvent);
+};
+
+} // namespace metrics
+
+#endif // COMPONENTS_METRICS_DAILY_EVENT_H_