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

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: re-add some code 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/strings/string_number_conversions.h" 13 #include "base/strings/string_number_conversions.h"
14 #include "base/strings/utf_string_conversions.h" 14 #include "base/strings/utf_string_conversions.h"
15 #include "base/values.h" 15 #include "base/values.h"
16 #include "chrome/common/pref_names.h"
16 #include "chrome/grit/generated_resources.h" 17 #include "chrome/grit/generated_resources.h"
18 #include "chromeos/dbus/power_policy_controller.h"
19 #include "components/prefs/pref_change_registrar.h"
20 #include "components/prefs/pref_service.h"
17 #include "content/public/browser/web_ui.h" 21 #include "content/public/browser/web_ui.h"
18 #include "ui/base/l10n/l10n_util.h" 22 #include "ui/base/l10n/l10n_util.h"
19 #include "ui/base/l10n/time_format.h" 23 #include "ui/base/l10n/time_format.h"
20 #include "ui/base/webui/web_ui_util.h" 24 #include "ui/base/webui/web_ui_util.h"
21 25
22 namespace chromeos { 26 namespace chromeos {
23 namespace settings { 27 namespace settings {
24 namespace { 28 namespace {
25 29
26 base::string16 GetBatteryTimeText(base::TimeDelta time_left) { 30 base::string16 GetBatteryTimeText(base::TimeDelta time_left) {
27 int hour = 0; 31 int hour = 0;
28 int min = 0; 32 int min = 0;
29 ash::PowerStatus::SplitTimeIntoHoursAndMinutes(time_left, &hour, &min); 33 ash::PowerStatus::SplitTimeIntoHoursAndMinutes(time_left, &hour, &min);
30 34
31 base::string16 time_text; 35 base::string16 time_text;
32 if (hour == 0 || min == 0) { 36 if (hour == 0 || min == 0) {
33 // Display only one unit ("2 hours" or "10 minutes"). 37 // Display only one unit ("2 hours" or "10 minutes").
34 return ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_DURATION, 38 return ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_DURATION,
35 ui::TimeFormat::LENGTH_LONG, time_left); 39 ui::TimeFormat::LENGTH_LONG, time_left);
36 } 40 }
37 41
38 return ui::TimeFormat::Detailed(ui::TimeFormat::FORMAT_DURATION, 42 return ui::TimeFormat::Detailed(ui::TimeFormat::FORMAT_DURATION,
39 ui::TimeFormat::LENGTH_LONG, 43 ui::TimeFormat::LENGTH_LONG,
40 -1, // force hour and minute output 44 -1, // force hour and minute output
41 time_left); 45 time_left);
42 } 46 }
43 47
44 } // namespace 48 } // namespace
45 49
46 PowerHandler::PowerHandler() 50 PowerHandler::PowerHandler(PrefService* prefs)
47 : power_observer_(this) { 51 : prefs_(prefs), power_observer_(this) {
48 power_status_ = ash::PowerStatus::Get(); 52 power_status_ = ash::PowerStatus::Get();
49 } 53 }
50 54
51 PowerHandler::~PowerHandler() {} 55 PowerHandler::~PowerHandler() {}
52 56
53 void PowerHandler::RegisterMessages() { 57 void PowerHandler::RegisterMessages() {
54 web_ui()->RegisterMessageCallback( 58 web_ui()->RegisterMessageCallback(
55 "updatePowerStatus", base::Bind(&PowerHandler::HandleUpdatePowerStatus, 59 "updatePowerStatus", base::Bind(&PowerHandler::HandleUpdatePowerStatus,
56 base::Unretained(this))); 60 base::Unretained(this)));
57 web_ui()->RegisterMessageCallback( 61 web_ui()->RegisterMessageCallback(
58 "setPowerSource", 62 "setPowerSource",
59 base::Bind(&PowerHandler::HandleSetPowerSource, base::Unretained(this))); 63 base::Bind(&PowerHandler::HandleSetPowerSource, base::Unretained(this)));
64 web_ui()->RegisterMessageCallback(
65 "requestPowerManagementSettings",
66 base::Bind(&PowerHandler::HandleRequestPowerManagementSettings,
67 base::Unretained(this)));
68 web_ui()->RegisterMessageCallback(
69 "setLidClosedBehavior",
70 base::Bind(&PowerHandler::HandleSetLidClosedBehavior,
71 base::Unretained(this)));
72 web_ui()->RegisterMessageCallback(
73 "setIdleBehavior",
74 base::Bind(&PowerHandler::HandleSetIdleBehavior, base::Unretained(this)));
60 } 75 }
61 76
62 void PowerHandler::OnJavascriptAllowed() { 77 void PowerHandler::OnJavascriptAllowed() {
63 power_observer_.Add(power_status_); 78 power_observer_.Add(power_status_);
79
80 // Register to be notified about changes to power management prefs that are
81 // incorporated into the UI.
82 base::Closure callback(base::Bind(&PowerHandler::SendPowerManagementSettings,
83 base::Unretained(this), false /* force */));
84 pref_change_registrar_.reset(new PrefChangeRegistrar);
michaelpg 2017/05/04 17:36:26 base::MakeUnique?
Daniel Erat 2017/05/06 00:15:48 Done.
85 pref_change_registrar_->Init(prefs_);
86 pref_change_registrar_->Add(prefs::kPowerAcIdleAction, callback);
87 pref_change_registrar_->Add(prefs::kPowerAcScreenDimDelayMs, callback);
88 pref_change_registrar_->Add(prefs::kPowerAcScreenOffDelayMs, callback);
89 pref_change_registrar_->Add(prefs::kPowerAcScreenLockDelayMs, callback);
90 pref_change_registrar_->Add(prefs::kPowerBatteryIdleAction, callback);
91 pref_change_registrar_->Add(prefs::kPowerBatteryScreenDimDelayMs, callback);
92 pref_change_registrar_->Add(prefs::kPowerBatteryScreenOffDelayMs, callback);
93 pref_change_registrar_->Add(prefs::kPowerBatteryScreenLockDelayMs, callback);
94 pref_change_registrar_->Add(prefs::kPowerLidClosedAction, callback);
64 } 95 }
65 96
66 void PowerHandler::OnJavascriptDisallowed() { 97 void PowerHandler::OnJavascriptDisallowed() {
67 power_observer_.RemoveAll(); 98 power_observer_.RemoveAll();
99 pref_change_registrar_.reset();
68 } 100 }
69 101
70 void PowerHandler::OnPowerStatusChanged() { 102 void PowerHandler::OnPowerStatusChanged() {
71 SendBatteryStatus(); 103 SendBatteryStatus();
72 SendPowerSources(); 104 SendPowerSources();
73 } 105 }
74 106
75 void PowerHandler::HandleUpdatePowerStatus(const base::ListValue* args) { 107 void PowerHandler::HandleUpdatePowerStatus(const base::ListValue* args) {
76 AllowJavascript(); 108 AllowJavascript();
77 power_status_->RequestStatusUpdate(); 109 power_status_->RequestStatusUpdate();
78 } 110 }
79 111
80 void PowerHandler::HandleSetPowerSource(const base::ListValue* args) { 112 void PowerHandler::HandleSetPowerSource(const base::ListValue* args) {
81 AllowJavascript(); 113 AllowJavascript();
82 114
83 std::string id; 115 std::string id;
84 CHECK(args->GetString(0, &id)); 116 CHECK(args->GetString(0, &id));
85 power_status_->SetPowerSource(id); 117 power_status_->SetPowerSource(id);
86 } 118 }
87 119
120 void PowerHandler::HandleRequestPowerManagementSettings(
121 const base::ListValue* args) {
122 AllowJavascript();
123 SendPowerManagementSettings(true /* force */);
124 }
125
126 void PowerHandler::HandleSetIdleBehavior(const base::ListValue* args) {
127 AllowJavascript();
128
129 int value = 0;
130 CHECK(args->GetInteger(0, &value));
131 switch (static_cast<IdleBehavior>(value)) {
132 case IdleBehavior::DISPLAY_OFF_SLEEP:
133 prefs_->ClearPref(prefs::kPowerAcIdleAction);
134 prefs_->ClearPref(prefs::kPowerAcScreenDimDelayMs);
135 prefs_->ClearPref(prefs::kPowerAcScreenOffDelayMs);
136 prefs_->ClearPref(prefs::kPowerAcScreenLockDelayMs);
137 prefs_->ClearPref(prefs::kPowerBatteryIdleAction);
138 prefs_->ClearPref(prefs::kPowerBatteryScreenDimDelayMs);
139 prefs_->ClearPref(prefs::kPowerBatteryScreenOffDelayMs);
140 prefs_->ClearPref(prefs::kPowerBatteryScreenLockDelayMs);
141 break;
142 case IdleBehavior::DISPLAY_OFF_STAY_AWAKE:
143 prefs_->SetInteger(prefs::kPowerAcIdleAction,
144 PowerPolicyController::ACTION_DO_NOTHING);
145 prefs_->ClearPref(prefs::kPowerAcScreenDimDelayMs);
146 prefs_->ClearPref(prefs::kPowerAcScreenOffDelayMs);
147 prefs_->ClearPref(prefs::kPowerAcScreenLockDelayMs);
148 prefs_->SetInteger(prefs::kPowerBatteryIdleAction,
149 PowerPolicyController::ACTION_DO_NOTHING);
150 prefs_->ClearPref(prefs::kPowerBatteryScreenDimDelayMs);
151 prefs_->ClearPref(prefs::kPowerBatteryScreenOffDelayMs);
152 prefs_->ClearPref(prefs::kPowerBatteryScreenLockDelayMs);
153 break;
154 case IdleBehavior::DISPLAY_ON:
155 prefs_->SetInteger(prefs::kPowerAcIdleAction,
156 PowerPolicyController::ACTION_DO_NOTHING);
157 prefs_->SetInteger(prefs::kPowerAcScreenDimDelayMs, 0);
158 prefs_->SetInteger(prefs::kPowerAcScreenOffDelayMs, 0);
159 prefs_->SetInteger(prefs::kPowerAcScreenLockDelayMs, 0);
160 prefs_->SetInteger(prefs::kPowerBatteryIdleAction,
161 PowerPolicyController::ACTION_DO_NOTHING);
162 prefs_->SetInteger(prefs::kPowerBatteryScreenDimDelayMs, 0);
163 prefs_->SetInteger(prefs::kPowerBatteryScreenOffDelayMs, 0);
164 prefs_->SetInteger(prefs::kPowerBatteryScreenLockDelayMs, 0);
165 break;
166 default:
167 NOTREACHED() << "Invalid idle behavior " << value;
168 }
169 }
170
171 void PowerHandler::HandleSetLidClosedBehavior(const base::ListValue* args) {
172 AllowJavascript();
173
174 int value = 0;
175 CHECK(args->GetInteger(0, &value));
176 switch (static_cast<LidClosedBehavior>(value)) {
177 case LidClosedBehavior::SLEEP:
178 prefs_->ClearPref(prefs::kPowerLidClosedAction);
179 break;
180 case LidClosedBehavior::STAY_AWAKE:
181 prefs_->SetInteger(prefs::kPowerLidClosedAction,
182 PowerPolicyController::ACTION_DO_NOTHING);
183 break;
184 default:
185 NOTREACHED() << "Invalid lid-closed behavior " << value;
186 }
187 }
188
88 void PowerHandler::SendBatteryStatus() { 189 void PowerHandler::SendBatteryStatus() {
89 bool charging = power_status_->IsBatteryCharging(); 190 bool charging = power_status_->IsBatteryCharging();
90 bool calculating = power_status_->IsBatteryTimeBeingCalculated(); 191 bool calculating = power_status_->IsBatteryTimeBeingCalculated();
91 int percent = power_status_->GetRoundedBatteryPercent(); 192 int percent = power_status_->GetRoundedBatteryPercent();
92 base::TimeDelta time_left; 193 base::TimeDelta time_left;
93 bool show_time = false; 194 bool show_time = false;
94 195
95 if (!calculating) { 196 if (!calculating) {
96 time_left = charging ? power_status_->GetBatteryTimeToFull() 197 time_left = charging ? power_status_->GetBatteryTimeToFull()
97 : power_status_->GetBatteryTimeToEmpty(); 198 : power_status_->GetBatteryTimeToEmpty();
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 l10n_util::GetStringUTF16(source.description_id)); 230 l10n_util::GetStringUTF16(source.description_id));
130 sources_list.Append(std::move(dict)); 231 sources_list.Append(std::move(dict));
131 } 232 }
132 233
133 CallJavascriptFunction("cr.webUIListenerCallback", 234 CallJavascriptFunction("cr.webUIListenerCallback",
134 base::Value("power-sources-changed"), sources_list, 235 base::Value("power-sources-changed"), sources_list,
135 base::Value(power_status_->GetCurrentPowerSourceID()), 236 base::Value(power_status_->GetCurrentPowerSourceID()),
136 base::Value(power_status_->IsUsbChargerConnected())); 237 base::Value(power_status_->IsUsbChargerConnected()));
137 } 238 }
138 239
240 void PowerHandler::SendPowerManagementSettings(bool force) {
241 // Infer the idle behavior based on the idle action (determining whether we'll
242 // sleep eventually or not) and the AC screen-off delay. Policy can request
243 // more-nuanced combinations of AC/battery actions and delays, but we wouldn't
244 // be able to display something meaningful in the UI in those cases anyway.
245 const IdleBehavior idle_behavior =
246 prefs_->GetInteger(prefs::kPowerAcIdleAction) ==
michaelpg 2017/05/04 17:36:26 could you unpack this into at least 1 if statement
Daniel Erat 2017/05/06 00:15:48 Done.
247 PowerPolicyController::ACTION_DO_NOTHING
248 ? (prefs_->GetInteger(prefs::kPowerAcScreenOffDelayMs) > 0
249 ? IdleBehavior::DISPLAY_OFF_STAY_AWAKE
250 : IdleBehavior::DISPLAY_ON)
251 : IdleBehavior::DISPLAY_OFF_SLEEP;
252 const bool idle_managed =
253 prefs_->IsManagedPreference(prefs::kPowerAcIdleAction) ||
254 prefs_->IsManagedPreference(prefs::kPowerAcScreenDimDelayMs) ||
255 prefs_->IsManagedPreference(prefs::kPowerAcScreenOffDelayMs) ||
256 prefs_->IsManagedPreference(prefs::kPowerAcScreenLockDelayMs) ||
257 prefs_->IsManagedPreference(prefs::kPowerBatteryIdleAction) ||
258 prefs_->IsManagedPreference(prefs::kPowerBatteryScreenDimDelayMs) ||
259 prefs_->IsManagedPreference(prefs::kPowerBatteryScreenOffDelayMs) ||
260 prefs_->IsManagedPreference(prefs::kPowerBatteryScreenLockDelayMs);
261
262 // Assume we'll sleep on lid-closed if the pref isn't set to "do nothing".
263 // It's possible that a different action has been set by policy, but that's
264 // rare and we don't want to make other actions available to users in the
265 // unmanaged case.
Daniel Erat 2017/05/02 00:58:42 let me know if i'm being appropriately or inapprop
michaelpg 2017/05/04 17:36:26 Up to you. This may confuse debugging efforts. "I
Daniel Erat 2017/05/06 00:15:48 as mentioned on the .h file, i've changed things a
266 const LidClosedBehavior lid_closed_behavior =
267 prefs_->GetInteger(prefs::kPowerLidClosedAction) ==
268 PowerPolicyController::ACTION_DO_NOTHING
269 ? LidClosedBehavior::STAY_AWAKE
270 : LidClosedBehavior::SLEEP;
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_)
michaelpg 2017/05/04 17:36:26 style guide mandates { } around if body, since the
Daniel Erat 2017/05/06 00:15:47 not mandated by either the google or chromium c++
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", static_cast<int>(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