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..53c263b5b99f53d08e2548f22b9b296a1752255e |
--- /dev/null |
+++ b/base/power_monitor/power_monitor.cc |
@@ -0,0 +1,118 @@ |
+// 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 { |
+ |
+#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<PowerObserver>()), |
+ battery_in_use_(false), |
+ suspended_(false), |
+ notifier_(NULL) { |
+ 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 |
+} |
+ |
+// static |
+PowerMonitor* PowerMonitor::GetInstance() { |
+ // The singleton PowerMonitor instance is designed to be leaked since it is |
+ // hard to handle the dependency between PowerMonitor and Notifier. We can not |
+ // easily anticipate the life time of Notifier after calling GetNotifierOnce. |
+ return Singleton<PowerMonitor, LeakySingletonTraits<PowerMonitor> >::get(); |
+} |
+ |
+PowerMonitor::Notifier* PowerMonitor::GetNotifierOnce() { |
+ DCHECK(notifier_ == NULL); |
+ |
+ if (notifier_ == NULL) { |
+ // The notifier is allowed to be leaked since the dependency and ownship |
+ // between PowerMonitor and Notifier is hard to be handled. |
+ notifier_ = new PowerMonitor::Notifier(this); |
+ return notifier_; |
+ } |
+ |
+ // Return NULL after the first time it get called. |
+ return NULL; |
+} |
+ |
+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::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); |
+} |
+ |
+void PowerMonitor::BatteryCheck() { |
+ ProcessPowerEvent(PowerMonitor::POWER_STATE_EVENT); |
+} |
+ |
+} // namespace base |
+ |