12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/power_policy_controller.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/format_macros.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos { 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Appends a description of |field|, a field within |delays|, a 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// power_manager::PowerManagementPolicy::Delays object, to |str|, an 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// std::string, if the field is set. |name| is a char* describing the 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// field. 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define APPEND_DELAY(str, delays, field, name) \ 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { \ 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delays.has_##field()) \ 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) str += base::StringPrintf(name "=%" PRId64 " ", delays.field()); \ 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Appends descriptions of all of the set delays in |delays|, a 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// power_manager::PowerManagementPolicy::Delays object, to |str|, an 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// std::string. |prefix| should be a char* containing either "ac" or 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// "battery". 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define APPEND_DELAYS(str, delays, prefix) \ 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { \ 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) APPEND_DELAY(str, delays, screen_dim_ms, prefix "_screen_dim_ms"); \ 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) APPEND_DELAY(str, delays, screen_off_ms, prefix "_screen_off_ms"); \ 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) APPEND_DELAY(str, delays, screen_lock_ms, prefix "_screen_lock_ms"); \ 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) APPEND_DELAY(str, delays, idle_warning_ms, prefix "_idle_warning_ms"); \ 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) APPEND_DELAY(str, delays, idle_ms, prefix "_idle_ms"); \ 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns the power_manager::PowerManagementPolicy_Action value 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// corresponding to |action|. 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)power_manager::PowerManagementPolicy_Action GetProtoAction( 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PowerPolicyController::Action action) { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (action) { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PowerPolicyController::ACTION_SUSPEND: 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return power_manager::PowerManagementPolicy_Action_SUSPEND; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PowerPolicyController::ACTION_STOP_SESSION: 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return power_manager::PowerManagementPolicy_Action_STOP_SESSION; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PowerPolicyController::ACTION_SHUT_DOWN: 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return power_manager::PowerManagementPolicy_Action_SHUT_DOWN; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PowerPolicyController::ACTION_DO_NOTHING: 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return power_manager::PowerManagementPolicy_Action_DO_NOTHING; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Unhandled action " << action; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return power_manager::PowerManagementPolicy_Action_DO_NOTHING; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const int PowerPolicyController::kScreenLockAfterOffDelayMs = 10000; // 10 sec. 62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// -1 is interpreted as "unset" by powerd, resulting in powerd's default 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// delays being used instead. There are no similarly-interpreted values 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// for the other fields, unfortunately (but the constructor-assigned values 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// will only reach powerd if Chrome messes up and forgets to override them 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// with the pref-assigned values). 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PowerPolicyController::PrefValues::PrefValues() 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ac_screen_dim_delay_ms(-1), 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ac_screen_off_delay_ms(-1), 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ac_screen_lock_delay_ms(-1), 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ac_idle_warning_delay_ms(-1), 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ac_idle_delay_ms(-1), 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) battery_screen_dim_delay_ms(-1), 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) battery_screen_off_delay_ms(-1), 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) battery_screen_lock_delay_ms(-1), 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) battery_idle_warning_delay_ms(-1), 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) battery_idle_delay_ms(-1), 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ac_idle_action(ACTION_SUSPEND), 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch battery_idle_action(ACTION_SUSPEND), 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) lid_closed_action(ACTION_SUSPEND), 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) use_audio_activity(true), 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) use_video_activity(true), 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ac_brightness_percent(-1.0), 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) battery_brightness_percent(-1.0), 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) allow_screen_wake_locks(true), 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) enable_auto_screen_lock(false), 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) presentation_screen_dim_delay_factor(1.0), 891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) user_activity_screen_dim_delay_factor(1.0), 901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) wait_for_initial_user_activity(false) {} 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string PowerPolicyController::GetPolicyDebugString( 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const power_manager::PowerManagementPolicy& policy) { 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string str; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (policy.has_ac_delays()) 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) APPEND_DELAYS(str, policy.ac_delays(), "ac"); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (policy.has_battery_delays()) 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) APPEND_DELAYS(str, policy.battery_delays(), "battery"); 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (policy.has_ac_idle_action()) 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch str += base::StringPrintf("ac_idle=%d ", policy.ac_idle_action()); 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (policy.has_battery_idle_action()) 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch str += base::StringPrintf("battery_idle=%d ", policy.battery_idle_action()); 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (policy.has_lid_closed_action()) 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) str += base::StringPrintf("lid_closed=%d ", policy.lid_closed_action()); 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (policy.has_use_audio_activity()) 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) str += base::StringPrintf("use_audio=%d ", policy.use_audio_activity()); 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (policy.has_use_video_activity()) 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) str += base::StringPrintf("use_video=%d ", policy.use_audio_activity()); 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (policy.has_ac_brightness_percent()) { 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) str += base::StringPrintf("ac_brightness_percent=%f ", 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy.ac_brightness_percent()); 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (policy.has_battery_brightness_percent()) { 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) str += base::StringPrintf("battery_brightness_percent=%f ", 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy.battery_brightness_percent()); 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (policy.has_presentation_screen_dim_delay_factor()) { 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) str += base::StringPrintf("presentation_screen_dim_delay_factor=%f ", 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) policy.presentation_screen_dim_delay_factor()); 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (policy.has_user_activity_screen_dim_delay_factor()) { 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) str += base::StringPrintf("user_activity_screen_dim_delay_factor=%f ", 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy.user_activity_screen_dim_delay_factor()); 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (policy.has_wait_for_initial_user_activity()) { 1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) str += base::StringPrintf("wait_for_initial_user_activity=%d ", 1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) policy.wait_for_initial_user_activity()); 1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (policy.has_reason()) 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) str += base::StringPrintf("reason=\"%s\" ", policy.reason().c_str()); 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TrimWhitespace(str, base::TRIM_TRAILING, &str); 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return str; 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)PowerPolicyController::PowerPolicyController() 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : client_(NULL), 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs_were_set_(false), 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) honor_screen_wake_locks_(true), 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) next_wake_lock_id_(1) { 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PowerPolicyController::~PowerPolicyController() { 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (client_) { 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) client_->RemoveObserver(this); 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) client_ = NULL; 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PowerPolicyController::Init(DBusThreadManager* manager) { 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) client_ = manager->GetPowerManagerClient(); 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) client_->AddObserver(this); 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PowerPolicyController::ApplyPrefs(const PrefValues& values) { 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs_policy_.Clear(); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) power_manager::PowerManagementPolicy::Delays* delays = 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs_policy_.mutable_ac_delays(); 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delays->set_screen_dim_ms(values.ac_screen_dim_delay_ms); 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delays->set_screen_off_ms(values.ac_screen_off_delay_ms); 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delays->set_screen_lock_ms(values.ac_screen_lock_delay_ms); 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delays->set_idle_warning_ms(values.ac_idle_warning_delay_ms); 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delays->set_idle_ms(values.ac_idle_delay_ms); 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If auto screen-locking is enabled, ensure that the screen is locked soon 167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // after it's turned off due to user inactivity. 168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 lock_ms = delays->screen_off_ms() + kScreenLockAfterOffDelayMs; 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (values.enable_auto_screen_lock && delays->screen_off_ms() > 0 && 170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) (delays->screen_lock_ms() <= 0 || lock_ms < delays->screen_lock_ms()) && 1719ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch lock_ms < delays->idle_ms()) { 172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) delays->set_screen_lock_ms(lock_ms); 1739ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch } 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delays = prefs_policy_.mutable_battery_delays(); 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delays->set_screen_dim_ms(values.battery_screen_dim_delay_ms); 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delays->set_screen_off_ms(values.battery_screen_off_delay_ms); 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delays->set_screen_lock_ms(values.battery_screen_lock_delay_ms); 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delays->set_idle_warning_ms(values.battery_idle_warning_delay_ms); 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delays->set_idle_ms(values.battery_idle_delay_ms); 181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) lock_ms = delays->screen_off_ms() + kScreenLockAfterOffDelayMs; 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (values.enable_auto_screen_lock && delays->screen_off_ms() > 0 && 184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) (delays->screen_lock_ms() <= 0 || lock_ms < delays->screen_lock_ms()) && 1859ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch lock_ms < delays->idle_ms()) { 186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) delays->set_screen_lock_ms(lock_ms); 1879ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch } 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch prefs_policy_.set_ac_idle_action(GetProtoAction(values.ac_idle_action)); 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch prefs_policy_.set_battery_idle_action( 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetProtoAction(values.battery_idle_action)); 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs_policy_.set_lid_closed_action(GetProtoAction(values.lid_closed_action)); 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs_policy_.set_use_audio_activity(values.use_audio_activity); 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs_policy_.set_use_video_activity(values.use_video_activity); 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (values.ac_brightness_percent >= 0.0) 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) prefs_policy_.set_ac_brightness_percent(values.ac_brightness_percent); 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (values.battery_brightness_percent >= 0.0) { 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) prefs_policy_.set_battery_brightness_percent( 199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) values.battery_brightness_percent); 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) prefs_policy_.set_presentation_screen_dim_delay_factor( 2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) values.presentation_screen_dim_delay_factor); 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs_policy_.set_user_activity_screen_dim_delay_factor( 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) values.user_activity_screen_dim_delay_factor); 2051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) prefs_policy_.set_wait_for_initial_user_activity( 2061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) values.wait_for_initial_user_activity); 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) honor_screen_wake_locks_ = values.allow_screen_wake_locks; 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs_were_set_ = true; 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendCurrentPolicy(); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int PowerPolicyController::AddScreenWakeLock(const std::string& reason) { 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int id = next_wake_lock_id_++; 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_wake_locks_[id] = reason; 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendCurrentPolicy(); 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return id; 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int PowerPolicyController::AddSystemWakeLock(const std::string& reason) { 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int id = next_wake_lock_id_++; 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) system_wake_locks_[id] = reason; 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendCurrentPolicy(); 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return id; 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PowerPolicyController::RemoveWakeLock(int id) { 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!screen_wake_locks_.erase(id) && !system_wake_locks_.erase(id)) 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(WARNING) << "Ignoring request to remove nonexistent wake lock " << id; 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendCurrentPolicy(); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PowerPolicyController::PowerManagerRestarted() { 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendCurrentPolicy(); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PowerPolicyController::SendCurrentPolicy() { 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string reason; 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) power_manager::PowerManagementPolicy policy = prefs_policy_; 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (prefs_were_set_) 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reason = "Prefs"; 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (honor_screen_wake_locks_ && !screen_wake_locks_.empty()) { 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy.mutable_ac_delays()->set_screen_dim_ms(0); 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy.mutable_ac_delays()->set_screen_off_ms(0); 249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) policy.mutable_ac_delays()->set_screen_lock_ms(0); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy.mutable_battery_delays()->set_screen_dim_ms(0); 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy.mutable_battery_delays()->set_screen_off_ms(0); 252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) policy.mutable_battery_delays()->set_screen_lock_ms(0); 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!screen_wake_locks_.empty() || !system_wake_locks_.empty()) { 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!policy.has_ac_idle_action() || policy.ac_idle_action() == 257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch power_manager::PowerManagementPolicy_Action_SUSPEND) { 258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch policy.set_ac_idle_action( 259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch power_manager::PowerManagementPolicy_Action_DO_NOTHING); 260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!policy.has_battery_idle_action() || policy.battery_idle_action() == 262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch power_manager::PowerManagementPolicy_Action_SUSPEND) { 263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch policy.set_battery_idle_action( 264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch power_manager::PowerManagementPolicy_Action_DO_NOTHING); 265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (WakeLockMap::const_iterator it = screen_wake_locks_.begin(); 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) it != screen_wake_locks_.end(); ++it) { 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reason += (reason.empty() ? "" : ", ") + it->second; 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (WakeLockMap::const_iterator it = system_wake_locks_.begin(); 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) it != system_wake_locks_.end(); ++it) { 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reason += (reason.empty() ? "" : ", ") + it->second; 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!reason.empty()) 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy.set_reason(reason); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetPolicy(policy); 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chromeos 283