summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorderat <derat@chromium.org>2014-10-06 21:18:44 -0700
committerCommit bot <commit-bot@chromium.org>2014-10-07 04:19:22 +0000
commit07366580ce28f55f6dd242c9d79e7a1f1b3bef44 (patch)
tree478e99d7cd75628ff4904b76114305d17c43db4b
parentba722a2a8ddf967dcadb483ea32d5ad31fc4bdf6 (diff)
downloadchromium_src-07366580ce28f55f6dd242c9d79e7a1f1b3bef44.zip
chromium_src-07366580ce28f55f6dd242c9d79e7a1f1b3bef44.tar.gz
chromium_src-07366580ce28f55f6dd242c9d79e7a1f1b3bef44.tar.bz2
Make base::PowerMonitor work on Chrome OS.
On Chrome OS, updates about the system power status are received via D-Bus messages on the UI thread. Being in base/, PowerMonitor can't depend on the code in chromeos/ that receives those messages, so make the Chrome OS code instead notify PowerMonitor when it receives updates. BUG=326534 Review URL: https://codereview.chromium.org/622693004 Cr-Commit-Position: refs/heads/master@{#298367}
-rw-r--r--base/BUILD.gn7
-rw-r--r--base/base.gypi6
-rw-r--r--base/power_monitor/power_monitor_device_source.h10
-rw-r--r--base/power_monitor/power_monitor_device_source_chromeos.cc40
-rw-r--r--chromeos/dbus/power_manager_client.cc15
5 files changed, 76 insertions, 2 deletions
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 0a4f6a9..a190ea3 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -445,6 +445,7 @@ component("base") {
"power_monitor/power_monitor_device_source.h",
"power_monitor/power_monitor_device_source_android.cc",
"power_monitor/power_monitor_device_source_android.h",
+ "power_monitor/power_monitor_device_source_chromeos.cc",
"power_monitor/power_monitor_device_source_ios.mm",
"power_monitor/power_monitor_device_source_mac.mm",
"power_monitor/power_monitor_device_source_posix.cc",
@@ -802,6 +803,12 @@ component("base") {
]
}
+ if (is_chromeos) {
+ sources -= [
+ "power_monitor/power_monitor_device_source_posix.cc",
+ ]
+ }
+
if (is_nacl) {
# These things would otherwise be built on a Posix build but aren't
# supported on NaCl.
diff --git a/base/base.gypi b/base/base.gypi
index 8a37249..c5796ef 100644
--- a/base/base.gypi
+++ b/base/base.gypi
@@ -432,6 +432,7 @@
'power_monitor/power_monitor.h',
'power_monitor/power_monitor_device_source_android.cc',
'power_monitor/power_monitor_device_source_android.h',
+ 'power_monitor/power_monitor_device_source_chromeos.cc',
'power_monitor/power_monitor_device_source.cc',
'power_monitor/power_monitor_device_source.h',
'power_monitor/power_monitor_device_source_ios.mm',
@@ -838,6 +839,11 @@
'ANDROID_SINCOS_PROVIDED',
],
}],
+ ['<(chromeos) == 1', {
+ 'sources!': [
+ 'power_monitor/power_monitor_device_source_posix.cc',
+ ],
+ }],
['OS == "ios" and _toolset != "host"', {
'sources/': [
# Pull in specific Mac files for iOS (which have been filtered out
diff --git a/base/power_monitor/power_monitor_device_source.h b/base/power_monitor/power_monitor_device_source.h
index 37b065a..d29ec0a 100644
--- a/base/power_monitor/power_monitor_device_source.h
+++ b/base/power_monitor/power_monitor_device_source.h
@@ -51,6 +51,16 @@ class BASE_EXPORT PowerMonitorDeviceSource : public PowerMonitorSource {
#endif // OS_IOS
#endif // OS_MACOSX
+#if defined(OS_CHROMEOS)
+ // On Chrome OS, Chrome receives power-related events from powerd, the system
+ // power daemon, via D-Bus signals received on the UI thread. base can't
+ // directly depend on that code, so this class instead exposes static methods
+ // so that events can be passed in.
+ static void SetPowerSource(bool on_battery);
+ static void HandleSystemSuspending();
+ static void HandleSystemResumed();
+#endif
+
private:
#if defined(OS_WIN)
// Represents a message-only window for power message handling on Windows.
diff --git a/base/power_monitor/power_monitor_device_source_chromeos.cc b/base/power_monitor/power_monitor_device_source_chromeos.cc
new file mode 100644
index 0000000..c3466ee
--- /dev/null
+++ b/base/power_monitor/power_monitor_device_source_chromeos.cc
@@ -0,0 +1,40 @@
+// Copyright 2014 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/power_monitor/power_monitor_device_source.h"
+#include "base/power_monitor/power_monitor_source.h"
+
+namespace base {
+
+namespace {
+
+// The most-recently-seen power source.
+bool g_on_battery = false;
+
+} // namespace
+
+// static
+void PowerMonitorDeviceSource::SetPowerSource(bool on_battery) {
+ if (on_battery != g_on_battery) {
+ g_on_battery = on_battery;
+ ProcessPowerEvent(POWER_STATE_EVENT);
+ }
+}
+
+// static
+void PowerMonitorDeviceSource::HandleSystemSuspending() {
+ ProcessPowerEvent(SUSPEND_EVENT);
+}
+
+// static
+void PowerMonitorDeviceSource::HandleSystemResumed() {
+ ProcessPowerEvent(RESUME_EVENT);
+}
+
+bool PowerMonitorDeviceSource::IsOnBatteryPowerImpl() {
+ return g_on_battery;
+}
+
+} // namespace base
diff --git a/chromeos/dbus/power_manager_client.cc b/chromeos/dbus/power_manager_client.cc
index 38d6f12..b2e8416 100644
--- a/chromeos/dbus/power_manager_client.cc
+++ b/chromeos/dbus/power_manager_client.cc
@@ -14,6 +14,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_loop.h"
#include "base/observer_list.h"
+#include "base/power_monitor/power_monitor_device_source.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"
#include "base/strings/stringprintf.h"
@@ -403,7 +404,7 @@ class PowerManagerClientImpl : public PowerManagerClient {
dbus::MessageReader reader(signal);
power_manager::PowerSupplyProperties protobuf;
if (reader.PopArrayOfBytesAsProto(&protobuf)) {
- FOR_EACH_OBSERVER(Observer, observers_, PowerChanged(protobuf));
+ HandlePowerSupplyProperties(protobuf);
} else {
LOG(ERROR) << "Unable to decode "
<< power_manager::kPowerSupplyPollSignal << "signal";
@@ -420,7 +421,7 @@ class PowerManagerClientImpl : public PowerManagerClient {
dbus::MessageReader reader(response);
power_manager::PowerSupplyProperties protobuf;
if (reader.PopArrayOfBytesAsProto(&protobuf)) {
- FOR_EACH_OBSERVER(Observer, observers_, PowerChanged(protobuf));
+ HandlePowerSupplyProperties(protobuf);
} else {
LOG(ERROR) << "Unable to decode "
<< power_manager::kGetPowerSupplyPropertiesMethod
@@ -444,6 +445,14 @@ class PowerManagerClientImpl : public PowerManagerClient {
callback.Run(percent);
}
+ void HandlePowerSupplyProperties(
+ const power_manager::PowerSupplyProperties& proto) {
+ FOR_EACH_OBSERVER(Observer, observers_, PowerChanged(proto));
+ const bool on_battery = proto.external_power() ==
+ power_manager::PowerSupplyProperties_ExternalPower_DISCONNECTED;
+ base::PowerMonitorDeviceSource::SetPowerSource(on_battery);
+ }
+
void HandleRegisterSuspendDelayReply(bool dark_suspend,
const std::string& method_name,
dbus::Response* response) {
@@ -507,6 +516,7 @@ class PowerManagerClientImpl : public PowerManagerClient {
FOR_EACH_OBSERVER(Observer, observers_, DarkSuspendImminent());
else
FOR_EACH_OBSERVER(Observer, observers_, SuspendImminent());
+ base::PowerMonitorDeviceSource::HandleSystemSuspending();
MaybeReportSuspendReadiness();
}
@@ -526,6 +536,7 @@ class PowerManagerClientImpl : public PowerManagerClient {
<< " duration=" << duration.InSeconds() << " sec";
FOR_EACH_OBSERVER(
PowerManagerClient::Observer, observers_, SuspendDone(duration));
+ base::PowerMonitorDeviceSource::HandleSystemResumed();
}
void IdleActionImminentReceived(dbus::Signal* signal) {