#include "ash/system/keyboard_brightness/keyboard_brightness_controller.h"
#include "ash/constants/ash_pref_names.h"
#include "ash/login/login_screen_controller.h"
#include "ash/session/session_controller_impl.h"
#include "ash/shell.h"
#include "ash/system/keyboard_brightness_control_delegate.h"
#include "ash/system/power/power_status.h"
#include "ash/test/ash_test_base.h"
#include "base/metrics/histogram_functions.h"
#include "base/test/bind.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/task_environment.h"
#include "chromeos/dbus/power/fake_power_manager_client.h"
#include "components/user_manager/known_user.h"
namespace ash {
namespace {
constexpr char kUserEmail[] = "user@example.com";
constexpr char kUserEmailSecondary[] = "user2@example.com";
constexpr double kInitialKeyboardBrightness = 40.0;
power_manager::PowerSupplyProperties BuildFakePowerSupplyProperties(
power_manager::PowerSupplyProperties::ExternalPower charger_state) {
power_manager::PowerSupplyProperties fake_power;
fake_power.set_external_power(charger_state);
fake_power.set_battery_percent(50);
return fake_power;
}
void SetBatteryPower() {
DCHECK(PowerStatus::IsInitialized());
PowerStatus::Get()->SetProtoForTesting(BuildFakePowerSupplyProperties(
power_manager::PowerSupplyProperties::DISCONNECTED));
}
void SetChargerPower() {
DCHECK(PowerStatus::IsInitialized());
PowerStatus::Get()->SetProtoForTesting(
BuildFakePowerSupplyProperties(power_manager::PowerSupplyProperties::AC));
}
}
class FakeKeyboardBrightnessControlDelegate
: public KeyboardBrightnessControlDelegate {
public:
FakeKeyboardBrightnessControlDelegate() = default;
~FakeKeyboardBrightnessControlDelegate() override = default;
void HandleKeyboardBrightnessDown() override {}
void HandleKeyboardBrightnessUp() override {}
void HandleToggleKeyboardBacklight() override {}
void HandleGetKeyboardBrightness(
base::OnceCallback<void(std::optional<double>)> callback) override {
std::move(callback).Run(keyboard_brightness_);
}
void HandleSetKeyboardBrightness(
double percent,
bool gradual,
KeyboardBrightnessChangeSource source) override {
keyboard_brightness_ = percent;
}
void HandleSetKeyboardAmbientLightSensorEnabled(
bool enabled,
KeyboardAmbientLightSensorEnabledChangeSource source) override {}
void HandleGetKeyboardAmbientLightSensorEnabled(
base::OnceCallback<void(std::optional<bool>)> callback) override {}
double keyboard_brightness() { return keyboard_brightness_; }
void OnReceiveHasKeyboardBacklight(
std::optional<bool> has_keyboard_backlight) {
if (has_keyboard_backlight.has_value()) {
base::UmaHistogramBoolean("ChromeOS.Keyboard.HasBacklight",
has_keyboard_backlight.value());
}
}
void OnReceiveHasAmbientLightSensor(std::optional<bool> has_sensor) {
if (has_sensor.has_value()) {
base::UmaHistogramBoolean(
"ChromeOS.Settings.Device.HasAmbientLightSensor", has_sensor.value());
}
}
private:
double keyboard_brightness_ = 0;
};
class KeyboardBrightnessControllerTest : public AshTestBase {
public:
KeyboardBrightnessControllerTest()
: AshTestBase(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
void SetUp() override {
AshTestBase::SetUp();
delegate_ = std::make_unique<FakeKeyboardBrightnessControlDelegate>();
histogram_tester_ = std::make_unique<base::HistogramTester>();
}
void TearDown() override {
AshTestBase::TearDown();
delegate_.reset();
}
KeyboardBrightnessControlDelegate* keyboard_brightness_control_delegate() {
return Shell::Get()->keyboard_brightness_control_delegate();
}
LoginDataDispatcher* login_data_dispatcher() {
return Shell::Get()->login_screen_controller()->data_dispatcher();
}
bool HasKeyboardAmbientLightSensorEnabledPrefValue(
const user_manager::KnownUser& known_user,
const AccountId& account_id) {
const base::Value* pref_value = known_user.FindPath(
account_id, prefs::kKeyboardAmbientLightSensorEnabled);
if (!pref_value) {
return false;
}
return pref_value->is_bool();
}
bool GetKeyboardAmbientLightSensorEnabledPrefValue(
const user_manager::KnownUser& known_user,
const AccountId& account_id) {
return known_user
.FindPath(account_id, prefs::kKeyboardAmbientLightSensorEnabled)
->GetBool();
}
bool HasKeyboardBrightnessPrefValue(const user_manager::KnownUser& known_user,
const AccountId& account_id) {
const base::Value* pref_value =
known_user.FindPath(account_id, prefs::kKeyboardBrightnessPercent);
if (!pref_value) {
return false;
}
return pref_value->is_double();
}
double GetKeyboardBrightnessPrefValue(
const user_manager::KnownUser& known_user,
const AccountId& account_id) {
return known_user.FindPath(account_id, prefs::kKeyboardBrightnessPercent)
->GetDouble();
}
bool HasKeyboardAmbientLightSensorDisabledReasonPrefValue(
const user_manager::KnownUser& known_user,
const AccountId& account_id) {
const base::Value* pref_value = known_user.FindPath(
account_id, prefs::kKeyboardAmbientLightSensorDisabledReason);
if (!pref_value) {
return false;
}
return pref_value->is_int();
}
int GetKeyboardAmbientLightSensorDisabledReasonPrefValue(
const user_manager::KnownUser& known_user,
const AccountId& account_id) {
return known_user
.FindPath(account_id, prefs::kKeyboardAmbientLightSensorDisabledReason)
->GetInt();
}
void SetKeyboardAmbientLightSensorEnabled(
bool enabled,
power_manager::AmbientLightSensorChange_Cause cause) {
keyboard_brightness_control_delegate()
->HandleSetKeyboardAmbientLightSensorEnabled(
enabled,
KeyboardAmbientLightSensorEnabledChangeSource::kSettingsApp);
power_manager::AmbientLightSensorChange sensor_change;
sensor_change.set_sensor_enabled(enabled);
sensor_change.set_cause(cause);
power_manager_client()->SendKeyboardAmbientLightSensorEnabledChanged(
sensor_change);
}
void SetKeyboardBrightness(
double keyboard_brightness,
power_manager::BacklightBrightnessChange_Cause cause) {
keyboard_brightness_control_delegate()->HandleSetKeyboardBrightness(
keyboard_brightness, false,
KeyboardBrightnessChangeSource::kSettingsApp);
power_manager::BacklightBrightnessChange brightness_change;
brightness_change.set_percent(keyboard_brightness);
brightness_change.set_cause(cause);
power_manager_client()->set_keyboard_brightness_percent(
keyboard_brightness);
power_manager_client()->SendKeyboardBrightnessChanged(brightness_change);
}
void LoginScreenFocusAccount(const AccountId account_id) {
login_data_dispatcher()->NotifyFocusPod(account_id);
run_loop_.RunUntilIdle();
}
void ExpectKeyboardAmbientLightSensorEnabled(bool expected_value) {
keyboard_brightness_control_delegate()
->HandleGetKeyboardAmbientLightSensorEnabled(base::BindLambdaForTesting(
[expected_value](std::optional<bool> sensor_enabled) {
EXPECT_EQ(sensor_enabled.value(), expected_value);
}));
}
void ExpectKeyboardBrightnessPercent(double expected_value) {
keyboard_brightness_control_delegate()->HandleGetKeyboardBrightness(
base::BindLambdaForTesting(
[expected_value](std::optional<double> keyboard_brightness) {
EXPECT_EQ(keyboard_brightness.value(), expected_value);
}));
}
void AdvanceClock(base::TimeDelta time) {
task_environment()->AdvanceClock(time);
}
protected:
base::RunLoop run_loop_;
std::unique_ptr<base::HistogramTester> histogram_tester_;
std::unique_ptr<FakeKeyboardBrightnessControlDelegate> delegate_;
};
TEST_F(KeyboardBrightnessControllerTest, RecordHasKeyboardBrightness) {
histogram_tester_->ExpectTotalCount("ChromeOS.Keyboard.HasBacklight", 0);
delegate_->OnReceiveHasKeyboardBacklight(std::optional<bool>(true));
histogram_tester_->ExpectTotalCount("ChromeOS.Keyboard.HasBacklight", 1);
}
TEST_F(KeyboardBrightnessControllerTest, RecordHasAmbientLightSensor) {
histogram_tester_->ExpectTotalCount(
"ChromeOS.Settings.Device.HasAmbientLightSensor", 0);
delegate_->OnReceiveHasAmbientLightSensor(std::optional<bool>(true));
histogram_tester_->ExpectTotalCount(
"ChromeOS.Settings.Device.HasAmbientLightSensor", 1);
}
TEST_F(KeyboardBrightnessControllerTest, SetKeyboardAmbientLightSensorEnabled) {
EXPECT_TRUE(power_manager_client()->keyboard_ambient_light_sensor_enabled());
keyboard_brightness_control_delegate()
->HandleSetKeyboardAmbientLightSensorEnabled(
false, KeyboardAmbientLightSensorEnabledChangeSource::kSettingsApp);
EXPECT_FALSE(power_manager_client()->keyboard_ambient_light_sensor_enabled());
keyboard_brightness_control_delegate()
->HandleGetKeyboardAmbientLightSensorEnabled(base::BindOnce(
[](std::optional<bool> is_ambient_light_sensor_enabled) {
EXPECT_FALSE(is_ambient_light_sensor_enabled.value());
}));
keyboard_brightness_control_delegate()
->HandleSetKeyboardAmbientLightSensorEnabled(
true, KeyboardAmbientLightSensorEnabledChangeSource::kSettingsApp);
EXPECT_TRUE(power_manager_client()->keyboard_ambient_light_sensor_enabled());
keyboard_brightness_control_delegate()
->HandleGetKeyboardAmbientLightSensorEnabled(base::BindOnce(
[](std::optional<bool> is_ambient_light_sensor_enabled) {
EXPECT_TRUE(is_ambient_light_sensor_enabled.value());
}));
}
TEST_F(KeyboardBrightnessControllerTest, SaveKeyboardALSPrefToKnownUser) {
power_manager::SetAmbientLightSensorEnabledRequest request;
request.set_sensor_enabled(true);
power_manager_client()->SetKeyboardAmbientLightSensorEnabled(request);
ClearLogin();
AccountId account_id = AccountId::FromUserEmail(kUserEmail);
user_manager::KnownUser known_user(local_state());
LoginScreenFocusAccount(account_id);
EXPECT_FALSE(
HasKeyboardAmbientLightSensorEnabledPrefValue(known_user, account_id));
SetKeyboardAmbientLightSensorEnabled(
false, power_manager::AmbientLightSensorChange_Cause::
AmbientLightSensorChange_Cause_USER_REQUEST_SETTINGS_APP);
EXPECT_TRUE(
HasKeyboardAmbientLightSensorEnabledPrefValue(known_user, account_id));
EXPECT_FALSE(
GetKeyboardAmbientLightSensorEnabledPrefValue(known_user, account_id));
}
TEST_F(KeyboardBrightnessControllerTest, SaveBrightnessPrefToKnownUserOnLogin) {
power_manager_client()->set_keyboard_brightness_percent(
kInitialKeyboardBrightness);
ClearLogin();
user_manager::KnownUser known_user(local_state());
AccountId account_id = AccountId::FromUserEmail(kUserEmail);
LoginScreenFocusAccount(account_id);
EXPECT_FALSE(
HasKeyboardAmbientLightSensorEnabledPrefValue(known_user, account_id));
SetKeyboardBrightness(
0.0, power_manager::BacklightBrightnessChange_Cause_USER_INACTIVITY);
EXPECT_FALSE(HasKeyboardBrightnessPrefValue(known_user, account_id));
SetKeyboardBrightness(
60.0, power_manager::BacklightBrightnessChange_Cause_USER_ACTIVITY);
EXPECT_FALSE(HasKeyboardBrightnessPrefValue(known_user, account_id));
double brightness_change_percent = 12.0;
SetKeyboardBrightness(
brightness_change_percent,
power_manager::BacklightBrightnessChange_Cause_USER_REQUEST);
EXPECT_TRUE(HasKeyboardBrightnessPrefValue(known_user, account_id));
EXPECT_EQ(GetKeyboardBrightnessPrefValue(known_user, account_id),
brightness_change_percent);
}
TEST_F(KeyboardBrightnessControllerTest,
SaveBrightnessPrefToKnownUserAfterLogin) {
power_manager_client()->set_keyboard_brightness_percent(
kInitialKeyboardBrightness);
ClearLogin();
user_manager::KnownUser known_user(local_state());
AccountId account_id = AccountId::FromUserEmail(kUserEmail);
LoginScreenFocusAccount(account_id);
EXPECT_FALSE(HasKeyboardBrightnessPrefValue(known_user, account_id));
SimulateUserLogin({kUserEmail});
run_loop_.RunUntilIdle();
EXPECT_TRUE(HasKeyboardBrightnessPrefValue(known_user, account_id));
EXPECT_EQ(GetKeyboardBrightnessPrefValue(known_user, account_id),
kInitialKeyboardBrightness);
SetKeyboardBrightness(
0.0, power_manager::BacklightBrightnessChange_Cause_USER_INACTIVITY);
EXPECT_EQ(GetKeyboardBrightnessPrefValue(known_user, account_id),
kInitialKeyboardBrightness);
double new_brightness_change_percent = 96.0;
SetKeyboardBrightness(
new_brightness_change_percent,
power_manager::BacklightBrightnessChange_Cause_USER_REQUEST);
EXPECT_TRUE(HasKeyboardBrightnessPrefValue(known_user, account_id));
EXPECT_EQ(GetKeyboardBrightnessPrefValue(known_user, account_id),
new_brightness_change_percent);
double settings_brightness_change_percent = 22.2;
SetKeyboardBrightness(
settings_brightness_change_percent,
power_manager::
BacklightBrightnessChange_Cause_USER_REQUEST_FROM_SETTINGS_APP);
EXPECT_EQ(GetKeyboardBrightnessPrefValue(known_user, account_id),
settings_brightness_change_percent);
}
TEST_F(KeyboardBrightnessControllerTest,
Prefs_OnLogin_DoNotSaveBrightnessWhenLidClosed) {
power_manager_client()->set_screen_brightness_percent(
kInitialKeyboardBrightness);
ClearLogin();
user_manager::KnownUser known_user(local_state());
AccountId account_id = AccountId::FromUserEmail(kUserEmail);
LoginScreenFocusAccount(account_id);
EXPECT_FALSE(HasKeyboardBrightnessPrefValue(known_user, account_id));
KeyboardBrightnessController* controller =
static_cast<KeyboardBrightnessController*>(
keyboard_brightness_control_delegate());
{
power_manager_client()->set_keyboard_brightness_percent(0.0);
controller->LidEventReceived(chromeos::PowerManagerClient::LidState::CLOSED,
base::TimeTicks::Now());
controller->OnActiveUserSessionChanged(account_id);
run_loop_.RunUntilIdle();
EXPECT_FALSE(HasKeyboardBrightnessPrefValue(known_user, account_id))
<< "Brightness should not be saved to preferences when lid is closed";
}
{
power_manager_client()->set_keyboard_brightness_percent(60.0);
controller->LidEventReceived(chromeos::PowerManagerClient::LidState::OPEN,
base::TimeTicks::Now());
controller->OnActiveUserSessionChanged(account_id);
run_loop_.RunUntilIdle();
EXPECT_TRUE(HasKeyboardBrightnessPrefValue(known_user, account_id))
<< "Brightness should be saved to preferences when lid is open";
}
}
TEST_F(KeyboardBrightnessControllerTest, SavePrefToKnownUserMultipleUser) {
power_manager_client()->set_screen_brightness_percent(
kInitialKeyboardBrightness);
ClearLogin();
AccountId first_account = AccountId::FromUserEmail(kUserEmail);
AccountId second_account = AccountId::FromUserEmail(kUserEmailSecondary);
LoginScreenFocusAccount(first_account);
user_manager::KnownUser known_user(local_state());
EXPECT_FALSE(HasKeyboardBrightnessPrefValue(known_user, first_account));
EXPECT_FALSE(HasKeyboardBrightnessPrefValue(known_user, second_account));
double first_brightness_change_percent = 12.0;
SetKeyboardBrightness(
first_brightness_change_percent,
power_manager::BacklightBrightnessChange_Cause_USER_REQUEST);
EXPECT_EQ(GetKeyboardBrightnessPrefValue(known_user, first_account),
first_brightness_change_percent);
EXPECT_FALSE(HasKeyboardBrightnessPrefValue(known_user, second_account));
LoginScreenFocusAccount(second_account);
double second_brightness_change_percent = 99.9;
SetKeyboardBrightness(
second_brightness_change_percent,
power_manager::BacklightBrightnessChange_Cause_USER_REQUEST);
EXPECT_EQ(GetKeyboardBrightnessPrefValue(known_user, second_account),
second_brightness_change_percent);
EXPECT_EQ(GetKeyboardBrightnessPrefValue(known_user, first_account),
first_brightness_change_percent);
}
TEST_F(KeyboardBrightnessControllerTest,
RestoreKeyboardBrightnessSettings) {
power_manager::SetAmbientLightSensorEnabledRequest request;
request.set_sensor_enabled(true);
power_manager_client()->SetKeyboardAmbientLightSensorEnabled(request);
power_manager_client()->set_keyboard_brightness_percent(
kInitialKeyboardBrightness);
ClearLogin();
AccountId first_account = AccountId::FromUserEmail(kUserEmail);
LoginScreenFocusAccount(first_account);
ExpectKeyboardAmbientLightSensorEnabled(true);
ExpectKeyboardBrightnessPercent(kInitialKeyboardBrightness);
AccountId second_account = AccountId::FromUserEmail(kUserEmailSecondary);
LoginScreenFocusAccount(second_account);
ExpectKeyboardAmbientLightSensorEnabled(true);
ExpectKeyboardBrightnessPercent(kInitialKeyboardBrightness);
LoginScreenFocusAccount(first_account);
const double first_brightness_change_percent = 20.0;
keyboard_brightness_control_delegate()->HandleSetKeyboardBrightness(
first_brightness_change_percent, false,
KeyboardBrightnessChangeSource::kSettingsApp);
run_loop_.RunUntilIdle();
ExpectKeyboardAmbientLightSensorEnabled(false);
ExpectKeyboardBrightnessPercent(first_brightness_change_percent);
LoginScreenFocusAccount(second_account);
ExpectKeyboardAmbientLightSensorEnabled(true);
ExpectKeyboardBrightnessPercent(first_brightness_change_percent);
LoginScreenFocusAccount(first_account);
ExpectKeyboardAmbientLightSensorEnabled(false);
ExpectKeyboardBrightnessPercent(first_brightness_change_percent);
ClearLogin();
power_manager::SetAmbientLightSensorEnabledRequest request2;
request2.set_sensor_enabled(true);
power_manager_client()->SetKeyboardAmbientLightSensorEnabled(request2);
power_manager_client()->set_screen_brightness_percent(
kInitialKeyboardBrightness);
LoginScreenFocusAccount(first_account);
ExpectKeyboardAmbientLightSensorEnabled(false);
ExpectKeyboardBrightnessPercent(first_brightness_change_percent);
LoginScreenFocusAccount(second_account);
ExpectKeyboardAmbientLightSensorEnabled(true);
ExpectKeyboardBrightnessPercent(first_brightness_change_percent);
LoginScreenFocusAccount(first_account);
ExpectKeyboardAmbientLightSensorEnabled(false);
ExpectKeyboardBrightnessPercent(first_brightness_change_percent);
}
TEST_F(KeyboardBrightnessControllerTest, KeyboardALSDisabledReasonPref) {
power_manager::SetAmbientLightSensorEnabledRequest request;
request.set_sensor_enabled(true);
power_manager_client()->SetKeyboardAmbientLightSensorEnabled(request);
power_manager_client()->set_keyboard_brightness_percent(
kInitialKeyboardBrightness);
AccountId account_id = AccountId::FromUserEmail(kUserEmail);
login_data_dispatcher()->NotifyFocusPod(account_id);
user_manager::KnownUser known_user(local_state());
EXPECT_FALSE(HasKeyboardAmbientLightSensorDisabledReasonPrefValue(
known_user, account_id));
SetKeyboardAmbientLightSensorEnabled(
false,
power_manager::AmbientLightSensorChange_Cause_USER_REQUEST_SETTINGS_APP);
EXPECT_TRUE(HasKeyboardAmbientLightSensorDisabledReasonPrefValue(known_user,
account_id));
EXPECT_EQ(
power_manager::AmbientLightSensorChange_Cause_USER_REQUEST_SETTINGS_APP,
GetKeyboardAmbientLightSensorDisabledReasonPrefValue(known_user,
account_id));
SetKeyboardAmbientLightSensorEnabled(
true,
power_manager::AmbientLightSensorChange_Cause_USER_REQUEST_SETTINGS_APP);
EXPECT_FALSE(HasKeyboardAmbientLightSensorDisabledReasonPrefValue(
known_user, account_id));
SetKeyboardAmbientLightSensorEnabled(
false,
power_manager::AmbientLightSensorChange_Cause_BRIGHTNESS_USER_REQUEST);
EXPECT_TRUE(HasKeyboardAmbientLightSensorDisabledReasonPrefValue(known_user,
account_id));
EXPECT_EQ(
power_manager::AmbientLightSensorChange_Cause_BRIGHTNESS_USER_REQUEST,
GetKeyboardAmbientLightSensorDisabledReasonPrefValue(known_user,
account_id));
}
TEST_F(KeyboardBrightnessControllerTest, KeyboardAmbientLightEnabledUserPref) {
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::ACTIVE);
power_manager::SetAmbientLightSensorEnabledRequest request;
request.set_sensor_enabled(true);
power_manager_client()->SetKeyboardAmbientLightSensorEnabled(request);
run_loop_.RunUntilIdle();
EXPECT_TRUE(
Shell::Get()->session_controller()->GetActivePrefService()->GetBoolean(
prefs::kKeyboardAmbientLightSensorLastEnabled));
SetKeyboardAmbientLightSensorEnabled(
false, power_manager::AmbientLightSensorChange_Cause::
AmbientLightSensorChange_Cause_BRIGHTNESS_USER_REQUEST);
EXPECT_TRUE(
Shell::Get()->session_controller()->GetActivePrefService()->GetBoolean(
prefs::kKeyboardAmbientLightSensorLastEnabled));
SetKeyboardAmbientLightSensorEnabled(
true, power_manager::AmbientLightSensorChange_Cause::
AmbientLightSensorChange_Cause_USER_REQUEST_SETTINGS_APP);
EXPECT_TRUE(
Shell::Get()->session_controller()->GetActivePrefService()->GetBoolean(
prefs::kKeyboardAmbientLightSensorLastEnabled));
SetKeyboardAmbientLightSensorEnabled(
false, power_manager::AmbientLightSensorChange_Cause::
AmbientLightSensorChange_Cause_USER_REQUEST_SETTINGS_APP);
EXPECT_FALSE(
Shell::Get()->session_controller()->GetActivePrefService()->GetBoolean(
prefs::kKeyboardAmbientLightSensorLastEnabled));
SetKeyboardAmbientLightSensorEnabled(
true, power_manager::AmbientLightSensorChange_Cause::
AmbientLightSensorChange_Cause_USER_REQUEST_SETTINGS_APP);
EXPECT_TRUE(
Shell::Get()->session_controller()->GetActivePrefService()->GetBoolean(
prefs::kKeyboardAmbientLightSensorLastEnabled));
}
TEST_F(KeyboardBrightnessControllerTest,
RestoreKeyboardALSSettingForNewUser) {
power_manager::SetAmbientLightSensorEnabledRequest request;
request.set_sensor_enabled(true);
power_manager_client()->SetKeyboardAmbientLightSensorEnabled(request);
power_manager_client()->set_keyboard_brightness_percent(
kInitialKeyboardBrightness);
run_loop_.RunUntilIdle();
ClearLogin();
AccountId account_id = AccountId::FromUserEmail(kUserEmail);
login_data_dispatcher()->NotifyFocusPod(account_id);
LoginScreenFocusAccount(account_id);
SimulateUserLogin({kUserEmail});
EXPECT_TRUE(
Shell::Get()->session_controller()->GetActivePrefService()->GetBoolean(
prefs::kKeyboardAmbientLightSensorLastEnabled));
ExpectKeyboardAmbientLightSensorEnabled(true);
SetKeyboardAmbientLightSensorEnabled(
false,
power_manager::AmbientLightSensorChange_Cause_USER_REQUEST_SETTINGS_APP);
EXPECT_FALSE(
Shell::Get()->session_controller()->GetActivePrefService()->GetBoolean(
prefs::kKeyboardAmbientLightSensorLastEnabled));
ExpectKeyboardAmbientLightSensorEnabled(false);
ClearLogin();
request.set_sensor_enabled(true);
power_manager_client()->SetKeyboardAmbientLightSensorEnabled(request);
power_manager_client()->set_keyboard_brightness_percent(
kInitialKeyboardBrightness);
SimulateNewUserFirstLogin(kUserEmailSecondary);
EXPECT_TRUE(
Shell::Get()->session_controller()->GetActivePrefService()->GetBoolean(
prefs::kKeyboardAmbientLightSensorLastEnabled));
ExpectKeyboardAmbientLightSensorEnabled(true);
Shell::Get()->session_controller()->GetActivePrefService()->SetBoolean(
prefs::kKeyboardAmbientLightSensorLastEnabled, false);
SimulateNewUserFirstLogin(kUserEmail);
EXPECT_FALSE(
Shell::Get()->session_controller()->GetActivePrefService()->GetBoolean(
prefs::kKeyboardAmbientLightSensorLastEnabled));
ExpectKeyboardAmbientLightSensorEnabled(false);
}
TEST_F(KeyboardBrightnessControllerTest, SetKeyboardBrightness_Cause) {
keyboard_brightness_control_delegate()->HandleSetKeyboardBrightness(
50, true, KeyboardBrightnessChangeSource::kQuickSettings);
EXPECT_EQ(power_manager_client()->requested_keyboard_brightness_cause(),
power_manager::SetBacklightBrightnessRequest_Cause_USER_REQUEST);
keyboard_brightness_control_delegate()->HandleSetKeyboardBrightness(
50, true,
KeyboardBrightnessChangeSource::kSettingsApp);
EXPECT_EQ(
power_manager_client()->requested_keyboard_brightness_cause(),
power_manager::
SetBacklightBrightnessRequest_Cause_USER_REQUEST_FROM_SETTINGS_APP);
}
TEST_F(KeyboardBrightnessControllerTest,
ReenableKeyboardAmbientLightSensor_Reboot_DisabledFromSettingsApp) {
power_manager::SetAmbientLightSensorEnabledRequest request;
request.set_sensor_enabled(true);
power_manager_client()->SetKeyboardAmbientLightSensorEnabled(request);
power_manager_client()->set_keyboard_brightness_percent(
kInitialKeyboardBrightness);
run_loop_.RunUntilIdle();
ClearLogin();
user_manager::KnownUser known_user(local_state());
AccountId account_id = SimulateUserLogin({kUserEmail});
SetKeyboardAmbientLightSensorEnabled(
false,
power_manager::AmbientLightSensorChange_Cause_USER_REQUEST_SETTINGS_APP);
known_user.SetPath(
account_id, prefs::kKeyboardAmbientLightSensorDisabledReason,
std::make_optional<base::Value>(
power_manager::
AmbientLightSensorChange_Cause_USER_REQUEST_SETTINGS_APP));
ExpectKeyboardAmbientLightSensorEnabled(false);
EXPECT_EQ(false, GetKeyboardAmbientLightSensorEnabledPrefValue(known_user,
account_id));
EXPECT_TRUE(HasKeyboardAmbientLightSensorDisabledReasonPrefValue(known_user,
account_id));
EXPECT_EQ(
power_manager::AmbientLightSensorChange_Cause_USER_REQUEST_SETTINGS_APP,
GetKeyboardAmbientLightSensorDisabledReasonPrefValue(known_user,
account_id));
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::LOGIN_PRIMARY);
known_user.SetPath(account_id, prefs::kKeyboardBrightnessPercent,
std::make_optional<base::Value>(30.0));
login_data_dispatcher()->NotifyFocusPod(account_id);
ExpectKeyboardAmbientLightSensorEnabled(false);
ExpectKeyboardBrightnessPercent(30.0);
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::LOGIN_PRIMARY);
login_data_dispatcher()->NotifyFocusPod(account_id);
ExpectKeyboardAmbientLightSensorEnabled(false);
ExpectKeyboardBrightnessPercent(30.0);
}
TEST_F(KeyboardBrightnessControllerTest,
ReenableKeyboardAmbientLightSensor_Reboot_DisabledFromBrightnessKey) {
power_manager::SetAmbientLightSensorEnabledRequest request;
request.set_sensor_enabled(true);
power_manager_client()->SetKeyboardAmbientLightSensorEnabled(request);
power_manager_client()->set_keyboard_brightness_percent(
kInitialKeyboardBrightness);
run_loop_.RunUntilIdle();
ClearLogin();
user_manager::KnownUser known_user(local_state());
AccountId account_id = SimulateUserLogin({kUserEmail});
SetKeyboardAmbientLightSensorEnabled(
false,
power_manager::AmbientLightSensorChange_Cause_BRIGHTNESS_USER_REQUEST);
known_user.SetPath(
account_id, prefs::kKeyboardAmbientLightSensorDisabledReason,
std::make_optional<base::Value>(
power_manager::
AmbientLightSensorChange_Cause_BRIGHTNESS_USER_REQUEST));
ExpectKeyboardAmbientLightSensorEnabled(false);
EXPECT_EQ(false, GetKeyboardAmbientLightSensorEnabledPrefValue(known_user,
account_id));
EXPECT_TRUE(HasKeyboardAmbientLightSensorDisabledReasonPrefValue(known_user,
account_id));
EXPECT_EQ(
power_manager::AmbientLightSensorChange_Cause_BRIGHTNESS_USER_REQUEST,
GetKeyboardAmbientLightSensorDisabledReasonPrefValue(known_user,
account_id));
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::LOGIN_PRIMARY);
known_user.SetPath(account_id, prefs::kKeyboardBrightnessPercent,
std::make_optional<base::Value>(30.0));
login_data_dispatcher()->NotifyFocusPod(account_id);
ExpectKeyboardAmbientLightSensorEnabled(true);
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::LOGIN_PRIMARY);
login_data_dispatcher()->NotifyFocusPod(account_id);
ExpectKeyboardAmbientLightSensorEnabled(true);
}
TEST_F(KeyboardBrightnessControllerTest,
BrightnessSettingsUnchanged_DeviceLocked) {
power_manager::SetAmbientLightSensorEnabledRequest request;
request.set_sensor_enabled(true);
power_manager_client()->SetKeyboardAmbientLightSensorEnabled(request);
power_manager_client()->set_keyboard_brightness_percent(
kInitialKeyboardBrightness);
run_loop_.RunUntilIdle();
ClearLogin();
user_manager::KnownUser known_user(local_state());
AccountId account_id = SimulateUserLogin({kUserEmail});
SetKeyboardAmbientLightSensorEnabled(
false,
power_manager::AmbientLightSensorChange_Cause_BRIGHTNESS_USER_REQUEST);
ExpectKeyboardAmbientLightSensorEnabled(false);
ExpectKeyboardBrightnessPercent(kInitialKeyboardBrightness);
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::ACTIVE);
login_data_dispatcher()->NotifyFocusPod(account_id);
ExpectKeyboardAmbientLightSensorEnabled(false);
ExpectKeyboardBrightnessPercent(kInitialKeyboardBrightness);
}
TEST_F(KeyboardBrightnessControllerTest, RestoreBrightnessSettings_NoSensor) {
power_manager::SetAmbientLightSensorEnabledRequest request;
request.set_sensor_enabled(true);
power_manager_client()->SetKeyboardAmbientLightSensorEnabled(request);
power_manager_client()->set_keyboard_brightness_percent(
kInitialKeyboardBrightness);
run_loop_.RunUntilIdle();
ClearLogin();
user_manager::KnownUser known_user(local_state());
AccountId account_id = SimulateUserLogin({kUserEmail});
SetKeyboardAmbientLightSensorEnabled(
false,
power_manager::AmbientLightSensorChange_Cause_BRIGHTNESS_USER_REQUEST);
ExpectKeyboardAmbientLightSensorEnabled(false);
power_manager_client()->set_has_ambient_light_sensor(false);
power_manager_client()->set_has_keyboard_backlight(true);
auto controller = std::make_unique<KeyboardBrightnessController>(
local_state(), Shell::Get()->session_controller());
run_loop_.RunUntilIdle();
known_user.SetPath(
account_id, prefs::kKeyboardAmbientLightSensorDisabledReason,
std::make_optional<base::Value>(
power_manager::
AmbientLightSensorChange_Cause_BRIGHTNESS_USER_REQUEST));
known_user.SetPath(account_id, prefs::kKeyboardBrightnessPercent,
std::make_optional<base::Value>(30.0));
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::LOGIN_PRIMARY);
login_data_dispatcher()->NotifyFocusPod(account_id);
ExpectKeyboardAmbientLightSensorEnabled(false);
ExpectKeyboardBrightnessPercent(30.0);
}
TEST_F(KeyboardBrightnessControllerTest, RestoreBrightnessSettings_HasSensor) {
power_manager::SetAmbientLightSensorEnabledRequest request;
request.set_sensor_enabled(true);
power_manager_client()->SetKeyboardAmbientLightSensorEnabled(request);
power_manager_client()->set_keyboard_brightness_percent(
kInitialKeyboardBrightness);
run_loop_.RunUntilIdle();
ClearLogin();
user_manager::KnownUser known_user(local_state());
AccountId account_id = SimulateUserLogin({kUserEmail});
SetKeyboardAmbientLightSensorEnabled(
false,
power_manager::AmbientLightSensorChange_Cause_BRIGHTNESS_USER_REQUEST);
ExpectKeyboardAmbientLightSensorEnabled(false);
power_manager_client()->set_has_ambient_light_sensor(true);
power_manager_client()->set_has_keyboard_backlight(true);
auto controller = std::make_unique<KeyboardBrightnessController>(
local_state(), Shell::Get()->session_controller());
run_loop_.RunUntilIdle();
known_user.SetPath(
account_id, prefs::kKeyboardAmbientLightSensorDisabledReason,
std::make_optional<base::Value>(
power_manager::
AmbientLightSensorChange_Cause_BRIGHTNESS_USER_REQUEST));
known_user.SetPath(account_id, prefs::kKeyboardBrightnessPercent,
std::make_optional<base::Value>(30.0));
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::LOGIN_PRIMARY);
LoginScreenFocusAccount(account_id);
ExpectKeyboardAmbientLightSensorEnabled(true);
ExpectKeyboardBrightnessPercent(kInitialKeyboardBrightness);
}
TEST_F(KeyboardBrightnessControllerTest,
RecordStartupKeyboardAmbientLightSensorStatus) {
histogram_tester_->ExpectTotalCount(
"ChromeOS.Keyboard.Startup.AmbientLightSensorEnabled", 0);
power_manager::SetAmbientLightSensorEnabledRequest request;
request.set_sensor_enabled(true);
power_manager_client()->SetKeyboardAmbientLightSensorEnabled(request);
power_manager_client()->set_has_ambient_light_sensor(true);
base::RunLoop().RunUntilIdle();
ClearLogin();
AccountId account_id = AccountId::FromUserEmail({kUserEmail});
LoginScreenFocusAccount(account_id);
histogram_tester_->ExpectBucketCount(
"ChromeOS.Keyboard.Startup.AmbientLightSensorEnabled", true, 1);
ClearLogin();
LoginScreenFocusAccount(account_id);
histogram_tester_->ExpectTotalCount(
"ChromeOS.Keyboard.Startup.AmbientLightSensorEnabled", 1);
}
TEST_F(KeyboardBrightnessControllerTest,
HistogramTest_DecreaseBrightnessOnLoginScreen) {
histogram_tester_->ExpectTotalCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.OnLoginScreen."
"DecreaseBrightness.BatteryPower",
0);
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::LOGIN_PRIMARY);
SetBatteryPower();
int seconds_to_wait = 11;
AdvanceClock(base::Seconds(seconds_to_wait));
keyboard_brightness_control_delegate()->HandleKeyboardBrightnessDown();
histogram_tester_->ExpectTotalCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.OnLoginScreen."
"DecreaseBrightness.BatteryPower",
1);
histogram_tester_->ExpectTimeBucketCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.OnLoginScreen."
"DecreaseBrightness.BatteryPower",
base::Seconds(seconds_to_wait), 1);
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::ACTIVE);
AdvanceClock(base::Seconds(5));
keyboard_brightness_control_delegate()->HandleKeyboardBrightnessDown();
histogram_tester_->ExpectTotalCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.OnLoginScreen."
"DecreaseBrightness.BatteryPower",
1);
}
TEST_F(KeyboardBrightnessControllerTest, HistogramTest_LoginSecondary) {
histogram_tester_->ExpectTotalCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.OnLoginScreen."
"DecreaseBrightness.BatteryPower",
0);
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::LOGIN_SECONDARY);
SetBatteryPower();
int seconds_to_wait = 22;
AdvanceClock(base::Seconds(seconds_to_wait));
keyboard_brightness_control_delegate()->HandleKeyboardBrightnessDown();
histogram_tester_->ExpectTotalCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.OnLoginScreen."
"DecreaseBrightness.BatteryPower",
1);
histogram_tester_->ExpectTimeBucketCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.OnLoginScreen."
"DecreaseBrightness.BatteryPower",
base::Seconds(seconds_to_wait), 1);
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::ACTIVE);
AdvanceClock(base::Seconds(5));
keyboard_brightness_control_delegate()->HandleKeyboardBrightnessDown();
histogram_tester_->ExpectTotalCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.OnLoginScreen."
"DecreaseBrightness.BatteryPower",
1);
}
TEST_F(KeyboardBrightnessControllerTest, HistogramTest_PowerSourceCharger) {
histogram_tester_->ExpectTotalCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.OnLoginScreen."
"IncreaseBrightness.ChargerPower",
0);
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::LOGIN_PRIMARY);
SetChargerPower();
int seconds_to_wait = 8;
AdvanceClock(base::Seconds(seconds_to_wait));
keyboard_brightness_control_delegate()->HandleKeyboardBrightnessUp();
histogram_tester_->ExpectTotalCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.OnLoginScreen."
"IncreaseBrightness.ChargerPower",
1);
histogram_tester_->ExpectTimeBucketCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.OnLoginScreen."
"IncreaseBrightness.ChargerPower",
base::Seconds(seconds_to_wait), 1);
}
TEST_F(KeyboardBrightnessControllerTest,
HistogramTest_BrightnessChangeAfterLogin) {
histogram_tester_->ExpectTotalCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.AfterLogin."
"SetBrightness.ChargerPower",
0);
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::LOGIN_PRIMARY);
SetChargerPower();
AdvanceClock(base::Seconds(9));
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::ACTIVE);
int seconds_to_wait = 5;
AdvanceClock(base::Seconds(seconds_to_wait));
keyboard_brightness_control_delegate()->HandleSetKeyboardBrightness(
50, true, KeyboardBrightnessChangeSource::kSettingsApp);
histogram_tester_->ExpectTimeBucketCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.AfterLogin."
"SetBrightness.ChargerPower",
base::Seconds(seconds_to_wait), 1);
}
TEST_F(KeyboardBrightnessControllerTest,
HistogramTest_BrightnessChangeAfterLogin_LongDuration) {
histogram_tester_->ExpectTotalCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.AfterLogin."
"IncreaseBrightness.BatteryPower",
0);
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::LOGIN_PRIMARY);
SetBatteryPower();
AdvanceClock(base::Seconds(20));
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::ACTIVE);
int minutes_to_wait = 35;
AdvanceClock(base::Minutes(minutes_to_wait));
keyboard_brightness_control_delegate()->HandleKeyboardBrightnessUp();
histogram_tester_->ExpectTotalCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.AfterLogin."
"IncreaseBrightness.BatteryPower",
1);
histogram_tester_->ExpectTimeBucketCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.AfterLogin."
"IncreaseBrightness.BatteryPower",
base::Minutes(minutes_to_wait), 1);
}
TEST_F(KeyboardBrightnessControllerTest,
HistogramTest_BrightnessChangeAfterLogin_DurationGreaterThanOneHour) {
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::LOGIN_PRIMARY);
SetBatteryPower();
AdvanceClock(base::Seconds(1));
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::ACTIVE);
AdvanceClock(base::Hours(1) + base::Minutes(5));
keyboard_brightness_control_delegate()->HandleKeyboardBrightnessUp();
histogram_tester_->ExpectTotalCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.AfterLogin."
"IncreaseBrightness.BatteryPower",
0);
}
TEST_F(KeyboardBrightnessControllerTest,
HistogramTest_SetBrightnessAfterSystemRestoration) {
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::LOGIN_PRIMARY);
SetBatteryPower();
histogram_tester_->ExpectTotalCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.OnLogin."
"SetBrightness.BatteryPower",
0);
histogram_tester_->ExpectTotalCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.AfterLogin."
"SetBrightness.BatteryPower",
0);
ClearLogin();
user_manager::KnownUser known_user(local_state());
AccountId account_id = SimulateUserLogin({kUserEmail});
known_user.SetPath(account_id, prefs::kKeyboardBrightnessPercent,
std::make_optional<base::Value>(30.0));
login_data_dispatcher()->NotifyFocusPod(account_id);
histogram_tester_->ExpectTotalCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.OnLogin."
"SetBrightness.BatteryPower",
0);
histogram_tester_->ExpectTotalCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.AfterLogin."
"SetBrightness.BatteryPower",
0);
int seconds_to_wait = 5;
AdvanceClock(base::Seconds(seconds_to_wait));
keyboard_brightness_control_delegate()->HandleSetKeyboardBrightness(
50, true, KeyboardBrightnessChangeSource::kSettingsApp);
histogram_tester_->ExpectTimeBucketCount(
"ChromeOS.Keyboard.TimeUntilFirstBrightnessChange.AfterLogin."
"SetBrightness.BatteryPower",
base::Seconds(seconds_to_wait), 1);
}
}