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

Side by Side Diff: chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc

Issue 2853113004: chromeos: Add settings to control power management prefs. (Closed)
Patch Set: address review comments and display more lid-closed actions Created 3 years, 7 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
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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 "chrome/browser/ui/webui/settings/chromeos/device_power_handler.h" 5 #include "chrome/browser/ui/webui/settings/chromeos/device_power_handler.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 9
10 #include "ash/resources/grit/ash_resources.h" 10 #include "ash/resources/grit/ash_resources.h"
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/bind_helpers.h" 12 #include "base/bind_helpers.h"
13 #include "base/memory/ptr_util.h"
13 #include "base/strings/string_number_conversions.h" 14 #include "base/strings/string_number_conversions.h"
14 #include "base/strings/utf_string_conversions.h" 15 #include "base/strings/utf_string_conversions.h"
15 #include "base/values.h" 16 #include "base/values.h"
17 #include "chrome/common/pref_names.h"
16 #include "chrome/grit/generated_resources.h" 18 #include "chrome/grit/generated_resources.h"
19 #include "chromeos/dbus/power_policy_controller.h"
20 #include "components/prefs/pref_change_registrar.h"
21 #include "components/prefs/pref_service.h"
17 #include "content/public/browser/web_ui.h" 22 #include "content/public/browser/web_ui.h"
18 #include "ui/base/l10n/l10n_util.h" 23 #include "ui/base/l10n/l10n_util.h"
19 #include "ui/base/l10n/time_format.h" 24 #include "ui/base/l10n/time_format.h"
20 #include "ui/base/webui/web_ui_util.h" 25 #include "ui/base/webui/web_ui_util.h"
21 26
22 namespace chromeos { 27 namespace chromeos {
23 namespace settings { 28 namespace settings {
24 namespace { 29 namespace {
25 30
26 base::string16 GetBatteryTimeText(base::TimeDelta time_left) { 31 base::string16 GetBatteryTimeText(base::TimeDelta time_left) {
27 int hour = 0; 32 int hour = 0;
28 int min = 0; 33 int min = 0;
29 ash::PowerStatus::SplitTimeIntoHoursAndMinutes(time_left, &hour, &min); 34 ash::PowerStatus::SplitTimeIntoHoursAndMinutes(time_left, &hour, &min);
30 35
31 base::string16 time_text; 36 base::string16 time_text;
32 if (hour == 0 || min == 0) { 37 if (hour == 0 || min == 0) {
33 // Display only one unit ("2 hours" or "10 minutes"). 38 // Display only one unit ("2 hours" or "10 minutes").
34 return ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_DURATION, 39 return ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_DURATION,
35 ui::TimeFormat::LENGTH_LONG, time_left); 40 ui::TimeFormat::LENGTH_LONG, time_left);
36 } 41 }
37 42
38 return ui::TimeFormat::Detailed(ui::TimeFormat::FORMAT_DURATION, 43 return ui::TimeFormat::Detailed(ui::TimeFormat::FORMAT_DURATION,
39 ui::TimeFormat::LENGTH_LONG, 44 ui::TimeFormat::LENGTH_LONG,
40 -1, // force hour and minute output 45 -1, // force hour and minute output
41 time_left); 46 time_left);
42 } 47 }
43 48
44 } // namespace 49 } // namespace
45 50
46 PowerHandler::PowerHandler() 51 PowerHandler::PowerHandler(PrefService* prefs)
47 : power_observer_(this) { 52 : prefs_(prefs), power_observer_(this) {
48 power_status_ = ash::PowerStatus::Get(); 53 power_status_ = ash::PowerStatus::Get();
49 } 54 }
50 55
51 PowerHandler::~PowerHandler() {} 56 PowerHandler::~PowerHandler() {}
52 57
53 void PowerHandler::RegisterMessages() { 58 void PowerHandler::RegisterMessages() {
54 web_ui()->RegisterMessageCallback( 59 web_ui()->RegisterMessageCallback(
55 "updatePowerStatus", base::Bind(&PowerHandler::HandleUpdatePowerStatus, 60 "updatePowerStatus", base::Bind(&PowerHandler::HandleUpdatePowerStatus,
56 base::Unretained(this))); 61 base::Unretained(this)));
57 web_ui()->RegisterMessageCallback( 62 web_ui()->RegisterMessageCallback(
58 "setPowerSource", 63 "setPowerSource",
59 base::Bind(&PowerHandler::HandleSetPowerSource, base::Unretained(this))); 64 base::Bind(&PowerHandler::HandleSetPowerSource, base::Unretained(this)));
65 web_ui()->RegisterMessageCallback(
66 "requestPowerManagementSettings",
67 base::Bind(&PowerHandler::HandleRequestPowerManagementSettings,
68 base::Unretained(this)));
69 web_ui()->RegisterMessageCallback(
70 "setLidClosedBehavior",
71 base::Bind(&PowerHandler::HandleSetLidClosedBehavior,
72 base::Unretained(this)));
73 web_ui()->RegisterMessageCallback(
74 "setIdleBehavior",
75 base::Bind(&PowerHandler::HandleSetIdleBehavior, base::Unretained(this)));
60 } 76 }
61 77
62 void PowerHandler::OnJavascriptAllowed() { 78 void PowerHandler::OnJavascriptAllowed() {
63 power_observer_.Add(power_status_); 79 power_observer_.Add(power_status_);
80
81 // Register to be notified about changes to power management prefs that are
82 // incorporated into the UI.
83 base::Closure callback(base::Bind(&PowerHandler::SendPowerManagementSettings,
84 base::Unretained(this), false /* force */));
85 pref_change_registrar_ = base::MakeUnique<PrefChangeRegistrar>();
86 pref_change_registrar_->Init(prefs_);
87 pref_change_registrar_->Add(prefs::kPowerAcIdleAction, callback);
88 pref_change_registrar_->Add(prefs::kPowerAcScreenDimDelayMs, callback);
89 pref_change_registrar_->Add(prefs::kPowerAcScreenOffDelayMs, callback);
90 pref_change_registrar_->Add(prefs::kPowerAcScreenLockDelayMs, callback);
91 pref_change_registrar_->Add(prefs::kPowerBatteryIdleAction, callback);
92 pref_change_registrar_->Add(prefs::kPowerBatteryScreenDimDelayMs, callback);
93 pref_change_registrar_->Add(prefs::kPowerBatteryScreenOffDelayMs, callback);
94 pref_change_registrar_->Add(prefs::kPowerBatteryScreenLockDelayMs, callback);
95 pref_change_registrar_->Add(prefs::kPowerLidClosedAction, callback);
64 } 96 }
65 97
66 void PowerHandler::OnJavascriptDisallowed() { 98 void PowerHandler::OnJavascriptDisallowed() {
67 power_observer_.RemoveAll(); 99 power_observer_.RemoveAll();
100 pref_change_registrar_.reset();
68 } 101 }
69 102
70 void PowerHandler::OnPowerStatusChanged() { 103 void PowerHandler::OnPowerStatusChanged() {
71 SendBatteryStatus(); 104 SendBatteryStatus();
72 SendPowerSources(); 105 SendPowerSources();
73 } 106 }
74 107
75 void PowerHandler::HandleUpdatePowerStatus(const base::ListValue* args) { 108 void PowerHandler::HandleUpdatePowerStatus(const base::ListValue* args) {
76 AllowJavascript(); 109 AllowJavascript();
77 power_status_->RequestStatusUpdate(); 110 power_status_->RequestStatusUpdate();
78 } 111 }
79 112
80 void PowerHandler::HandleSetPowerSource(const base::ListValue* args) { 113 void PowerHandler::HandleSetPowerSource(const base::ListValue* args) {
81 AllowJavascript(); 114 AllowJavascript();
82 115
83 std::string id; 116 std::string id;
84 CHECK(args->GetString(0, &id)); 117 CHECK(args->GetString(0, &id));
85 power_status_->SetPowerSource(id); 118 power_status_->SetPowerSource(id);
86 } 119 }
87 120
121 void PowerHandler::HandleRequestPowerManagementSettings(
122 const base::ListValue* args) {
123 AllowJavascript();
124 SendPowerManagementSettings(true /* force */);
125 }
126
127 void PowerHandler::HandleSetIdleBehavior(const base::ListValue* args) {
128 AllowJavascript();
129
130 int value = 0;
131 CHECK(args->GetInteger(0, &value));
132 switch (static_cast<IdleBehavior>(value)) {
133 case IdleBehavior::DISPLAY_OFF_SLEEP:
134 prefs_->ClearPref(prefs::kPowerAcIdleAction);
135 prefs_->ClearPref(prefs::kPowerAcScreenDimDelayMs);
136 prefs_->ClearPref(prefs::kPowerAcScreenOffDelayMs);
137 prefs_->ClearPref(prefs::kPowerAcScreenLockDelayMs);
138 prefs_->ClearPref(prefs::kPowerBatteryIdleAction);
139 prefs_->ClearPref(prefs::kPowerBatteryScreenDimDelayMs);
140 prefs_->ClearPref(prefs::kPowerBatteryScreenOffDelayMs);
141 prefs_->ClearPref(prefs::kPowerBatteryScreenLockDelayMs);
142 break;
143 case IdleBehavior::DISPLAY_OFF_STAY_AWAKE:
144 prefs_->SetInteger(prefs::kPowerAcIdleAction,
145 PowerPolicyController::ACTION_DO_NOTHING);
146 prefs_->ClearPref(prefs::kPowerAcScreenDimDelayMs);
147 prefs_->ClearPref(prefs::kPowerAcScreenOffDelayMs);
148 prefs_->ClearPref(prefs::kPowerAcScreenLockDelayMs);
149 prefs_->SetInteger(prefs::kPowerBatteryIdleAction,
150 PowerPolicyController::ACTION_DO_NOTHING);
151 prefs_->ClearPref(prefs::kPowerBatteryScreenDimDelayMs);
152 prefs_->ClearPref(prefs::kPowerBatteryScreenOffDelayMs);
153 prefs_->ClearPref(prefs::kPowerBatteryScreenLockDelayMs);
154 break;
155 case IdleBehavior::DISPLAY_ON:
156 prefs_->SetInteger(prefs::kPowerAcIdleAction,
157 PowerPolicyController::ACTION_DO_NOTHING);
158 prefs_->SetInteger(prefs::kPowerAcScreenDimDelayMs, 0);
159 prefs_->SetInteger(prefs::kPowerAcScreenOffDelayMs, 0);
160 prefs_->SetInteger(prefs::kPowerAcScreenLockDelayMs, 0);
161 prefs_->SetInteger(prefs::kPowerBatteryIdleAction,
162 PowerPolicyController::ACTION_DO_NOTHING);
163 prefs_->SetInteger(prefs::kPowerBatteryScreenDimDelayMs, 0);
164 prefs_->SetInteger(prefs::kPowerBatteryScreenOffDelayMs, 0);
165 prefs_->SetInteger(prefs::kPowerBatteryScreenLockDelayMs, 0);
166 break;
167 default:
168 NOTREACHED() << "Invalid idle behavior " << value;
169 }
170 }
171
172 void PowerHandler::HandleSetLidClosedBehavior(const base::ListValue* args) {
173 AllowJavascript();
174
175 int value = 0;
176 CHECK(args->GetInteger(0, &value));
177 switch (static_cast<PowerPolicyController::Action>(value)) {
178 case PowerPolicyController::ACTION_SUSPEND:
179 prefs_->ClearPref(prefs::kPowerLidClosedAction);
180 break;
181 case PowerPolicyController::ACTION_DO_NOTHING:
182 prefs_->SetInteger(prefs::kPowerLidClosedAction,
183 PowerPolicyController::ACTION_DO_NOTHING);
184 break;
185 default:
186 NOTREACHED() << "Unsupported lid-closed behavior " << value;
187 }
188 }
189
88 void PowerHandler::SendBatteryStatus() { 190 void PowerHandler::SendBatteryStatus() {
89 bool charging = power_status_->IsBatteryCharging(); 191 bool charging = power_status_->IsBatteryCharging();
90 bool calculating = power_status_->IsBatteryTimeBeingCalculated(); 192 bool calculating = power_status_->IsBatteryTimeBeingCalculated();
91 int percent = power_status_->GetRoundedBatteryPercent(); 193 int percent = power_status_->GetRoundedBatteryPercent();
92 base::TimeDelta time_left; 194 base::TimeDelta time_left;
93 bool show_time = false; 195 bool show_time = false;
94 196
95 if (!calculating) { 197 if (!calculating) {
96 time_left = charging ? power_status_->GetBatteryTimeToFull() 198 time_left = charging ? power_status_->GetBatteryTimeToFull()
97 : power_status_->GetBatteryTimeToEmpty(); 199 : power_status_->GetBatteryTimeToEmpty();
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 l10n_util::GetStringUTF16(source.description_id)); 231 l10n_util::GetStringUTF16(source.description_id));
130 sources_list.Append(std::move(dict)); 232 sources_list.Append(std::move(dict));
131 } 233 }
132 234
133 CallJavascriptFunction("cr.webUIListenerCallback", 235 CallJavascriptFunction("cr.webUIListenerCallback",
134 base::Value("power-sources-changed"), sources_list, 236 base::Value("power-sources-changed"), sources_list,
135 base::Value(power_status_->GetCurrentPowerSourceID()), 237 base::Value(power_status_->GetCurrentPowerSourceID()),
136 base::Value(power_status_->IsUsbChargerConnected())); 238 base::Value(power_status_->IsUsbChargerConnected()));
137 } 239 }
138 240
241 void PowerHandler::SendPowerManagementSettings(bool force) {
242 // Infer the idle behavior based on the idle action (determining whether we'll
243 // sleep eventually or not) and the AC screen-off delay. Policy can request
244 // more-nuanced combinations of AC/battery actions and delays, but we wouldn't
245 // be able to display something meaningful in the UI in those cases anyway.
246 const PowerPolicyController::Action idle_action =
247 static_cast<PowerPolicyController::Action>(
248 prefs_->GetInteger(prefs::kPowerAcIdleAction));
249 IdleBehavior idle_behavior = IdleBehavior::OTHER;
250 if (idle_action == PowerPolicyController::ACTION_SUSPEND) {
251 idle_behavior = IdleBehavior::DISPLAY_OFF_SLEEP;
252 } else if (idle_action == PowerPolicyController::ACTION_DO_NOTHING) {
253 idle_behavior = (prefs_->GetInteger(prefs::kPowerAcScreenOffDelayMs) > 0
254 ? IdleBehavior::DISPLAY_OFF_STAY_AWAKE
255 : IdleBehavior::DISPLAY_ON);
256 }
257
258 const bool idle_managed =
259 prefs_->IsManagedPreference(prefs::kPowerAcIdleAction) ||
260 prefs_->IsManagedPreference(prefs::kPowerAcScreenDimDelayMs) ||
261 prefs_->IsManagedPreference(prefs::kPowerAcScreenOffDelayMs) ||
262 prefs_->IsManagedPreference(prefs::kPowerAcScreenLockDelayMs) ||
263 prefs_->IsManagedPreference(prefs::kPowerBatteryIdleAction) ||
264 prefs_->IsManagedPreference(prefs::kPowerBatteryScreenDimDelayMs) ||
265 prefs_->IsManagedPreference(prefs::kPowerBatteryScreenOffDelayMs) ||
266 prefs_->IsManagedPreference(prefs::kPowerBatteryScreenLockDelayMs);
267
268 const PowerPolicyController::Action lid_closed_behavior =
269 static_cast<PowerPolicyController::Action>(
270 prefs_->GetInteger(prefs::kPowerLidClosedAction));
271 const bool lid_closed_managed =
272 prefs_->IsManagedPreference(prefs::kPowerLidClosedAction);
273
274 // Don't notify the UI if nothing changed.
275 if (!force && idle_behavior == last_idle_behavior_ &&
276 idle_managed == last_idle_managed_ &&
277 lid_closed_behavior == last_lid_closed_behavior_ &&
278 lid_closed_managed == last_lid_closed_managed_)
279 return;
280
281 base::DictionaryValue dict;
282 dict.SetInteger("idleBehavior", static_cast<int>(idle_behavior));
283 dict.SetBoolean("idleManaged", idle_managed);
284 dict.SetInteger("lidClosedBehavior", lid_closed_behavior);
285 dict.SetBoolean("lidClosedManaged", lid_closed_managed);
286 CallJavascriptFunction("cr.webUIListenerCallback",
287 base::Value("power-management-settings-changed"),
288 dict);
289
290 last_idle_behavior_ = idle_behavior;
291 last_idle_managed_ = idle_managed;
292 last_lid_closed_behavior_ = lid_closed_behavior;
293 last_lid_closed_managed_ = lid_closed_managed;
294 }
295
139 } // namespace settings 296 } // namespace settings
140 } // namespace chromeos 297 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698