Home | History | Annotate | Download | only in power
      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