// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/display/display_performance_mode_controller.h"
namespace ash {
using ModeState = DisplayPerformanceModeController::ModeState;
DisplayPerformanceModeController::DisplayPerformanceModeController()
: power_status_(PowerStatus::Get()->GetWeakPtr()) {
power_status_->AddObserver(this);
}
DisplayPerformanceModeController::~DisplayPerformanceModeController() {
if (power_status_) {
power_status_->RemoveObserver(this);
}
}
ModeState DisplayPerformanceModeController::AddObserver(Observer* observer) {
observers_.AddObserver(observer);
return current_state_;
}
void DisplayPerformanceModeController::RemoveObserver(Observer* observer) {
observers_.RemoveObserver(observer);
}
void DisplayPerformanceModeController::OnPowerStatusChanged() {
UpdateCurrentStateAndNotifyIfChanged();
}
void DisplayPerformanceModeController::SetHighPerformanceModeByUser(
bool is_high_performance_enabled) {
is_high_performance_enabled_ = is_high_performance_enabled;
UpdateCurrentStateAndNotifyIfChanged();
}
void DisplayPerformanceModeController::UpdateCurrentStateAndNotifyIfChanged() {
// Implementation Logic:
// 1. If the user has enabled the high performance mode in the UI, then the
// display features should be in the high performance mode regardless of
// the power status.
// 2. If the user has not enabled the high performance mode in the UI, then
// the display features should be in the power saver mode if the power
// status is in battery saver mode.
// 3. If the user has not enabled the high performance mode in the UI, then
// the display features should be in the intelligent mode if the power
// status is not in battery saver mode.
ModeState new_state = ModeState::kIntelligent;
if (is_high_performance_enabled_) {
new_state = ModeState::kHighPerformance;
} else if (PowerStatus::Get()->IsBatterySaverActive()) {
new_state = ModeState::kPowerSaver;
}
if (new_state != current_state_) {
current_state_ = new_state;
NotifyObservers();
}
}
void DisplayPerformanceModeController::NotifyObservers() {
for (Observer& observer : observers_) {
observer.OnDisplayPerformanceModeChanged(current_state_);
}
}
} // namespace ash