11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef COMPONENTS_METRICS_DAILY_EVENT_H_
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define COMPONENTS_METRICS_DAILY_EVENT_H_
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/macros.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_vector.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/time/time.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass PrefRegistrySimple;
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass PrefService;
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace metrics {
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// DailyEvent is used for throttling an event to about once per day, even if
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// the program is restarted more frequently.  It is based on local machine
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// time, so it could be fired more often if the clock is changed.
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The service using the DailyEvent should first provide all of the Observers
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// for the interval, and then arrange for CheckInterval() to be called
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// periodically to test if the event should be fired.
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass DailyEvent {
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Observer receives notifications from a DailyEvent.
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Observers must be added before the DailyEvent begins checking time,
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // and will be owned by the DailyEvent.
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  class Observer {
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   public:
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Observer();
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    virtual ~Observer();
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Called when the daily event is fired.
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    virtual void OnDailyEvent() = 0;
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   private:
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DISALLOW_COPY_AND_ASSIGN(Observer);
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Constructs DailyEvent monitor which stores the time it last fired in the
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // preference |pref_name|. |pref_name| should be registered by calling
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // RegisterPref before using this object.
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Caller is responsible for ensuring that |pref_service| and |pref_name|
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // outlive the DailyEvent.
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |histogram_name| is the name of the UMA metric which record when this
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // interval fires, and should be registered in histograms.xml
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DailyEvent(PrefService* pref_service,
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             const char* pref_name,
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             const std::string& histogram_name);
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ~DailyEvent();
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Adds a observer to be notified when a day elapses. All observers should
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // be registered before the the DailyEvent starts checking time.
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void AddObserver(scoped_ptr<Observer> observer);
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Checks if a day has elapsed. If it has, OnDailyEvent will be called on
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // all observers.
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void CheckInterval();
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Registers the preference used by this interval.
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static void RegisterPref(PrefRegistrySimple* registry, const char* pref_name);
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Handles an interval elapsing.
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnInterval(base::Time now);
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // A weak pointer to the PrefService object to read and write preferences
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // from. Calling code should ensure this object continues to exist for the
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // lifetime of the DailyEvent object.
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrefService* pref_service_;
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The name of the preference to store the last fired time in.
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Calling code should ensure this outlives the DailyEvent.
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char* pref_name_;
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The name of the histogram to record intervals.
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string histogram_name_;
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // A list of observers.
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ScopedVector<Observer> observers_;
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The time that the daily event was last fired.
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::Time last_fired_;
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(DailyEvent);
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace metrics
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // COMPONENTS_METRICS_DAILY_EVENT_H_
93