1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/chromeos/power/power_prefs.h" 6 7 #include "base/bind.h" 8 #include "base/bind_helpers.h" 9 #include "base/callback.h" 10 #include "base/logging.h" 11 #include "base/prefs/pref_change_registrar.h" 12 #include "base/prefs/pref_service.h" 13 #include "chrome/browser/browser_process.h" 14 #include "chrome/browser/chrome_notification_types.h" 15 #include "chrome/browser/chromeos/profiles/profile_helper.h" 16 #include "chrome/browser/profiles/profile.h" 17 #include "chrome/browser/profiles/profile_manager.h" 18 #include "chrome/common/pref_names.h" 19 #include "chromeos/dbus/power_policy_controller.h" 20 #include "components/user_prefs/pref_registry_syncable.h" 21 #include "content/public/browser/notification_details.h" 22 #include "content/public/browser/notification_service.h" 23 #include "content/public/browser/notification_source.h" 24 25 namespace chromeos { 26 27 PowerPrefs::PowerPrefs(PowerPolicyController* power_policy_controller) 28 : power_policy_controller_(power_policy_controller), 29 profile_(NULL) { 30 notification_registrar_.Add(this, 31 chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, 32 content::NotificationService::AllSources()); 33 notification_registrar_.Add(this, 34 chrome::NOTIFICATION_SESSION_STARTED, 35 content::NotificationService::AllSources()); 36 notification_registrar_.Add(this, 37 chrome::NOTIFICATION_PROFILE_DESTROYED, 38 content::NotificationService::AllSources()); 39 } 40 41 PowerPrefs::~PowerPrefs() { 42 } 43 44 // static 45 void PowerPrefs::RegisterUserProfilePrefs( 46 user_prefs::PrefRegistrySyncable* registry) { 47 RegisterProfilePrefs(registry); 48 49 registry->RegisterIntegerPref( 50 prefs::kPowerBatteryIdleAction, 51 PowerPolicyController::ACTION_SUSPEND, 52 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 53 registry->RegisterIntegerPref( 54 prefs::kPowerLidClosedAction, 55 PowerPolicyController::ACTION_SUSPEND, 56 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 57 } 58 59 // static 60 void PowerPrefs::RegisterLoginProfilePrefs( 61 user_prefs::PrefRegistrySyncable* registry) { 62 RegisterProfilePrefs(registry); 63 64 registry->RegisterIntegerPref( 65 prefs::kPowerBatteryIdleAction, 66 PowerPolicyController::ACTION_SHUT_DOWN, 67 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 68 registry->RegisterIntegerPref( 69 prefs::kPowerLidClosedAction, 70 PowerPolicyController::ACTION_SHUT_DOWN, 71 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 72 } 73 74 void PowerPrefs::Observe(int type, 75 const content::NotificationSource& source, 76 const content::NotificationDetails& details) { 77 switch (type) { 78 case chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE: { 79 // Update |profile_| when entering the login screen. 80 ProfileManager* profile_manager = g_browser_process->profile_manager(); 81 if (!profile_manager || !profile_manager->IsLoggedIn()) 82 SetProfile(ProfileHelper::GetSigninProfile()); 83 break; 84 } 85 case chrome::NOTIFICATION_SESSION_STARTED: 86 // Update |profile_| when entering a session. 87 SetProfile(ProfileManager::GetDefaultProfile()); 88 break; 89 case chrome::NOTIFICATION_PROFILE_DESTROYED: { 90 // Update |profile_| when exiting a session or shutting down. 91 Profile* profile = content::Source<Profile>(source).ptr(); 92 if (profile_ == profile) 93 SetProfile(NULL); 94 break; 95 } 96 default: 97 NOTREACHED(); 98 break; 99 } 100 } 101 102 void PowerPrefs::UpdatePowerPolicyFromPrefs() { 103 if (!pref_change_registrar_ || !pref_change_registrar_->prefs()) { 104 NOTREACHED(); 105 return; 106 } 107 108 const PrefService* prefs = pref_change_registrar_->prefs(); 109 PowerPolicyController::PrefValues values; 110 values.ac_screen_dim_delay_ms = 111 prefs->GetInteger(prefs::kPowerAcScreenDimDelayMs); 112 values.ac_screen_off_delay_ms = 113 prefs->GetInteger(prefs::kPowerAcScreenOffDelayMs); 114 values.ac_screen_lock_delay_ms = 115 prefs->GetInteger(prefs::kPowerAcScreenLockDelayMs); 116 values.ac_idle_warning_delay_ms = 117 prefs->GetInteger(prefs::kPowerAcIdleWarningDelayMs); 118 values.ac_idle_delay_ms = 119 prefs->GetInteger(prefs::kPowerAcIdleDelayMs); 120 values.battery_screen_dim_delay_ms = 121 prefs->GetInteger(prefs::kPowerBatteryScreenDimDelayMs); 122 values.battery_screen_off_delay_ms = 123 prefs->GetInteger(prefs::kPowerBatteryScreenOffDelayMs); 124 values.battery_screen_lock_delay_ms = 125 prefs->GetInteger(prefs::kPowerBatteryScreenLockDelayMs); 126 values.battery_idle_warning_delay_ms = 127 prefs->GetInteger(prefs::kPowerBatteryIdleWarningDelayMs); 128 values.battery_idle_delay_ms = 129 prefs->GetInteger(prefs::kPowerBatteryIdleDelayMs); 130 values.ac_idle_action = static_cast<PowerPolicyController::Action>( 131 prefs->GetInteger(prefs::kPowerAcIdleAction)); 132 values.battery_idle_action = static_cast<PowerPolicyController::Action>( 133 prefs->GetInteger(prefs::kPowerBatteryIdleAction)); 134 values.lid_closed_action = static_cast<PowerPolicyController::Action>( 135 prefs->GetInteger(prefs::kPowerLidClosedAction)); 136 values.use_audio_activity = 137 prefs->GetBoolean(prefs::kPowerUseAudioActivity); 138 values.use_video_activity = 139 prefs->GetBoolean(prefs::kPowerUseVideoActivity); 140 values.allow_screen_wake_locks = 141 prefs->GetBoolean(prefs::kPowerAllowScreenWakeLocks); 142 values.enable_screen_lock = 143 prefs->GetBoolean(prefs::kEnableScreenLock); 144 values.presentation_screen_dim_delay_factor = 145 prefs->GetDouble(prefs::kPowerPresentationScreenDimDelayFactor); 146 values.user_activity_screen_dim_delay_factor = 147 prefs->GetDouble(prefs::kPowerUserActivityScreenDimDelayFactor); 148 149 power_policy_controller_->ApplyPrefs(values); 150 } 151 152 // static 153 void PowerPrefs::RegisterProfilePrefs( 154 user_prefs::PrefRegistrySyncable* registry) { 155 registry->RegisterIntegerPref( 156 prefs::kPowerAcScreenDimDelayMs, 157 420000, 158 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 159 registry->RegisterIntegerPref( 160 prefs::kPowerAcScreenOffDelayMs, 161 480000, 162 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 163 registry->RegisterIntegerPref( 164 prefs::kPowerAcScreenLockDelayMs, 165 0, 166 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 167 registry->RegisterIntegerPref( 168 prefs::kPowerAcIdleWarningDelayMs, 169 0, 170 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 171 registry->RegisterIntegerPref( 172 prefs::kPowerAcIdleDelayMs, 173 1800000, 174 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 175 registry->RegisterIntegerPref( 176 prefs::kPowerBatteryScreenDimDelayMs, 177 300000, 178 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 179 registry->RegisterIntegerPref( 180 prefs::kPowerBatteryScreenOffDelayMs, 181 360000, 182 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 183 registry->RegisterIntegerPref( 184 prefs::kPowerBatteryScreenLockDelayMs, 185 0, 186 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 187 registry->RegisterIntegerPref( 188 prefs::kPowerBatteryIdleWarningDelayMs, 189 0, 190 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 191 registry->RegisterIntegerPref( 192 prefs::kPowerBatteryIdleDelayMs, 193 600000, 194 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 195 registry->RegisterIntegerPref( 196 prefs::kPowerAcIdleAction, 197 PowerPolicyController::ACTION_SUSPEND, 198 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 199 registry->RegisterBooleanPref( 200 prefs::kPowerUseAudioActivity, 201 true, 202 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 203 registry->RegisterBooleanPref( 204 prefs::kPowerUseVideoActivity, 205 true, 206 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 207 registry->RegisterBooleanPref( 208 prefs::kPowerAllowScreenWakeLocks, 209 true, 210 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 211 registry->RegisterBooleanPref( 212 prefs::kEnableScreenLock, 213 false, 214 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 215 registry->RegisterDoublePref( 216 prefs::kPowerPresentationScreenDimDelayFactor, 217 2.0, 218 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 219 registry->RegisterDoublePref( 220 prefs::kPowerUserActivityScreenDimDelayFactor, 221 2.0, 222 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 223 } 224 225 void PowerPrefs::SetProfile(Profile* profile) { 226 profile_ = profile; 227 pref_change_registrar_.reset(); 228 229 if (!profile) { 230 power_policy_controller_->ClearPrefs(); 231 return; 232 } 233 234 base::Closure update_callback(base::Bind( 235 &PowerPrefs::UpdatePowerPolicyFromPrefs, 236 base::Unretained(this))); 237 pref_change_registrar_.reset(new PrefChangeRegistrar); 238 pref_change_registrar_->Init(profile->GetPrefs()); 239 pref_change_registrar_->Add(prefs::kPowerAcScreenDimDelayMs, update_callback); 240 pref_change_registrar_->Add(prefs::kPowerAcScreenOffDelayMs, update_callback); 241 pref_change_registrar_->Add(prefs::kPowerAcScreenLockDelayMs, 242 update_callback); 243 pref_change_registrar_->Add(prefs::kPowerAcIdleWarningDelayMs, 244 update_callback); 245 pref_change_registrar_->Add(prefs::kPowerAcIdleDelayMs, update_callback); 246 pref_change_registrar_->Add(prefs::kPowerBatteryScreenDimDelayMs, 247 update_callback); 248 pref_change_registrar_->Add(prefs::kPowerBatteryScreenOffDelayMs, 249 update_callback); 250 pref_change_registrar_->Add(prefs::kPowerBatteryScreenLockDelayMs, 251 update_callback); 252 pref_change_registrar_->Add(prefs::kPowerBatteryIdleWarningDelayMs, 253 update_callback); 254 pref_change_registrar_->Add(prefs::kPowerBatteryIdleDelayMs, update_callback); 255 pref_change_registrar_->Add(prefs::kPowerAcIdleAction, update_callback); 256 pref_change_registrar_->Add(prefs::kPowerBatteryIdleAction, update_callback); 257 pref_change_registrar_->Add(prefs::kPowerLidClosedAction, update_callback); 258 pref_change_registrar_->Add(prefs::kPowerUseAudioActivity, update_callback); 259 pref_change_registrar_->Add(prefs::kPowerUseVideoActivity, update_callback); 260 pref_change_registrar_->Add(prefs::kPowerAllowScreenWakeLocks, 261 update_callback); 262 pref_change_registrar_->Add(prefs::kEnableScreenLock, update_callback); 263 pref_change_registrar_->Add(prefs::kPowerPresentationScreenDimDelayFactor, 264 update_callback); 265 pref_change_registrar_->Add(prefs::kPowerUserActivityScreenDimDelayFactor, 266 update_callback); 267 268 UpdatePowerPolicyFromPrefs(); 269 } 270 271 } // namespace chromeos 272