Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Side by Side Diff: chromeos/dbus/power_policy_controller.cc

Issue 12775019: chromeos: Remove PowerStateOverride. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove unneeded dependency Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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_policy_controller.h" 5 #include "chromeos/dbus/power_policy_controller.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/values.h" 8 #include "base/values.h"
9 #include "chromeos/dbus/dbus_thread_manager.h" 9 #include "chromeos/dbus/dbus_thread_manager.h"
10 10
11 namespace chromeos { 11 namespace chromeos {
12 12
13 namespace { 13 namespace {
14 14
15 // If |pref|, a PrefService::Preference containing an integer, has been 15 // If |pref|, a PrefService::Preference containing an integer, has been
16 // explicitly set to 0 or a positive value, assigns it to |proto_field|, a 16 // explicitly set to 0 or a positive value, assigns it to |proto_field|, a
17 // int32 field in |proto|, a google::protobuf::MessageLite*. 17 // int32 field in |proto|, a google::protobuf::MessageLite*. If |proto|
18 #define SET_DELAY_FROM_PREF(pref, proto_field, proto) \ 18 // was updated, |got_prefs| is set to true; otherwise it is left unchanged.
19 #define SET_DELAY_FROM_PREF(pref, proto_field, proto, got_prefs) \
bartfab (slow) 2013/03/21 14:22:26 Optional nit: When you see the calls to these macr
Daniel Erat 2013/03/21 14:48:46 Makes sense; done. (I had considered this but inc
bartfab (slow) 2013/03/21 15:34:38 The |proto| should also be made a pointer then, ju
Daniel Erat 2013/03/21 15:42:30 I'm confused; maybe I'm misunderstanding the reque
bartfab (slow) 2013/03/21 16:27:34 Nevermind. I thought that in UpdatePolicyFromPrefs
19 { \ 20 { \
20 int value = GetIntPrefValue(pref); \ 21 int value = GetIntPrefValue(pref); \
21 if (value >= 0) \ 22 if (value >= 0) { \
22 (proto)->set_##proto_field(value); \ 23 (proto)->set_##proto_field(value); \
24 got_prefs = true; \
25 } \
23 } 26 }
24 27
25 // Similar to SET_DELAY_FROM_PREF() but sets a 28 // Similar to SET_DELAY_FROM_PREF() but sets a
26 // power_manager::PowerManagementPolicy_Action field instead. 29 // power_manager::PowerManagementPolicy_Action field instead.
27 #define SET_ACTION_FROM_PREF(pref, proto_field, proto) \ 30 #define SET_ACTION_FROM_PREF(pref, proto_field, proto, got_prefs) \
28 { \ 31 { \
29 int value = GetIntPrefValue(pref); \ 32 int value = GetIntPrefValue(pref); \
30 if (value >= 0) { \ 33 if (value >= 0) { \
31 (proto)->set_##proto_field( \ 34 (proto)->set_##proto_field( \
32 static_cast<power_manager::PowerManagementPolicy_Action>(value)); \ 35 static_cast<power_manager::PowerManagementPolicy_Action>(value)); \
36 got_prefs = true; \
33 } \ 37 } \
34 } 38 }
35 39
36 // If |pref|, a PrefService::Preference containing a bool, has been 40 // If |pref|, a PrefService::Preference containing a bool, has been set,
37 // set, assigns it to |proto_field|, a bool field in |proto|, a 41 // assigns it to |proto_field|, a bool field in |proto|, a
38 // google::protobuf::MessageLite*. 42 // google::protobuf::MessageLite*. If |proto| was updated, |got_prefs| is
39 #define SET_BOOL_FROM_PREF(pref, proto_field, proto) \ 43 // set to true; otherwise it is left unchanged.
44 #define SET_BOOL_FROM_PREF(pref, proto_field, proto, got_prefs) \
40 if (!pref.IsDefaultValue()) { \ 45 if (!pref.IsDefaultValue()) { \
41 bool value = false; \ 46 bool value = false; \
42 if (pref.GetValue()->GetAsBoolean(&value)) \ 47 if (pref.GetValue()->GetAsBoolean(&value)) { \
43 (proto)->set_##proto_field(value); \ 48 (proto)->set_##proto_field(value); \
44 else \ 49 got_prefs = true; \
50 } else { \
45 LOG(DFATAL) << pref.name() << " pref has non-boolean value"; \ 51 LOG(DFATAL) << pref.name() << " pref has non-boolean value"; \
52 } \
46 } 53 }
47 54
48 // Returns a zero or positive integer value from |pref|. Returns -1 if the 55 // Returns a zero or positive integer value from |pref|. Returns -1 if the
49 // pref is unset and logs an error if it's set to a negative value. 56 // pref is unset and logs an error if it's set to a negative value.
50 int GetIntPrefValue(const PrefService::Preference& pref) { 57 int GetIntPrefValue(const PrefService::Preference& pref) {
51 if (pref.IsDefaultValue()) 58 if (pref.IsDefaultValue())
52 return -1; 59 return -1;
53 60
54 int value = -1; 61 int value = -1;
55 if (!pref.GetValue()->GetAsInteger(&value)) { 62 if (!pref.GetValue()->GetAsInteger(&value)) {
(...skipping 23 matching lines...) Expand all
79 NOTREACHED() << "Unhandled action " << action; 86 NOTREACHED() << "Unhandled action " << action;
80 return power_manager::PowerManagementPolicy_Action_DO_NOTHING; 87 return power_manager::PowerManagementPolicy_Action_DO_NOTHING;
81 } 88 }
82 } 89 }
83 90
84 } // namespace 91 } // namespace
85 92
86 PowerPolicyController::PowerPolicyController(DBusThreadManager* manager, 93 PowerPolicyController::PowerPolicyController(DBusThreadManager* manager,
87 PowerManagerClient* client) 94 PowerManagerClient* client)
88 : manager_(manager), 95 : manager_(manager),
89 client_(client) { 96 client_(client),
97 prefs_were_set_(false),
98 next_block_id_(1) {
90 manager_->AddObserver(this); 99 manager_->AddObserver(this);
91 client_->AddObserver(this); 100 client_->AddObserver(this);
92 SendEmptyPolicy(); 101 SendEmptyPolicy();
93 } 102 }
94 103
95 PowerPolicyController::~PowerPolicyController() { 104 PowerPolicyController::~PowerPolicyController() {
96 // The power manager's policy is reset before this point, in 105 // The power manager's policy is reset before this point, in
97 // OnDBusThreadManagerDestroying(). At the time that 106 // OnDBusThreadManagerDestroying(). At the time that
98 // PowerPolicyController is destroyed, PowerManagerClient's D-Bus proxy 107 // PowerPolicyController is destroyed, PowerManagerClient's D-Bus proxy
99 // to the power manager is already gone. 108 // to the power manager is already gone.
(...skipping 13 matching lines...) Expand all
113 const PrefService::Preference& battery_screen_off_delay_ms_pref, 122 const PrefService::Preference& battery_screen_off_delay_ms_pref,
114 const PrefService::Preference& battery_screen_lock_delay_ms_pref, 123 const PrefService::Preference& battery_screen_lock_delay_ms_pref,
115 const PrefService::Preference& battery_idle_warning_delay_ms_pref, 124 const PrefService::Preference& battery_idle_warning_delay_ms_pref,
116 const PrefService::Preference& battery_idle_delay_ms_pref, 125 const PrefService::Preference& battery_idle_delay_ms_pref,
117 const PrefService::Preference& idle_action_pref, 126 const PrefService::Preference& idle_action_pref,
118 const PrefService::Preference& lid_closed_action_pref, 127 const PrefService::Preference& lid_closed_action_pref,
119 const PrefService::Preference& use_audio_activity_pref, 128 const PrefService::Preference& use_audio_activity_pref,
120 const PrefService::Preference& use_video_activity_pref, 129 const PrefService::Preference& use_video_activity_pref,
121 const PrefService::Preference& presentation_idle_delay_factor_pref) { 130 const PrefService::Preference& presentation_idle_delay_factor_pref) {
122 prefs_policy_.Clear(); 131 prefs_policy_.Clear();
132 bool got_prefs = false;
123 133
124 power_manager::PowerManagementPolicy::Delays* delays = 134 power_manager::PowerManagementPolicy::Delays* delays =
125 prefs_policy_.mutable_ac_delays(); 135 prefs_policy_.mutable_ac_delays();
126 SET_DELAY_FROM_PREF(ac_screen_dim_delay_ms_pref, screen_dim_ms, delays); 136 SET_DELAY_FROM_PREF(
127 SET_DELAY_FROM_PREF(ac_screen_off_delay_ms_pref, screen_off_ms, delays); 137 ac_screen_dim_delay_ms_pref, screen_dim_ms, delays, got_prefs);
128 SET_DELAY_FROM_PREF(ac_screen_lock_delay_ms_pref, screen_lock_ms, delays); 138 SET_DELAY_FROM_PREF(
129 SET_DELAY_FROM_PREF(ac_idle_warning_delay_ms_pref, idle_warning_ms, delays); 139 ac_screen_off_delay_ms_pref, screen_off_ms, delays, got_prefs);
130 SET_DELAY_FROM_PREF(ac_idle_delay_ms_pref, idle_ms, delays); 140 SET_DELAY_FROM_PREF(
141 ac_screen_lock_delay_ms_pref, screen_lock_ms, delays, got_prefs);
142 SET_DELAY_FROM_PREF(
143 ac_idle_warning_delay_ms_pref, idle_warning_ms, delays, got_prefs);
144 SET_DELAY_FROM_PREF(ac_idle_delay_ms_pref, idle_ms, delays, got_prefs);
131 145
132 delays = prefs_policy_.mutable_battery_delays(); 146 delays = prefs_policy_.mutable_battery_delays();
133 SET_DELAY_FROM_PREF(battery_screen_dim_delay_ms_pref, screen_dim_ms, delays);
134 SET_DELAY_FROM_PREF(battery_screen_off_delay_ms_pref, screen_off_ms, delays);
135 SET_DELAY_FROM_PREF( 147 SET_DELAY_FROM_PREF(
136 battery_screen_lock_delay_ms_pref, screen_lock_ms, delays); 148 battery_screen_dim_delay_ms_pref, screen_dim_ms, delays, got_prefs);
137 SET_DELAY_FROM_PREF( 149 SET_DELAY_FROM_PREF(
138 battery_idle_warning_delay_ms_pref, idle_warning_ms, delays); 150 battery_screen_off_delay_ms_pref, screen_off_ms, delays, got_prefs);
139 SET_DELAY_FROM_PREF(battery_idle_delay_ms_pref, idle_ms, delays); 151 SET_DELAY_FROM_PREF(
152 battery_screen_lock_delay_ms_pref, screen_lock_ms, delays, got_prefs);
153 SET_DELAY_FROM_PREF(
154 battery_idle_warning_delay_ms_pref, idle_warning_ms, delays, got_prefs);
155 SET_DELAY_FROM_PREF(battery_idle_delay_ms_pref, idle_ms, delays, got_prefs);
140 156
141 SET_ACTION_FROM_PREF(idle_action_pref, idle_action, &prefs_policy_);
142 SET_ACTION_FROM_PREF( 157 SET_ACTION_FROM_PREF(
143 lid_closed_action_pref, lid_closed_action, &prefs_policy_); 158 idle_action_pref, idle_action, &prefs_policy_, got_prefs);
159 SET_ACTION_FROM_PREF(
160 lid_closed_action_pref, lid_closed_action, &prefs_policy_, got_prefs);
144 161
145 SET_BOOL_FROM_PREF( 162 SET_BOOL_FROM_PREF(
146 use_audio_activity_pref, use_audio_activity, &prefs_policy_); 163 use_audio_activity_pref, use_audio_activity, &prefs_policy_, got_prefs);
147 SET_BOOL_FROM_PREF( 164 SET_BOOL_FROM_PREF(
148 use_video_activity_pref, use_video_activity, &prefs_policy_); 165 use_video_activity_pref, use_video_activity, &prefs_policy_, got_prefs);
149 166
150 if (!presentation_idle_delay_factor_pref.IsDefaultValue()) { 167 if (!presentation_idle_delay_factor_pref.IsDefaultValue()) {
151 double value = 0.0; 168 double value = 0.0;
152 if (presentation_idle_delay_factor_pref.GetValue()->GetAsDouble(&value)) { 169 if (presentation_idle_delay_factor_pref.GetValue()->GetAsDouble(&value)) {
153 prefs_policy_.set_presentation_idle_delay_factor(value); 170 prefs_policy_.set_presentation_idle_delay_factor(value);
171 got_prefs = true;
154 } else { 172 } else {
155 LOG(DFATAL) << presentation_idle_delay_factor_pref.name() 173 LOG(DFATAL) << presentation_idle_delay_factor_pref.name()
156 << " pref has non-double value"; 174 << " pref has non-double value";
157 } 175 }
158 } 176 }
159 177
178 prefs_were_set_ = got_prefs;
160 SendCurrentPolicy(); 179 SendCurrentPolicy();
161 } 180 }
162 181
182 int PowerPolicyController::AddScreenBlock(const std::string& reason) {
183 int id = next_block_id_++;
184 screen_blocks_[id] = reason;
185 SendCurrentPolicy();
186 return id;
187 }
188
189 int PowerPolicyController::AddSuspendBlock(const std::string& reason) {
190 int id = next_block_id_++;
191 suspend_blocks_[id] = reason;
192 SendCurrentPolicy();
193 return id;
194 }
195
196 void PowerPolicyController::RemoveBlock(int id) {
197 if (!screen_blocks_.erase(id) && !suspend_blocks_.erase(id))
198 LOG(WARNING) << "Ignoring request to remove nonexistent block " << id;
199 else
200 SendCurrentPolicy();
201 }
202
163 void PowerPolicyController::OnDBusThreadManagerDestroying( 203 void PowerPolicyController::OnDBusThreadManagerDestroying(
164 DBusThreadManager* manager) { 204 DBusThreadManager* manager) {
165 DCHECK_EQ(manager, manager_); 205 DCHECK_EQ(manager, manager_);
166 SendEmptyPolicy(); 206 SendEmptyPolicy();
167 } 207 }
168 208
169 void PowerPolicyController::PowerManagerRestarted() { 209 void PowerPolicyController::PowerManagerRestarted() {
170 SendCurrentPolicy(); 210 SendCurrentPolicy();
171 } 211 }
172 212
173 void PowerPolicyController::SendCurrentPolicy() { 213 void PowerPolicyController::SendCurrentPolicy() {
174 // TODO(derat): Incorporate other information into the policy that is 214 std::string reason;
175 // sent, e.g. from content::PowerSaveBlocker. 215
176 client_->SetPolicy(prefs_policy_); 216 power_manager::PowerManagementPolicy policy = prefs_policy_;
217 if (prefs_were_set_)
218 reason = "Prefs";
219
220 if (!screen_blocks_.empty()) {
221 policy.mutable_ac_delays()->set_screen_dim_ms(0);
222 policy.mutable_ac_delays()->set_screen_off_ms(0);
223 policy.mutable_battery_delays()->set_screen_dim_ms(0);
224 policy.mutable_battery_delays()->set_screen_off_ms(0);
225 }
226
227 if ((!screen_blocks_.empty() || !suspend_blocks_.empty()) &&
228 (!policy.has_idle_action() || policy.idle_action() ==
229 power_manager::PowerManagementPolicy_Action_SUSPEND)) {
230 policy.set_idle_action(
231 power_manager::PowerManagementPolicy_Action_DO_NOTHING);
232 }
233
234 for (BlockMap::const_iterator it = screen_blocks_.begin();
235 it != screen_blocks_.end(); ++it) {
236 reason += (reason.empty() ? "" : ", ") + it->second;
237 }
238 for (BlockMap::const_iterator it = suspend_blocks_.begin();
239 it != suspend_blocks_.end(); ++it) {
240 reason += (reason.empty() ? "" : ", ") + it->second;
241 }
242
243 if (!reason.empty())
244 policy.set_reason(reason);
245 client_->SetPolicy(policy);
177 } 246 }
178 247
179 void PowerPolicyController::SendEmptyPolicy() { 248 void PowerPolicyController::SendEmptyPolicy() {
180 client_->SetPolicy(power_manager::PowerManagementPolicy()); 249 client_->SetPolicy(power_manager::PowerManagementPolicy());
181 } 250 }
182 251
183 } // namespace chromeos 252 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698