#ifndef CONTENT_BROWSER_AGGREGATION_SERVICE_REPORT_SCHEDULER_TIMER_H_
#define CONTENT_BROWSER_AGGREGATION_SERVICE_REPORT_SCHEDULER_TIMER_H_
#include <memory>
#include <optional>
#include "base/functional/callback_forward.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "base/sequence_checker.h"
#include "base/thread_annotations.h"
#include "base/timer/wall_clock_timer.h"
#include "content/common/content_export.h"
#include "services/network/public/cpp/network_connection_tracker.h"
#include "services/network/public/mojom/network_change_manager.mojom.h"
namespace base {
class Time;
}
namespace content {
class CONTENT_EXPORT ReportSchedulerTimer
: public network::NetworkConnectionTracker::NetworkConnectionObserver {
public:
class Delegate {
public:
virtual ~Delegate() = default;
virtual void GetNextReportTime(
base::OnceCallback<void(std::optional<base::Time>)>,
base::Time now) = 0;
virtual void OnReportingTimeReached(base::Time now,
base::Time timer_desired_run_time) = 0;
virtual void AdjustOfflineReportTimes(
base::OnceCallback<void(std::optional<base::Time>)>) = 0;
};
explicit ReportSchedulerTimer(std::unique_ptr<Delegate> delegate);
ReportSchedulerTimer(const ReportSchedulerTimer&) = delete;
ReportSchedulerTimer& operator=(const ReportSchedulerTimer&) = delete;
ReportSchedulerTimer(ReportSchedulerTimer&&) = delete;
ReportSchedulerTimer& operator=(ReportSchedulerTimer&&) = delete;
~ReportSchedulerTimer() override;
network::mojom::ConnectionType connection_type() const;
void MaybeSet(std::optional<base::Time> reporting_time);
private:
void OnTimerFired();
void Refresh(base::Time now) VALID_CONTEXT_REQUIRED(sequence_checker_);
void OnConnectionChanged(network::mojom::ConnectionType) final;
bool IsOffline() const VALID_CONTEXT_REQUIRED(sequence_checker_);
void UpdateState(network::mojom::ConnectionType)
VALID_CONTEXT_REQUIRED(sequence_checker_);
base::WallClockTimer reporting_time_reached_timer_
GUARDED_BY_CONTEXT(sequence_checker_);
const std::unique_ptr<Delegate> delegate_
GUARDED_BY_CONTEXT(sequence_checker_);
network::mojom::ConnectionType connection_type_ GUARDED_BY_CONTEXT(
sequence_checker_) = network::mojom::ConnectionType::CONNECTION_NONE;
base::ScopedObservation<
network::NetworkConnectionTracker,
network::NetworkConnectionTracker::NetworkConnectionObserver>
obs_ GUARDED_BY_CONTEXT(sequence_checker_){this};
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<ReportSchedulerTimer> weak_ptr_factory_{this};
};
}
#endif