#ifndef CHROME_BROWSER_ASH_POWER_ML_ADAPTIVE_SCREEN_BRIGHTNESS_MANAGER_H_
#define CHROME_BROWSER_ASH_POWER_ML_ADAPTIVE_SCREEN_BRIGHTNESS_MANAGER_H_
#include <memory>
#include <optional>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "base/time/time.h"
#include "chrome/browser/ash/power/ml/boot_clock.h"
#include "chrome/browser/ash/power/ml/screen_brightness_event.pb.h"
#include "chromeos/dbus/power/power_manager_client.h"
#include "chromeos/dbus/power_manager/power_supply_properties.pb.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "services/viz/public/mojom/compositing/video_detector_observer.mojom.h"
#include "ui/base/user_activity/user_activity_detector.h"
#include "ui/base/user_activity/user_activity_observer.h"
namespace base {
class RepeatingTimer;
}
namespace ash {
class AccessibilityManager;
class MagnificationManager;
namespace power {
namespace ml {
class AdaptiveScreenBrightnessUkmLogger;
class RecentEventsCounter;
class AdaptiveScreenBrightnessManager
: public ui::UserActivityObserver,
public chromeos::PowerManagerClient::Observer,
public viz::mojom::VideoDetectorObserver {
public:
static constexpr base::TimeDelta kInactivityDuration = base::Seconds(20);
static constexpr base::TimeDelta kLoggingInterval = base::Minutes(10);
AdaptiveScreenBrightnessManager(
std::unique_ptr<AdaptiveScreenBrightnessUkmLogger> ukm_logger,
ui::UserActivityDetector* detector,
chromeos::PowerManagerClient* power_manager_client,
AccessibilityManager* accessibility_manager,
MagnificationManager* magnification_manager,
mojo::PendingReceiver<viz::mojom::VideoDetectorObserver> receiver,
std::unique_ptr<base::RepeatingTimer> periodic_timer);
AdaptiveScreenBrightnessManager(const AdaptiveScreenBrightnessManager&) =
delete;
AdaptiveScreenBrightnessManager& operator=(
const AdaptiveScreenBrightnessManager&) = delete;
~AdaptiveScreenBrightnessManager() override;
static std::unique_ptr<AdaptiveScreenBrightnessManager> CreateInstance();
void OnUserActivity(const ui::Event* event) override;
void ScreenBrightnessChanged(
const power_manager::BacklightBrightnessChange& change) override;
void PowerChanged(const power_manager::PowerSupplyProperties& proto) override;
void LidEventReceived(chromeos::PowerManagerClient::LidState state,
base::TimeTicks timestamp) override;
void TabletModeEventReceived(chromeos::PowerManagerClient::TabletMode mode,
base::TimeTicks timestamp) override;
void OnVideoActivityStarted() override;
void OnVideoActivityEnded() override;
private:
friend class AdaptiveScreenBrightnessManagerTest;
void OnTimerFired();
void OnReceiveSwitchStates(
std::optional<chromeos::PowerManagerClient::SwitchStates> switch_states);
void OnReceiveScreenBrightnessPercent(
std::optional<double> screen_brightness_percent);
const std::optional<int> GetNightLightTemperaturePercent() const;
void LogEvent();
BootClock boot_clock_;
const std::unique_ptr<base::RepeatingTimer> periodic_timer_;
const std::unique_ptr<AdaptiveScreenBrightnessUkmLogger> ukm_logger_;
base::ScopedObservation<ui::UserActivityDetector, ui::UserActivityObserver>
user_activity_observation_{this};
base::ScopedObservation<chromeos::PowerManagerClient,
chromeos::PowerManagerClient::Observer>
power_manager_client_observation_{this};
const raw_ptr<AccessibilityManager> accessibility_manager_;
const raw_ptr<MagnificationManager> magnification_manager_;
const mojo::Receiver<viz::mojom::VideoDetectorObserver> receiver_;
const std::unique_ptr<RecentEventsCounter> mouse_counter_;
const std::unique_ptr<RecentEventsCounter> key_counter_;
const std::unique_ptr<RecentEventsCounter> stylus_counter_;
const std::unique_ptr<RecentEventsCounter> touch_counter_;
chromeos::PowerManagerClient::LidState lid_state_ =
chromeos::PowerManagerClient::LidState::NOT_PRESENT;
chromeos::PowerManagerClient::TabletMode tablet_mode_ =
chromeos::PowerManagerClient::TabletMode::UNSUPPORTED;
std::optional<power_manager::PowerSupplyProperties::ExternalPower>
external_power_;
std::optional<float> battery_percent_;
std::optional<double> screen_brightness_percent_;
std::optional<double> previous_screen_brightness_percent_;
std::optional<base::TimeDelta> last_event_time_since_boot_;
std::optional<base::TimeDelta> last_activity_time_since_boot_;
std::optional<base::TimeDelta> start_activity_time_since_boot_;
std::optional<bool> is_video_playing_;
std::optional<ScreenBrightnessEvent_Event_Reason> reason_;
base::WeakPtrFactory<AdaptiveScreenBrightnessManager> weak_ptr_factory_{this};
};
}
}
}
#endif