diff options
author | derat <derat@chromium.org> | 2014-10-06 21:18:44 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-10-07 04:19:22 +0000 |
commit | 07366580ce28f55f6dd242c9d79e7a1f1b3bef44 (patch) | |
tree | 478e99d7cd75628ff4904b76114305d17c43db4b | |
parent | ba722a2a8ddf967dcadb483ea32d5ad31fc4bdf6 (diff) | |
download | chromium_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.gn | 7 | ||||
-rw-r--r-- | base/base.gypi | 6 | ||||
-rw-r--r-- | base/power_monitor/power_monitor_device_source.h | 10 | ||||
-rw-r--r-- | base/power_monitor/power_monitor_device_source_chromeos.cc | 40 | ||||
-rw-r--r-- | chromeos/dbus/power_manager_client.cc | 15 |
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) { |