Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 <utility> | |
| 8 | |
| 7 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
| 8 #include "base/logging.h" | 10 #include "base/logging.h" |
| 9 #include "base/strings/string_util.h" | 11 #include "base/strings/string_util.h" |
| 10 #include "base/strings/stringprintf.h" | 12 #include "base/strings/stringprintf.h" |
| 11 | 13 |
| 12 namespace chromeos { | 14 namespace chromeos { |
| 13 | 15 |
| 14 namespace { | 16 namespace { |
| 15 | 17 |
| 16 PowerPolicyController* g_power_policy_controller = nullptr; | 18 PowerPolicyController* g_power_policy_controller = nullptr; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 50 case PowerPolicyController::ACTION_SHUT_DOWN: | 52 case PowerPolicyController::ACTION_SHUT_DOWN: |
| 51 return power_manager::PowerManagementPolicy_Action_SHUT_DOWN; | 53 return power_manager::PowerManagementPolicy_Action_SHUT_DOWN; |
| 52 case PowerPolicyController::ACTION_DO_NOTHING: | 54 case PowerPolicyController::ACTION_DO_NOTHING: |
| 53 return power_manager::PowerManagementPolicy_Action_DO_NOTHING; | 55 return power_manager::PowerManagementPolicy_Action_DO_NOTHING; |
| 54 default: | 56 default: |
| 55 NOTREACHED() << "Unhandled action " << action; | 57 NOTREACHED() << "Unhandled action " << action; |
| 56 return power_manager::PowerManagementPolicy_Action_DO_NOTHING; | 58 return power_manager::PowerManagementPolicy_Action_DO_NOTHING; |
| 57 } | 59 } |
| 58 } | 60 } |
| 59 | 61 |
| 62 // Returns false if |use_audio_activity| and |use_audio_activity| prevent wake | |
| 63 // locks created for |reason| from being honored or true otherwise. | |
| 64 bool IsWakeLockReasonHonored(PowerPolicyController::WakeLockReason reason, | |
| 65 bool use_audio_activity, | |
| 66 bool use_video_activity) { | |
| 67 if (reason == PowerPolicyController::REASON_AUDIO_PLAYBACK && | |
| 68 !use_audio_activity) | |
|
bartfab (slow)
2015/02/23 13:56:49
Nit: Add {}.
Daniel Erat
2015/02/23 16:34:05
i hope you don't mind, but i think i'm going to ig
| |
| 69 return false; | |
| 70 if (reason == PowerPolicyController::REASON_VIDEO_PLAYBACK && | |
| 71 !use_video_activity) | |
|
bartfab (slow)
2015/02/23 13:56:49
Nit: Add {}.
| |
| 72 return false; | |
| 73 return true; | |
| 74 } | |
| 75 | |
| 60 } // namespace | 76 } // namespace |
| 61 | 77 |
| 62 const int PowerPolicyController::kScreenLockAfterOffDelayMs = 10000; // 10 sec. | 78 const int PowerPolicyController::kScreenLockAfterOffDelayMs = 10000; // 10 sec. |
| 79 const char PowerPolicyController::kPrefsReason[] = "Prefs"; | |
| 63 | 80 |
| 64 // -1 is interpreted as "unset" by powerd, resulting in powerd's default | 81 // -1 is interpreted as "unset" by powerd, resulting in powerd's default |
| 65 // delays being used instead. There are no similarly-interpreted values | 82 // delays being used instead. There are no similarly-interpreted values |
| 66 // for the other fields, unfortunately (but the constructor-assigned values | 83 // for the other fields, unfortunately (but the constructor-assigned values |
| 67 // will only reach powerd if Chrome messes up and forgets to override them | 84 // will only reach powerd if Chrome messes up and forgets to override them |
| 68 // with the pref-assigned values). | 85 // with the pref-assigned values). |
| 69 PowerPolicyController::PrefValues::PrefValues() | 86 PowerPolicyController::PrefValues::PrefValues() |
| 70 : ac_screen_dim_delay_ms(-1), | 87 : ac_screen_dim_delay_ms(-1), |
| 71 ac_screen_off_delay_ms(-1), | 88 ac_screen_off_delay_ms(-1), |
| 72 ac_screen_lock_delay_ms(-1), | 89 ac_screen_lock_delay_ms(-1), |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 217 values.wait_for_initial_user_activity); | 234 values.wait_for_initial_user_activity); |
| 218 prefs_policy_.set_force_nonzero_brightness_for_user_activity( | 235 prefs_policy_.set_force_nonzero_brightness_for_user_activity( |
| 219 values.force_nonzero_brightness_for_user_activity); | 236 values.force_nonzero_brightness_for_user_activity); |
| 220 | 237 |
| 221 honor_screen_wake_locks_ = values.allow_screen_wake_locks; | 238 honor_screen_wake_locks_ = values.allow_screen_wake_locks; |
| 222 | 239 |
| 223 prefs_were_set_ = true; | 240 prefs_were_set_ = true; |
| 224 SendCurrentPolicy(); | 241 SendCurrentPolicy(); |
| 225 } | 242 } |
| 226 | 243 |
| 227 int PowerPolicyController::AddScreenWakeLock(const std::string& reason) { | 244 int PowerPolicyController::AddScreenWakeLock(WakeLockReason reason, |
| 228 int id = next_wake_lock_id_++; | 245 const std::string& description) { |
| 229 screen_wake_locks_[id] = reason; | 246 return AddWakeLockInternal(WakeLock::TYPE_SCREEN, reason, description); |
| 230 SendCurrentPolicy(); | |
| 231 return id; | |
| 232 } | 247 } |
| 233 | 248 |
| 234 int PowerPolicyController::AddSystemWakeLock(const std::string& reason) { | 249 int PowerPolicyController::AddSystemWakeLock(WakeLockReason reason, |
| 235 int id = next_wake_lock_id_++; | 250 const std::string& description) { |
| 236 system_wake_locks_[id] = reason; | 251 return AddWakeLockInternal(WakeLock::TYPE_SYSTEM, reason, description); |
| 237 SendCurrentPolicy(); | |
| 238 return id; | |
| 239 } | 252 } |
| 240 | 253 |
| 241 void PowerPolicyController::RemoveWakeLock(int id) { | 254 void PowerPolicyController::RemoveWakeLock(int id) { |
| 242 if (!screen_wake_locks_.erase(id) && !system_wake_locks_.erase(id)) | 255 if (!wake_locks_.erase(id)) |
| 243 LOG(WARNING) << "Ignoring request to remove nonexistent wake lock " << id; | 256 LOG(WARNING) << "Ignoring request to remove nonexistent wake lock " << id; |
| 244 else | 257 else |
| 245 SendCurrentPolicy(); | 258 SendCurrentPolicy(); |
| 246 } | 259 } |
| 247 | 260 |
| 248 void PowerPolicyController::PowerManagerRestarted() { | 261 void PowerPolicyController::PowerManagerRestarted() { |
| 249 SendCurrentPolicy(); | 262 SendCurrentPolicy(); |
| 250 } | 263 } |
| 251 | 264 |
| 252 PowerPolicyController::PowerPolicyController(PowerManagerClient* client) | 265 PowerPolicyController::PowerPolicyController(PowerManagerClient* client) |
| 253 : client_(client), | 266 : client_(client), |
| 254 prefs_were_set_(false), | 267 prefs_were_set_(false), |
| 255 honor_screen_wake_locks_(true), | 268 honor_screen_wake_locks_(true), |
| 256 next_wake_lock_id_(1) { | 269 next_wake_lock_id_(1) { |
| 257 DCHECK(client_); | 270 DCHECK(client_); |
| 258 client_->AddObserver(this); | 271 client_->AddObserver(this); |
| 259 } | 272 } |
| 260 | 273 |
| 261 PowerPolicyController::~PowerPolicyController() { | 274 PowerPolicyController::~PowerPolicyController() { |
| 262 client_->RemoveObserver(this); | 275 client_->RemoveObserver(this); |
| 263 } | 276 } |
| 264 | 277 |
| 278 PowerPolicyController::WakeLock::WakeLock(Type type, | |
| 279 WakeLockReason reason, | |
| 280 const std::string& description) | |
| 281 : type(type), reason(reason), description(description) { | |
| 282 } | |
| 283 | |
| 284 PowerPolicyController::WakeLock::~WakeLock() { | |
| 285 } | |
| 286 | |
| 287 int PowerPolicyController::AddWakeLockInternal(WakeLock::Type type, | |
| 288 WakeLockReason reason, | |
| 289 const std::string& description) { | |
| 290 int id = next_wake_lock_id_++; | |
|
bartfab (slow)
2015/02/23 13:56:49
Nit: const.
Daniel Erat
2015/02/23 16:34:05
Done.
| |
| 291 wake_locks_.insert(std::make_pair(id, WakeLock(type, reason, description))); | |
| 292 SendCurrentPolicy(); | |
| 293 return id; | |
| 294 } | |
| 295 | |
| 265 void PowerPolicyController::SendCurrentPolicy() { | 296 void PowerPolicyController::SendCurrentPolicy() { |
| 266 std::string reason; | 297 std::string causes; |
| 267 | 298 |
| 268 power_manager::PowerManagementPolicy policy = prefs_policy_; | 299 power_manager::PowerManagementPolicy policy = prefs_policy_; |
| 269 if (prefs_were_set_) | 300 if (prefs_were_set_) |
| 270 reason = "Prefs"; | 301 causes = kPrefsReason; |
| 271 | 302 |
| 272 if (honor_screen_wake_locks_ && !screen_wake_locks_.empty()) { | 303 bool have_screen_wake_locks = false; |
| 304 bool have_system_wake_locks = false; | |
| 305 for (const auto& it : wake_locks_) { | |
| 306 // Skip audio and video locks that should be ignored due to policy. | |
| 307 if (!IsWakeLockReasonHonored(it.second.reason, policy.use_audio_activity(), | |
| 308 policy.use_video_activity())) | |
|
bartfab (slow)
2015/02/23 13:56:49
Nit: Add {}.
| |
| 309 continue; | |
| 310 | |
| 311 switch (it.second.type) { | |
| 312 case WakeLock::TYPE_SCREEN: | |
| 313 have_screen_wake_locks = true; | |
| 314 break; | |
| 315 case WakeLock::TYPE_SYSTEM: | |
| 316 have_system_wake_locks = true; | |
| 317 break; | |
| 318 } | |
| 319 causes += (causes.empty() ? "" : ", ") + it.second.description; | |
| 320 } | |
| 321 | |
| 322 if (honor_screen_wake_locks_ && have_screen_wake_locks) { | |
| 273 policy.mutable_ac_delays()->set_screen_dim_ms(0); | 323 policy.mutable_ac_delays()->set_screen_dim_ms(0); |
| 274 policy.mutable_ac_delays()->set_screen_off_ms(0); | 324 policy.mutable_ac_delays()->set_screen_off_ms(0); |
| 275 policy.mutable_ac_delays()->set_screen_lock_ms(0); | 325 policy.mutable_ac_delays()->set_screen_lock_ms(0); |
| 276 policy.mutable_battery_delays()->set_screen_dim_ms(0); | 326 policy.mutable_battery_delays()->set_screen_dim_ms(0); |
| 277 policy.mutable_battery_delays()->set_screen_off_ms(0); | 327 policy.mutable_battery_delays()->set_screen_off_ms(0); |
| 278 policy.mutable_battery_delays()->set_screen_lock_ms(0); | 328 policy.mutable_battery_delays()->set_screen_lock_ms(0); |
| 279 } | 329 } |
| 280 | 330 |
| 281 if (!screen_wake_locks_.empty() || !system_wake_locks_.empty()) { | 331 if (have_screen_wake_locks || have_system_wake_locks) { |
| 282 if (!policy.has_ac_idle_action() || policy.ac_idle_action() == | 332 if (!policy.has_ac_idle_action() || policy.ac_idle_action() == |
| 283 power_manager::PowerManagementPolicy_Action_SUSPEND) { | 333 power_manager::PowerManagementPolicy_Action_SUSPEND) { |
| 284 policy.set_ac_idle_action( | 334 policy.set_ac_idle_action( |
| 285 power_manager::PowerManagementPolicy_Action_DO_NOTHING); | 335 power_manager::PowerManagementPolicy_Action_DO_NOTHING); |
| 286 } | 336 } |
| 287 if (!policy.has_battery_idle_action() || policy.battery_idle_action() == | 337 if (!policy.has_battery_idle_action() || policy.battery_idle_action() == |
| 288 power_manager::PowerManagementPolicy_Action_SUSPEND) { | 338 power_manager::PowerManagementPolicy_Action_SUSPEND) { |
| 289 policy.set_battery_idle_action( | 339 policy.set_battery_idle_action( |
| 290 power_manager::PowerManagementPolicy_Action_DO_NOTHING); | 340 power_manager::PowerManagementPolicy_Action_DO_NOTHING); |
| 291 } | 341 } |
| 292 } | 342 } |
| 293 | 343 |
| 294 for (WakeLockMap::const_iterator it = screen_wake_locks_.begin(); | 344 if (!causes.empty()) |
| 295 it != screen_wake_locks_.end(); ++it) { | 345 policy.set_reason(causes); |
| 296 reason += (reason.empty() ? "" : ", ") + it->second; | |
| 297 } | |
| 298 for (WakeLockMap::const_iterator it = system_wake_locks_.begin(); | |
| 299 it != system_wake_locks_.end(); ++it) { | |
| 300 reason += (reason.empty() ? "" : ", ") + it->second; | |
| 301 } | |
| 302 | |
| 303 if (!reason.empty()) | |
| 304 policy.set_reason(reason); | |
| 305 client_->SetPolicy(policy); | 346 client_->SetPolicy(policy); |
| 306 } | 347 } |
| 307 | 348 |
| 308 } // namespace chromeos | 349 } // namespace chromeos |
| OLD | NEW |