// 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.h" #include "base/time/time.h" namespace base { static PowerMonitor* g_power_monitor = NULL; #if defined(ENABLE_BATTERY_MONITORING) // The amount of time (in ms) to wait before running the initial // battery check. static int kDelayedBatteryCheckMs = 10 * 1000; #endif // defined(ENABLE_BATTERY_MONITORING) PowerMonitor::PowerMonitor() : observers_(new ObserverListThreadSafe()), battery_in_use_(false), suspended_(false) { DCHECK(!g_power_monitor); g_power_monitor = this; DCHECK(MessageLoop::current()); #if defined(ENABLE_BATTERY_MONITORING) delayed_battery_check_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(kDelayedBatteryCheckMs), this, &PowerMonitor::BatteryCheck); #endif // defined(ENABLE_BATTERY_MONITORING) #if defined(OS_MACOSX) PlatformInit(); #endif } PowerMonitor::~PowerMonitor() { #if defined(OS_MACOSX) PlatformDestroy(); #endif DCHECK_EQ(this, g_power_monitor); g_power_monitor = NULL; } // static PowerMonitor* PowerMonitor::Get() { return g_power_monitor; } void PowerMonitor::AddObserver(PowerObserver* obs) { observers_->AddObserver(obs); } void PowerMonitor::RemoveObserver(PowerObserver* obs) { observers_->RemoveObserver(obs); } void PowerMonitor::ProcessPowerEvent(PowerEvent event_id) { // Suppress duplicate notifications. Some platforms may // send multiple notifications of the same event. switch (event_id) { case POWER_STATE_EVENT: { bool on_battery = IsBatteryPower(); if (on_battery != battery_in_use_) { battery_in_use_ = on_battery; NotifyPowerStateChange(); } } break; case RESUME_EVENT: if (suspended_) { suspended_ = false; NotifyResume(); } break; case SUSPEND_EVENT: if (!suspended_) { suspended_ = true; NotifySuspend(); } break; } } void PowerMonitor::BatteryCheck() { ProcessPowerEvent(PowerMonitor::POWER_STATE_EVENT); } void PowerMonitor::NotifyPowerStateChange() { DVLOG(1) << "PowerStateChange: " << (BatteryPower() ? "On" : "Off") << " battery"; observers_->Notify(&PowerObserver::OnPowerStateChange, BatteryPower()); } void PowerMonitor::NotifySuspend() { DVLOG(1) << "Power Suspending"; observers_->Notify(&PowerObserver::OnSuspend); } void PowerMonitor::NotifyResume() { DVLOG(1) << "Power Resuming"; observers_->Notify(&PowerObserver::OnResume); } } // namespace base