Chromium Code Reviews| 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 |