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