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