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 |