Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chromeos/dbus/power_manager_client.h" | 5 #include "chromeos/dbus/power_manager_client.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 22 #include "base/strings/stringprintf.h" | 22 #include "base/strings/stringprintf.h" |
| 23 #include "base/threading/platform_thread.h" | 23 #include "base/threading/platform_thread.h" |
| 24 #include "base/timer/timer.h" | 24 #include "base/timer/timer.h" |
| 25 #include "chromeos/chromeos_switches.h" | 25 #include "chromeos/chromeos_switches.h" |
| 26 #include "chromeos/dbus/fake_power_manager_client.h" | 26 #include "chromeos/dbus/fake_power_manager_client.h" |
| 27 #include "chromeos/dbus/power_manager/input_event.pb.h" | 27 #include "chromeos/dbus/power_manager/input_event.pb.h" |
| 28 #include "chromeos/dbus/power_manager/peripheral_battery_status.pb.h" | 28 #include "chromeos/dbus/power_manager/peripheral_battery_status.pb.h" |
| 29 #include "chromeos/dbus/power_manager/policy.pb.h" | 29 #include "chromeos/dbus/power_manager/policy.pb.h" |
| 30 #include "chromeos/dbus/power_manager/power_supply_properties.pb.h" | 30 #include "chromeos/dbus/power_manager/power_supply_properties.pb.h" |
| 31 #include "chromeos/dbus/power_manager/suspend.pb.h" | 31 #include "chromeos/dbus/power_manager/suspend.pb.h" |
| 32 #include "chromeos/dbus/power_manager/switch_states.pb.h" | |
| 32 #include "chromeos/system/statistics_provider.h" | 33 #include "chromeos/system/statistics_provider.h" |
| 33 #include "components/device_event_log/device_event_log.h" | 34 #include "components/device_event_log/device_event_log.h" |
| 34 #include "dbus/bus.h" | 35 #include "dbus/bus.h" |
| 35 #include "dbus/message.h" | 36 #include "dbus/message.h" |
| 36 #include "dbus/object_path.h" | 37 #include "dbus/object_path.h" |
| 37 #include "dbus/object_proxy.h" | 38 #include "dbus/object_proxy.h" |
| 38 | 39 |
| 39 namespace chromeos { | 40 namespace chromeos { |
| 40 | 41 |
| 42 namespace { | |
| 43 | |
| 41 // Maximum amount of time that the power manager will wait for Chrome to | 44 // Maximum amount of time that the power manager will wait for Chrome to |
| 42 // say that it's ready for the system to be suspended, in milliseconds. | 45 // say that it's ready for the system to be suspended, in milliseconds. |
| 43 const int kSuspendDelayTimeoutMs = 5000; | 46 const int kSuspendDelayTimeoutMs = 5000; |
| 44 | 47 |
| 45 // Human-readable description of Chrome's suspend delay. | 48 // Human-readable description of Chrome's suspend delay. |
| 46 const char kSuspendDelayDescription[] = "chrome"; | 49 const char kSuspendDelayDescription[] = "chrome"; |
| 47 | 50 |
| 51 // Converts a LidState value from a power_manager::SwitchStates proto to the | |
| 52 // corresponding PowerManagerClient::LidState value. | |
| 53 PowerManagerClient::LidState GetLidStateFromProtoEnum( | |
| 54 power_manager::SwitchStates::LidState state) { | |
| 55 switch (state) { | |
| 56 case power_manager::SwitchStates_LidState_OPEN: | |
| 57 return PowerManagerClient::LidState::OPEN; | |
| 58 case power_manager::SwitchStates_LidState_CLOSED: | |
| 59 return PowerManagerClient::LidState::CLOSED; | |
| 60 case power_manager::SwitchStates_LidState_NOT_PRESENT: | |
| 61 return PowerManagerClient::LidState::NOT_PRESENT; | |
| 62 } | |
| 63 NOTREACHED() << "Unhandled lid state " << state; | |
| 64 return PowerManagerClient::LidState::NOT_PRESENT; | |
| 65 } | |
| 66 | |
| 67 // Converts a TabletMode value from a power_manager::SwitchStates proto to the | |
| 68 // corresponding PowerManagerClient::TabletMode value. | |
| 69 PowerManagerClient::TabletMode GetTabletModeFromProtoEnum( | |
| 70 power_manager::SwitchStates::TabletMode mode) { | |
| 71 switch (mode) { | |
| 72 case power_manager::SwitchStates_TabletMode_ON: | |
| 73 return PowerManagerClient::TabletMode::ON; | |
| 74 case power_manager::SwitchStates_TabletMode_OFF: | |
| 75 return PowerManagerClient::TabletMode::OFF; | |
| 76 case power_manager::SwitchStates_TabletMode_UNSUPPORTED: | |
| 77 return PowerManagerClient::TabletMode::UNSUPPORTED; | |
| 78 } | |
| 79 NOTREACHED() << "Unhandled tablet mode " << mode; | |
| 80 return PowerManagerClient::TabletMode::UNSUPPORTED; | |
| 81 } | |
| 82 | |
| 83 } // namespace | |
| 84 | |
| 48 // The PowerManagerClient implementation used in production. | 85 // The PowerManagerClient implementation used in production. |
| 49 class PowerManagerClientImpl : public PowerManagerClient { | 86 class PowerManagerClientImpl : public PowerManagerClient { |
| 50 public: | 87 public: |
| 51 PowerManagerClientImpl() | 88 PowerManagerClientImpl() |
| 52 : origin_thread_id_(base::PlatformThread::CurrentId()), | 89 : origin_thread_id_(base::PlatformThread::CurrentId()), |
| 53 power_manager_proxy_(NULL), | 90 power_manager_proxy_(NULL), |
| 54 suspend_delay_id_(-1), | 91 suspend_delay_id_(-1), |
| 55 has_suspend_delay_id_(false), | 92 has_suspend_delay_id_(false), |
| 56 dark_suspend_delay_id_(-1), | 93 dark_suspend_delay_id_(-1), |
| 57 has_dark_suspend_delay_id_(false), | 94 has_dark_suspend_delay_id_(false), |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 255 void GetBacklightsForcedOff( | 292 void GetBacklightsForcedOff( |
| 256 const GetBacklightsForcedOffCallback& callback) override { | 293 const GetBacklightsForcedOffCallback& callback) override { |
| 257 dbus::MethodCall method_call(power_manager::kPowerManagerInterface, | 294 dbus::MethodCall method_call(power_manager::kPowerManagerInterface, |
| 258 power_manager::kGetBacklightsForcedOffMethod); | 295 power_manager::kGetBacklightsForcedOffMethod); |
| 259 power_manager_proxy_->CallMethod( | 296 power_manager_proxy_->CallMethod( |
| 260 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | 297 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
| 261 base::Bind(&PowerManagerClientImpl::OnGetBacklightsForcedOff, | 298 base::Bind(&PowerManagerClientImpl::OnGetBacklightsForcedOff, |
| 262 weak_ptr_factory_.GetWeakPtr(), callback)); | 299 weak_ptr_factory_.GetWeakPtr(), callback)); |
| 263 } | 300 } |
| 264 | 301 |
| 302 void GetSwitchStates(const GetSwitchStatesCallback& callback) override { | |
|
jonross
2017/03/21 17:01:57
And I can just call this to poll. Sweet thanks!
| |
| 303 dbus::MethodCall method_call(power_manager::kPowerManagerInterface, | |
| 304 power_manager::kGetSwitchStatesMethod); | |
| 305 power_manager_proxy_->CallMethod( | |
| 306 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | |
| 307 base::Bind(&PowerManagerClientImpl::OnGetSwitchStates, | |
| 308 weak_ptr_factory_.GetWeakPtr(), callback)); | |
| 309 } | |
| 310 | |
| 265 base::Closure GetSuspendReadinessCallback() override { | 311 base::Closure GetSuspendReadinessCallback() override { |
| 266 DCHECK(OnOriginThread()); | 312 DCHECK(OnOriginThread()); |
| 267 DCHECK(suspend_is_pending_); | 313 DCHECK(suspend_is_pending_); |
| 268 num_pending_suspend_readiness_callbacks_++; | 314 num_pending_suspend_readiness_callbacks_++; |
| 269 return base::Bind(&PowerManagerClientImpl::HandleObserverSuspendReadiness, | 315 return base::Bind(&PowerManagerClientImpl::HandleObserverSuspendReadiness, |
| 270 weak_ptr_factory_.GetWeakPtr(), pending_suspend_id_, | 316 weak_ptr_factory_.GetWeakPtr(), pending_suspend_id_, |
| 271 suspending_from_dark_resume_); | 317 suspending_from_dark_resume_); |
| 272 } | 318 } |
| 273 | 319 |
| 274 int GetNumPendingSuspendReadinessCallbacks() override { | 320 int GetNumPendingSuspendReadinessCallbacks() override { |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 504 } | 550 } |
| 505 dbus::MessageReader reader(response); | 551 dbus::MessageReader reader(response); |
| 506 bool state = false; | 552 bool state = false; |
| 507 if (!reader.PopBool(&state)) { | 553 if (!reader.PopBool(&state)) { |
| 508 POWER_LOG(ERROR) << "Error reading response from powerd: " | 554 POWER_LOG(ERROR) << "Error reading response from powerd: " |
| 509 << response->ToString(); | 555 << response->ToString(); |
| 510 } | 556 } |
| 511 callback.Run(state); | 557 callback.Run(state); |
| 512 } | 558 } |
| 513 | 559 |
| 560 void OnGetSwitchStates(const GetSwitchStatesCallback& callback, | |
| 561 dbus::Response* response) { | |
| 562 if (!response) { | |
| 563 POWER_LOG(ERROR) << "Error calling " | |
| 564 << power_manager::kGetSwitchStatesMethod; | |
| 565 return; | |
|
Daniel Erat
2017/03/21 16:14:16
i'm following this class's existing practice of ap
jonross
2017/03/21 17:01:57
If this is only expected when chrome is faster tha
Daniel Erat
2017/03/21 17:15:02
sure, makes sense. i've added comments in the head
| |
| 566 } | |
| 567 power_manager::SwitchStates proto; | |
| 568 if (!dbus::MessageReader(response).PopArrayOfBytesAsProto(&proto)) { | |
| 569 POWER_LOG(ERROR) << "Error parsing response from " | |
| 570 << power_manager::kGetSwitchStatesMethod; | |
| 571 return; | |
| 572 } | |
| 573 callback.Run(GetLidStateFromProtoEnum(proto.lid_state()), | |
| 574 GetTabletModeFromProtoEnum(proto.tablet_mode())); | |
| 575 } | |
| 576 | |
| 514 void HandlePowerSupplyProperties( | 577 void HandlePowerSupplyProperties( |
| 515 const power_manager::PowerSupplyProperties& proto) { | 578 const power_manager::PowerSupplyProperties& proto) { |
| 516 for (auto& observer : observers_) | 579 for (auto& observer : observers_) |
| 517 observer.PowerChanged(proto); | 580 observer.PowerChanged(proto); |
| 518 const bool on_battery = proto.external_power() == | 581 const bool on_battery = proto.external_power() == |
| 519 power_manager::PowerSupplyProperties_ExternalPower_DISCONNECTED; | 582 power_manager::PowerSupplyProperties_ExternalPower_DISCONNECTED; |
| 520 base::PowerMonitorDeviceSource::SetPowerSource(on_battery); | 583 base::PowerMonitorDeviceSource::SetPowerSource(on_battery); |
| 521 } | 584 } |
| 522 | 585 |
| 523 void HandleRegisterSuspendDelayReply(bool dark_suspend, | 586 void HandleRegisterSuspendDelayReply(bool dark_suspend, |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 687 dbus::MessageWriter writer(&method_call); | 750 dbus::MessageWriter writer(&method_call); |
| 688 writer.AppendInt64(proto.timestamp()); | 751 writer.AppendInt64(proto.timestamp()); |
| 689 power_manager_proxy_->CallMethod( | 752 power_manager_proxy_->CallMethod( |
| 690 &method_call, | 753 &method_call, |
| 691 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | 754 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
| 692 dbus::ObjectProxy::EmptyResponseCallback()); | 755 dbus::ObjectProxy::EmptyResponseCallback()); |
| 693 } | 756 } |
| 694 break; | 757 break; |
| 695 } | 758 } |
| 696 case power_manager::InputEvent_Type_LID_OPEN: | 759 case power_manager::InputEvent_Type_LID_OPEN: |
| 697 case power_manager::InputEvent_Type_LID_CLOSED: { | |
| 698 bool open = | |
| 699 (proto.type() == power_manager::InputEvent_Type_LID_OPEN); | |
| 700 for (auto& observer : observers_) | 760 for (auto& observer : observers_) |
| 701 observer.LidEventReceived(open, timestamp); | 761 observer.LidEventReceived(LidState::OPEN, timestamp); |
| 702 break; | 762 break; |
| 703 } | 763 case power_manager::InputEvent_Type_LID_CLOSED: |
| 764 for (auto& observer : observers_) | |
| 765 observer.LidEventReceived(LidState::CLOSED, timestamp); | |
| 766 break; | |
| 704 case power_manager::InputEvent_Type_TABLET_MODE_ON: | 767 case power_manager::InputEvent_Type_TABLET_MODE_ON: |
| 705 case power_manager::InputEvent_Type_TABLET_MODE_OFF: { | |
| 706 bool on = | |
| 707 (proto.type() == power_manager::InputEvent_Type_TABLET_MODE_ON); | |
| 708 for (auto& observer : observers_) | 768 for (auto& observer : observers_) |
| 709 observer.TabletModeEventReceived(on, timestamp); | 769 observer.TabletModeEventReceived(TabletMode::ON, timestamp); |
| 710 break; | 770 break; |
| 711 } | 771 case power_manager::InputEvent_Type_TABLET_MODE_OFF: |
| 772 for (auto& observer : observers_) | |
| 773 observer.TabletModeEventReceived(TabletMode::OFF, timestamp); | |
| 774 break; | |
| 712 } | 775 } |
| 713 } | 776 } |
| 714 | 777 |
| 715 void RegisterSuspendDelayImpl( | 778 void RegisterSuspendDelayImpl( |
| 716 const std::string& method_name, | 779 const std::string& method_name, |
| 717 const power_manager::RegisterSuspendDelayRequest& protobuf_request, | 780 const power_manager::RegisterSuspendDelayRequest& protobuf_request, |
| 718 dbus::ObjectProxy::ResponseCallback callback) { | 781 dbus::ObjectProxy::ResponseCallback callback) { |
| 719 dbus::MethodCall method_call( | 782 dbus::MethodCall method_call( |
| 720 power_manager::kPowerManagerInterface, method_name); | 783 power_manager::kPowerManagerInterface, method_name); |
| 721 dbus::MessageWriter writer(&method_call); | 784 dbus::MessageWriter writer(&method_call); |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 880 // static | 943 // static |
| 881 PowerManagerClient* PowerManagerClient::Create( | 944 PowerManagerClient* PowerManagerClient::Create( |
| 882 DBusClientImplementationType type) { | 945 DBusClientImplementationType type) { |
| 883 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) | 946 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) |
| 884 return new PowerManagerClientImpl(); | 947 return new PowerManagerClientImpl(); |
| 885 DCHECK_EQ(FAKE_DBUS_CLIENT_IMPLEMENTATION, type); | 948 DCHECK_EQ(FAKE_DBUS_CLIENT_IMPLEMENTATION, type); |
| 886 return new FakePowerManagerClient(); | 949 return new FakePowerManagerClient(); |
| 887 } | 950 } |
| 888 | 951 |
| 889 } // namespace chromeos | 952 } // namespace chromeos |
| OLD | NEW |