// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/power_monitor/power_monitor_source.h" #include "base/power_monitor/power_monitor.h" #include "build/build_config.h" namespace base { PowerMonitorSource::PowerMonitorSource() = default; PowerMonitorSource::~PowerMonitorSource() = default; bool PowerMonitorSource::IsOnBatteryPower() { AutoLock auto_lock(battery_lock_); return on_battery_power_; } void PowerMonitorSource::ProcessPowerEvent(PowerEvent event_id) { PowerMonitor* monitor = PowerMonitor::Get(); if (!monitor) return; PowerMonitorSource* source = monitor->Source(); // Suppress duplicate notifications. Some platforms may // send multiple notifications of the same event. switch (event_id) { case POWER_STATE_EVENT: { bool new_on_battery_power = source->IsOnBatteryPowerImpl(); bool changed = false; { AutoLock auto_lock(source->battery_lock_); if (source->on_battery_power_ != new_on_battery_power) { changed = true; source->on_battery_power_ = new_on_battery_power; } } if (changed) monitor->NotifyPowerStateChange(new_on_battery_power); } break; case RESUME_EVENT: if (source->suspended_) { source->suspended_ = false; monitor->NotifyResume(); } break; case SUSPEND_EVENT: if (!source->suspended_) { source->suspended_ = true; monitor->NotifySuspend(); } break; } } void PowerMonitorSource::SetInitialOnBatteryPowerState(bool on_battery_power) { // Must only be called before a monitor exists, otherwise the caller should // have just used a normal ProcessPowerEvent(POWER_STATE_EVENT) call. DCHECK(!PowerMonitor::Get()); on_battery_power_ = on_battery_power; } } // namespace base