#ifndef BASE_POWER_MONITOR_POWER_MONITOR_H_
#define BASE_POWER_MONITOR_POWER_MONITOR_H_
#include <memory>
#include "base/base_export.h"
#include "base/no_destructor.h"
#include "base/observer_list_threadsafe.h"
#include "base/power_monitor/power_observer.h"
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "third_party/perfetto/include/perfetto/tracing/track.h"
namespace base {
class PowerMonitorSource;
class BASE_EXPORT PowerMonitor : public perfetto::TrackEventSessionObserver {
public:
static PowerMonitor* GetInstance();
void Initialize(std::unique_ptr<PowerMonitorSource> source,
bool emit_global_event = false);
PowerMonitor(const PowerMonitor&) = delete;
PowerMonitor& operator=(const PowerMonitor&) = delete;
bool IsInitialized() const;
void AddPowerSuspendObserver(PowerSuspendObserver* observer);
void RemovePowerSuspendObserver(PowerSuspendObserver* observer);
void AddPowerStateObserver(PowerStateObserver* observer);
void RemovePowerStateObserver(PowerStateObserver* observer);
void AddPowerThermalObserver(PowerThermalObserver* observer);
void RemovePowerThermalObserver(PowerThermalObserver* observer);
bool AddPowerSuspendObserverAndReturnSuspendedState(
PowerSuspendObserver* observer);
PowerStateObserver::BatteryPowerStatus
AddPowerStateObserverAndReturnBatteryPowerStatus(
PowerStateObserver* observer);
PowerThermalObserver::DeviceThermalState
AddPowerStateObserverAndReturnPowerThermalState(
PowerThermalObserver* observer);
bool IsOnBatteryPower() const;
PowerStateObserver::BatteryPowerStatus GetBatteryPowerStatus() const;
TimeTicks GetLastSystemResumeTime() const;
PowerThermalObserver::DeviceThermalState GetCurrentThermalState() const;
void SetCurrentThermalState(PowerThermalObserver::DeviceThermalState state);
void ShutdownForTesting();
private:
friend class PowerMonitorSource;
friend class base::NoDestructor<PowerMonitor>;
PowerMonitor();
~PowerMonitor() override;
void OnStart(const perfetto::DataSourceBase::StartArgs&) override;
const PowerMonitorSource* Source() const;
void NotifyPowerStateChange(bool on_battery_power);
void NotifyPowerStateChange(
PowerStateObserver::BatteryPowerStatus battery_power_status);
void NotifySuspend();
void NotifyResume();
void NotifyThermalStateChange(
PowerThermalObserver::DeviceThermalState new_state);
void NotifySpeedLimitChange(int speed_limit);
bool is_system_suspended_ GUARDED_BY(is_system_suspended_lock_) = false;
mutable Lock is_system_suspended_lock_;
TimeTicks last_system_resume_time_ GUARDED_BY(is_system_suspended_lock_);
PowerStateObserver::BatteryPowerStatus battery_power_status_
GUARDED_BY(battery_power_status_lock_) =
PowerStateObserver::BatteryPowerStatus::kUnknown;
mutable Lock battery_power_status_lock_;
bool emit_global_event_ = false;
const perfetto::NamedTrack suspend_track_;
const perfetto::NamedTrack battery_power_track_;
PowerThermalObserver::DeviceThermalState power_thermal_state_
GUARDED_BY(power_thermal_state_lock_) =
PowerThermalObserver::DeviceThermalState::kUnknown;
int speed_limit_ GUARDED_BY(power_thermal_state_lock_) =
PowerThermalObserver::kSpeedLimitMax;
Lock power_thermal_state_lock_;
scoped_refptr<ObserverListThreadSafe<PowerStateObserver>>
power_state_observers_;
scoped_refptr<ObserverListThreadSafe<PowerSuspendObserver>>
power_suspend_observers_;
scoped_refptr<ObserverListThreadSafe<PowerThermalObserver>>
thermal_state_observers_;
std::unique_ptr<PowerMonitorSource> source_;
};
}
#endif