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