#ifndef BASE_POWER_MONITOR_BATTERY_STATE_SAMPLER_H_
#define BASE_POWER_MONITOR_BATTERY_STATE_SAMPLER_H_
#include <memory>
#include <vector>
#include "base/base_export.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "base/power_monitor/battery_level_provider.h"
#include "base/power_monitor/power_monitor_buildflags.h"
#include "base/power_monitor/sampling_event_source.h"
#include "base/sequence_checker.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace base {
class BASE_EXPORT BatteryStateSampler {
public:
class Observer : public base::CheckedObserver {
public:
virtual void OnBatteryStateSampled(
const absl::optional<BatteryLevelProvider::BatteryState>&
battery_state) = 0;
};
BatteryStateSampler(
std::unique_ptr<SamplingEventSource> sampling_event_source =
CreateSamplingEventSource(),
std::unique_ptr<BatteryLevelProvider> battery_level_provider =
BatteryLevelProvider::Create());
~BatteryStateSampler();
static BatteryStateSampler* Get();
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
void Shutdown();
static std::unique_ptr<base::BatteryStateSampler> CreateInstanceForTesting(
std::unique_ptr<SamplingEventSource> sampling_event_source,
std::unique_ptr<BatteryLevelProvider> battery_level_provider);
static bool HasTestingInstance();
private:
static std::unique_ptr<SamplingEventSource> CreateSamplingEventSource();
void OnInitialBatteryStateSampled(
const absl::optional<BatteryLevelProvider::BatteryState>& battery_state);
void OnSamplingEvent();
void OnBatteryStateSampled(
const absl::optional<BatteryLevelProvider::BatteryState>& battery_state);
std::unique_ptr<SamplingEventSource> sampling_event_source_
GUARDED_BY_CONTEXT(sequence_checker_);
std::unique_ptr<BatteryLevelProvider> battery_level_provider_
GUARDED_BY_CONTEXT(sequence_checker_);
base::ObserverList<Observer> observer_list_
GUARDED_BY_CONTEXT(sequence_checker_);
bool has_last_battery_state_ GUARDED_BY_CONTEXT(sequence_checker_) = false;
absl::optional<BatteryLevelProvider::BatteryState> last_battery_state_
GUARDED_BY_CONTEXT(sequence_checker_);
SEQUENCE_CHECKER(sequence_checker_);
};
}
#endif