#ifndef CHROMECAST_BASE_SYSTEM_TIME_CHANGE_NOTIFIER_H_
#define CHROMECAST_BASE_SYSTEM_TIME_CHANGE_NOTIFIER_H_
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list_threadsafe.h"
#include "base/time/time.h"
namespace base {
class SequencedTaskRunner;
}
namespace chromecast {
class SystemTimeChangeNotifier {
public:
class Observer {
public:
virtual void OnSystemTimeChanged() = 0;
protected:
virtual ~Observer() {}
};
SystemTimeChangeNotifier(const SystemTimeChangeNotifier&) = delete;
SystemTimeChangeNotifier& operator=(const SystemTimeChangeNotifier&) = delete;
virtual ~SystemTimeChangeNotifier();
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
protected:
SystemTimeChangeNotifier();
void NotifySystemTimeChanged();
private:
scoped_refptr<base::ObserverListThreadSafe<Observer>> observer_list_;
};
class SystemTimeChangeNotifierPeriodicMonitor
: public SystemTimeChangeNotifier {
public:
explicit SystemTimeChangeNotifierPeriodicMonitor(
const scoped_refptr<base::SequencedTaskRunner>& task_runner);
SystemTimeChangeNotifierPeriodicMonitor(
const SystemTimeChangeNotifierPeriodicMonitor&) = delete;
SystemTimeChangeNotifierPeriodicMonitor& operator=(
const SystemTimeChangeNotifierPeriodicMonitor&) = delete;
~SystemTimeChangeNotifierPeriodicMonitor() override;
void set_fake_now_for_testing(base::Time now) { fake_now_ = now; }
private:
void ResetTimeAndLimits(base::Time now);
void ScheduleNextMonitor(base::Time now);
void CheckSystemTime();
base::Time Now() const;
const scoped_refptr<base::SequencedTaskRunner> task_runner_;
base::Time expected_system_time_;
base::Time monitoring_limit_time_1sec_;
base::Time monitoring_limit_time_10sec_;
base::Time fake_now_;
base::WeakPtrFactory<SystemTimeChangeNotifierPeriodicMonitor> weak_factory_;
};
}
#endif