Commit da6705ff authored by derat's avatar derat Committed by Commit bot

chromeos: Add separate screen dim/off delays for lock screen

Add power.lock_screen_dim_delay_ms and
power.lock_screen_off_delay_ms prefs that provide alternate
screen-dim and screen-off inactivity delays that are honored
while the screen is locked. They currently default to 30 and
40 seconds, respectively.

BUG=190499

Review URL: https://codereview.chromium.org/793973002

Cr-Commit-Position: refs/heads/master@{#308131}
parent f40fb5db
...@@ -26,10 +26,14 @@ namespace chromeos { ...@@ -26,10 +26,14 @@ namespace chromeos {
PowerPrefs::PowerPrefs(PowerPolicyController* power_policy_controller) PowerPrefs::PowerPrefs(PowerPolicyController* power_policy_controller)
: power_policy_controller_(power_policy_controller), : power_policy_controller_(power_policy_controller),
profile_(NULL) { profile_(NULL),
screen_is_locked_(false) {
notification_registrar_.Add(this, notification_registrar_.Add(this,
chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE,
content::NotificationService::AllSources()); content::NotificationService::AllSources());
notification_registrar_.Add(this,
chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED,
content::NotificationService::AllSources());
notification_registrar_.Add(this, notification_registrar_.Add(this,
chrome::NOTIFICATION_SESSION_STARTED, chrome::NOTIFICATION_SESSION_STARTED,
content::NotificationService::AllSources()); content::NotificationService::AllSources());
...@@ -82,6 +86,12 @@ void PowerPrefs::Observe(int type, ...@@ -82,6 +86,12 @@ void PowerPrefs::Observe(int type,
SetProfile(ProfileHelper::GetSigninProfile()); SetProfile(ProfileHelper::GetSigninProfile());
break; break;
} }
case chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED:
// Update the policy in case different delays have been set for the lock
// screen.
screen_is_locked_ = *content::Details<bool>(details).ptr();
UpdatePowerPolicyFromPrefs();
break;
case chrome::NOTIFICATION_SESSION_STARTED: case chrome::NOTIFICATION_SESSION_STARTED:
// Update |profile_| when entering a session. // Update |profile_| when entering a session.
SetProfile(ProfileManager::GetPrimaryUserProfile()); SetProfile(ProfileManager::GetPrimaryUserProfile());
...@@ -108,9 +118,11 @@ void PowerPrefs::UpdatePowerPolicyFromPrefs() { ...@@ -108,9 +118,11 @@ void PowerPrefs::UpdatePowerPolicyFromPrefs() {
const PrefService* prefs = pref_change_registrar_->prefs(); const PrefService* prefs = pref_change_registrar_->prefs();
PowerPolicyController::PrefValues values; PowerPolicyController::PrefValues values;
values.ac_screen_dim_delay_ms = values.ac_screen_dim_delay_ms =
prefs->GetInteger(prefs::kPowerAcScreenDimDelayMs); prefs->GetInteger(screen_is_locked_ ? prefs::kPowerLockScreenDimDelayMs :
prefs::kPowerAcScreenDimDelayMs);
values.ac_screen_off_delay_ms = values.ac_screen_off_delay_ms =
prefs->GetInteger(prefs::kPowerAcScreenOffDelayMs); prefs->GetInteger(screen_is_locked_ ? prefs::kPowerLockScreenOffDelayMs :
prefs::kPowerAcScreenOffDelayMs);
values.ac_screen_lock_delay_ms = values.ac_screen_lock_delay_ms =
prefs->GetInteger(prefs::kPowerAcScreenLockDelayMs); prefs->GetInteger(prefs::kPowerAcScreenLockDelayMs);
values.ac_idle_warning_delay_ms = values.ac_idle_warning_delay_ms =
...@@ -118,9 +130,11 @@ void PowerPrefs::UpdatePowerPolicyFromPrefs() { ...@@ -118,9 +130,11 @@ void PowerPrefs::UpdatePowerPolicyFromPrefs() {
values.ac_idle_delay_ms = values.ac_idle_delay_ms =
prefs->GetInteger(prefs::kPowerAcIdleDelayMs); prefs->GetInteger(prefs::kPowerAcIdleDelayMs);
values.battery_screen_dim_delay_ms = values.battery_screen_dim_delay_ms =
prefs->GetInteger(prefs::kPowerBatteryScreenDimDelayMs); prefs->GetInteger(screen_is_locked_ ? prefs::kPowerLockScreenDimDelayMs :
prefs::kPowerBatteryScreenDimDelayMs);
values.battery_screen_off_delay_ms = values.battery_screen_off_delay_ms =
prefs->GetInteger(prefs::kPowerBatteryScreenOffDelayMs); prefs->GetInteger(screen_is_locked_ ? prefs::kPowerLockScreenOffDelayMs :
prefs::kPowerBatteryScreenOffDelayMs);
values.battery_screen_lock_delay_ms = values.battery_screen_lock_delay_ms =
prefs->GetInteger(prefs::kPowerBatteryScreenLockDelayMs); prefs->GetInteger(prefs::kPowerBatteryScreenLockDelayMs);
values.battery_idle_warning_delay_ms = values.battery_idle_warning_delay_ms =
...@@ -194,6 +208,14 @@ void PowerPrefs::RegisterProfilePrefs( ...@@ -194,6 +208,14 @@ void PowerPrefs::RegisterProfilePrefs(
prefs::kPowerBatteryIdleDelayMs, prefs::kPowerBatteryIdleDelayMs,
600000, 600000,
user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
registry->RegisterIntegerPref(
prefs::kPowerLockScreenDimDelayMs,
30000,
user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
registry->RegisterIntegerPref(
prefs::kPowerLockScreenOffDelayMs,
40000,
user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
registry->RegisterIntegerPref( registry->RegisterIntegerPref(
prefs::kPowerAcIdleAction, prefs::kPowerAcIdleAction,
PowerPolicyController::ACTION_SUSPEND, PowerPolicyController::ACTION_SUSPEND,
...@@ -261,6 +283,10 @@ void PowerPrefs::SetProfile(Profile* profile) { ...@@ -261,6 +283,10 @@ void PowerPrefs::SetProfile(Profile* profile) {
pref_change_registrar_->Add(prefs::kPowerBatteryIdleWarningDelayMs, pref_change_registrar_->Add(prefs::kPowerBatteryIdleWarningDelayMs,
update_callback); update_callback);
pref_change_registrar_->Add(prefs::kPowerBatteryIdleDelayMs, update_callback); pref_change_registrar_->Add(prefs::kPowerBatteryIdleDelayMs, update_callback);
pref_change_registrar_->Add(prefs::kPowerLockScreenDimDelayMs,
update_callback);
pref_change_registrar_->Add(prefs::kPowerLockScreenOffDelayMs,
update_callback);
pref_change_registrar_->Add(prefs::kPowerAcIdleAction, update_callback); pref_change_registrar_->Add(prefs::kPowerAcIdleAction, update_callback);
pref_change_registrar_->Add(prefs::kPowerBatteryIdleAction, update_callback); pref_change_registrar_->Add(prefs::kPowerBatteryIdleAction, update_callback);
pref_change_registrar_->Add(prefs::kPowerLidClosedAction, update_callback); pref_change_registrar_->Add(prefs::kPowerLidClosedAction, update_callback);
......
...@@ -60,6 +60,9 @@ class PowerPrefs : public content::NotificationObserver { ...@@ -60,6 +60,9 @@ class PowerPrefs : public content::NotificationObserver {
Profile* profile_; // Not owned. Profile* profile_; // Not owned.
scoped_ptr<PrefChangeRegistrar> pref_change_registrar_; scoped_ptr<PrefChangeRegistrar> pref_change_registrar_;
// True while the screen is locked (but not while the login screen is shown).
bool screen_is_locked_;
DISALLOW_COPY_AND_ASSIGN(PowerPrefs); DISALLOW_COPY_AND_ASSIGN(PowerPrefs);
}; };
......
...@@ -38,6 +38,13 @@ namespace chromeos { ...@@ -38,6 +38,13 @@ namespace chromeos {
class PowerPrefsTest : public testing::Test { class PowerPrefsTest : public testing::Test {
protected: protected:
// Screen lock state that determines which delays are used by
// GetExpectedPowerPolicyForProfile().
enum ScreenLockState {
LOCKED,
UNLOCKED,
};
PowerPrefsTest(); PowerPrefsTest();
// testing::Test: // testing::Test:
...@@ -46,7 +53,9 @@ class PowerPrefsTest : public testing::Test { ...@@ -46,7 +53,9 @@ class PowerPrefsTest : public testing::Test {
const Profile* GetProfile() const; const Profile* GetProfile() const;
std::string GetExpectedPowerPolicyForProfile(Profile* profile) const; std::string GetExpectedPowerPolicyForProfile(
Profile* profile,
ScreenLockState screen_lock_state) const;
std::string GetCurrentPowerPolicy() const; std::string GetCurrentPowerPolicy() const;
bool GetExpectedAllowScreenWakeLocksForProfile(Profile* profile) const; bool GetExpectedAllowScreenWakeLocksForProfile(Profile* profile) const;
bool GetCurrentAllowScreenWakeLocks() const; bool GetCurrentAllowScreenWakeLocks() const;
...@@ -92,23 +101,28 @@ const Profile* PowerPrefsTest::GetProfile() const { ...@@ -92,23 +101,28 @@ const Profile* PowerPrefsTest::GetProfile() const {
} }
std::string PowerPrefsTest::GetExpectedPowerPolicyForProfile( std::string PowerPrefsTest::GetExpectedPowerPolicyForProfile(
Profile* profile) const { Profile* profile,
ScreenLockState screen_lock_state) const {
const PrefService* prefs = profile->GetPrefs(); const PrefService* prefs = profile->GetPrefs();
power_manager::PowerManagementPolicy expected_policy; power_manager::PowerManagementPolicy expected_policy;
expected_policy.mutable_ac_delays()->set_screen_dim_ms( expected_policy.mutable_ac_delays()->set_screen_dim_ms(prefs->GetInteger(
prefs->GetInteger(prefs::kPowerAcScreenDimDelayMs)); screen_lock_state == LOCKED ? prefs::kPowerLockScreenDimDelayMs
expected_policy.mutable_ac_delays()->set_screen_off_ms( : prefs::kPowerAcScreenDimDelayMs));
prefs->GetInteger(prefs::kPowerAcScreenOffDelayMs)); expected_policy.mutable_ac_delays()->set_screen_off_ms(prefs->GetInteger(
screen_lock_state == LOCKED ? prefs::kPowerLockScreenOffDelayMs
: prefs::kPowerAcScreenOffDelayMs));
expected_policy.mutable_ac_delays()->set_screen_lock_ms( expected_policy.mutable_ac_delays()->set_screen_lock_ms(
prefs->GetInteger(prefs::kPowerAcScreenLockDelayMs)); prefs->GetInteger(prefs::kPowerAcScreenLockDelayMs));
expected_policy.mutable_ac_delays()->set_idle_warning_ms( expected_policy.mutable_ac_delays()->set_idle_warning_ms(
prefs->GetInteger(prefs::kPowerAcIdleWarningDelayMs)); prefs->GetInteger(prefs::kPowerAcIdleWarningDelayMs));
expected_policy.mutable_ac_delays()->set_idle_ms( expected_policy.mutable_ac_delays()->set_idle_ms(
prefs->GetInteger(prefs::kPowerAcIdleDelayMs)); prefs->GetInteger(prefs::kPowerAcIdleDelayMs));
expected_policy.mutable_battery_delays()->set_screen_dim_ms( expected_policy.mutable_battery_delays()->set_screen_dim_ms(prefs->GetInteger(
prefs->GetInteger(prefs::kPowerBatteryScreenDimDelayMs)); screen_lock_state == LOCKED ? prefs::kPowerLockScreenDimDelayMs
expected_policy.mutable_battery_delays()->set_screen_off_ms( : prefs::kPowerBatteryScreenDimDelayMs));
prefs->GetInteger(prefs::kPowerBatteryScreenOffDelayMs)); expected_policy.mutable_battery_delays()->set_screen_off_ms(prefs->GetInteger(
screen_lock_state == LOCKED ? prefs::kPowerLockScreenOffDelayMs
: prefs::kPowerBatteryScreenOffDelayMs));
expected_policy.mutable_battery_delays()->set_screen_lock_ms( expected_policy.mutable_battery_delays()->set_screen_lock_ms(
prefs->GetInteger(prefs::kPowerBatteryScreenLockDelayMs)); prefs->GetInteger(prefs::kPowerBatteryScreenLockDelayMs));
expected_policy.mutable_battery_delays()->set_idle_warning_ms( expected_policy.mutable_battery_delays()->set_idle_warning_ms(
...@@ -170,7 +184,7 @@ TEST_F(PowerPrefsTest, LoginScreen) { ...@@ -170,7 +184,7 @@ TEST_F(PowerPrefsTest, LoginScreen) {
content::NotificationService::NoDetails()); content::NotificationService::NoDetails());
EXPECT_EQ(login_profile, GetProfile()); EXPECT_EQ(login_profile, GetProfile());
EXPECT_EQ(GetExpectedPowerPolicyForProfile(login_profile), EXPECT_EQ(GetExpectedPowerPolicyForProfile(login_profile, UNLOCKED),
GetCurrentPowerPolicy()); GetCurrentPowerPolicy());
EXPECT_EQ(GetExpectedAllowScreenWakeLocksForProfile(login_profile), EXPECT_EQ(GetExpectedAllowScreenWakeLocksForProfile(login_profile),
GetCurrentAllowScreenWakeLocks()); GetCurrentAllowScreenWakeLocks());
...@@ -185,11 +199,27 @@ TEST_F(PowerPrefsTest, LoginScreen) { ...@@ -185,11 +199,27 @@ TEST_F(PowerPrefsTest, LoginScreen) {
// Verify that the login profile's power prefs are still being used. // Verify that the login profile's power prefs are still being used.
EXPECT_EQ(login_profile, GetProfile()); EXPECT_EQ(login_profile, GetProfile());
EXPECT_EQ(GetExpectedPowerPolicyForProfile(login_profile), EXPECT_EQ(GetExpectedPowerPolicyForProfile(login_profile, UNLOCKED),
GetCurrentPowerPolicy()); GetCurrentPowerPolicy());
EXPECT_EQ(GetExpectedAllowScreenWakeLocksForProfile(login_profile), EXPECT_EQ(GetExpectedAllowScreenWakeLocksForProfile(login_profile),
GetCurrentAllowScreenWakeLocks()); GetCurrentAllowScreenWakeLocks());
// Lock the screen and check that the expected delays are used.
bool screen_is_locked = true;
power_prefs_->Observe(chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED,
content::Source<Profile>(login_profile),
content::Details<bool>(&screen_is_locked));
EXPECT_EQ(GetExpectedPowerPolicyForProfile(login_profile, LOCKED),
GetCurrentPowerPolicy());
// Unlock the screen.
screen_is_locked = false;
power_prefs_->Observe(chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED,
content::Source<Profile>(login_profile),
content::Details<bool>(&screen_is_locked));
EXPECT_EQ(GetExpectedPowerPolicyForProfile(login_profile, UNLOCKED),
GetCurrentPowerPolicy());
// Inform power_prefs_ that the login profile has been destroyed. // Inform power_prefs_ that the login profile has been destroyed.
power_prefs_->Observe(chrome::NOTIFICATION_PROFILE_DESTROYED, power_prefs_->Observe(chrome::NOTIFICATION_PROFILE_DESTROYED,
content::Source<Profile>(login_profile), content::Source<Profile>(login_profile),
...@@ -197,7 +227,7 @@ TEST_F(PowerPrefsTest, LoginScreen) { ...@@ -197,7 +227,7 @@ TEST_F(PowerPrefsTest, LoginScreen) {
// The login profile's prefs should still be used. // The login profile's prefs should still be used.
EXPECT_FALSE(GetProfile()); EXPECT_FALSE(GetProfile());
EXPECT_EQ(GetExpectedPowerPolicyForProfile(login_profile), EXPECT_EQ(GetExpectedPowerPolicyForProfile(login_profile, UNLOCKED),
GetCurrentPowerPolicy()); GetCurrentPowerPolicy());
} }
...@@ -220,7 +250,7 @@ TEST_F(PowerPrefsTest, UserSession) { ...@@ -220,7 +250,7 @@ TEST_F(PowerPrefsTest, UserSession) {
content::NotificationService::NoDetails()); content::NotificationService::NoDetails());
EXPECT_EQ(user_profile, GetProfile()); EXPECT_EQ(user_profile, GetProfile());
EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile), EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile, UNLOCKED),
GetCurrentPowerPolicy()); GetCurrentPowerPolicy());
EXPECT_EQ(GetExpectedAllowScreenWakeLocksForProfile(user_profile), EXPECT_EQ(GetExpectedAllowScreenWakeLocksForProfile(user_profile),
GetCurrentAllowScreenWakeLocks()); GetCurrentAllowScreenWakeLocks());
...@@ -238,7 +268,7 @@ TEST_F(PowerPrefsTest, UserSession) { ...@@ -238,7 +268,7 @@ TEST_F(PowerPrefsTest, UserSession) {
// Verify that the user profile's power prefs are still being used. // Verify that the user profile's power prefs are still being used.
EXPECT_EQ(user_profile, GetProfile()); EXPECT_EQ(user_profile, GetProfile());
EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile), EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile, UNLOCKED),
GetCurrentPowerPolicy()); GetCurrentPowerPolicy());
EXPECT_EQ(GetExpectedAllowScreenWakeLocksForProfile(user_profile), EXPECT_EQ(GetExpectedAllowScreenWakeLocksForProfile(user_profile),
GetCurrentAllowScreenWakeLocks()); GetCurrentAllowScreenWakeLocks());
...@@ -250,7 +280,7 @@ TEST_F(PowerPrefsTest, UserSession) { ...@@ -250,7 +280,7 @@ TEST_F(PowerPrefsTest, UserSession) {
// Verify that power policy didn't revert to login screen settings. // Verify that power policy didn't revert to login screen settings.
EXPECT_EQ(user_profile, GetProfile()); EXPECT_EQ(user_profile, GetProfile());
EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile), EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile, UNLOCKED),
GetCurrentPowerPolicy()); GetCurrentPowerPolicy());
EXPECT_EQ(GetExpectedAllowScreenWakeLocksForProfile(user_profile), EXPECT_EQ(GetExpectedAllowScreenWakeLocksForProfile(user_profile),
GetCurrentAllowScreenWakeLocks()); GetCurrentAllowScreenWakeLocks());
...@@ -263,7 +293,7 @@ TEST_F(PowerPrefsTest, UserSession) { ...@@ -263,7 +293,7 @@ TEST_F(PowerPrefsTest, UserSession) {
// The user profile's prefs should still be used. // The user profile's prefs should still be used.
EXPECT_FALSE(GetProfile()); EXPECT_FALSE(GetProfile());
EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile), EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile, UNLOCKED),
GetCurrentPowerPolicy()); GetCurrentPowerPolicy());
} }
......
...@@ -715,6 +715,11 @@ const char kPowerBatteryIdleWarningDelayMs[] = ...@@ -715,6 +715,11 @@ const char kPowerBatteryIdleWarningDelayMs[] =
const char kPowerBatteryIdleDelayMs[] = const char kPowerBatteryIdleDelayMs[] =
"power.battery_idle_delay_ms"; "power.battery_idle_delay_ms";
// Inactivity delays used to dim the screen or turn it off while the screen is
// locked.
const char kPowerLockScreenDimDelayMs[] = "power.lock_screen_dim_delay_ms";
const char kPowerLockScreenOffDelayMs[] = "power.lock_screen_off_delay_ms";
// Action that should be performed when the idle delay is reached while the // Action that should be performed when the idle delay is reached while the
// system is on AC power or battery power. // system is on AC power or battery power.
// Values are from the chromeos::PowerPolicyController::Action enum. // Values are from the chromeos::PowerPolicyController::Action enum.
......
...@@ -244,6 +244,8 @@ extern const char kPowerBatteryScreenOffDelayMs[]; ...@@ -244,6 +244,8 @@ extern const char kPowerBatteryScreenOffDelayMs[];
extern const char kPowerBatteryScreenLockDelayMs[]; extern const char kPowerBatteryScreenLockDelayMs[];
extern const char kPowerBatteryIdleWarningDelayMs[]; extern const char kPowerBatteryIdleWarningDelayMs[];
extern const char kPowerBatteryIdleDelayMs[]; extern const char kPowerBatteryIdleDelayMs[];
extern const char kPowerLockScreenDimDelayMs[];
extern const char kPowerLockScreenOffDelayMs[];
extern const char kPowerAcIdleAction[]; extern const char kPowerAcIdleAction[];
extern const char kPowerBatteryIdleAction[]; extern const char kPowerBatteryIdleAction[];
extern const char kPowerLidClosedAction[]; extern const char kPowerLidClosedAction[];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment