Index: base/power_monitor/power_monitor.cc |
diff --git a/base/power_monitor/power_monitor.cc b/base/power_monitor/power_monitor.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..830c0df66a78548df5e86ae2fc1bae611e9561ea |
--- /dev/null |
+++ b/base/power_monitor/power_monitor.cc |
@@ -0,0 +1,102 @@ |
+// Copyright (c) 2012 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" |
+ |
+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() |
+ : power_observer_list_(new ObserverListThreadSafe<PowerObserver>()), |
+ 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) |
+ PlaformDestory(); |
+#endif |
+ DCHECK_EQ(this, g_power_monitor); |
+ g_power_monitor = NULL; |
+} |
+ |
+void PowerMonitor::AddPowerObserver(PowerObserver* obs) { |
+ power_observer_list_->AddObserver(obs); |
+} |
+ |
+void PowerMonitor::RemovePowerObserver(PowerObserver* obs) { |
+ power_observer_list_->RemoveObserver(obs); |
+} |
+ |
+void PowerMonitor::HandlePowerEvent(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::NotifyPowerStateChange() { |
+ DVLOG(1) << "PowerStateChange: " << (BatteryPower() ? "On" : "Off") |
+ << " battery"; |
+ power_observer_list_->Notify(&PowerObserver::OnPowerStateChange, |
+ BatteryPower()); |
+} |
+ |
+void PowerMonitor::NotifySuspend() { |
+ DVLOG(1) << "Power Suspending"; |
+ power_observer_list_->Notify(&PowerObserver::OnSuspend); |
+} |
+ |
+void PowerMonitor::NotifyResume() { |
+ DVLOG(1) << "Power Resuming"; |
+ power_observer_list_->Notify(&PowerObserver::OnResume); |
+} |
+ |
+void PowerMonitor::BatteryCheck() { |
+ HandlePowerEvent(PowerMonitor::POWER_STATE_EVENT); |
+} |
+ |
+} // namespace base |
+ |