|  | // 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_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 |