OLD | NEW |
---|---|
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 Loading... | |
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 |
OLD | NEW |