#ifndef ASH_SYSTEM_HUMAN_PRESENCE_HUMAN_PRESENCE_ORIENTATION_CONTROLLER_H_
#define ASH_SYSTEM_HUMAN_PRESENCE_HUMAN_PRESENCE_ORIENTATION_CONTROLLER_H_
#include "ash/ash_export.h"
#include "ash/public/cpp/tablet_mode_observer.h"
#include "ash/wm/tablet_mode/tablet_mode_controller.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "chromeos/dbus/power/power_manager_client.h"
#include "ui/display/display.h"
#include "ui/display/display_observer.h"
namespace ash {
class ASH_EXPORT HumanPresenceOrientationController
: public TabletModeObserver,
public display::DisplayObserver,
public chromeos::PowerManagerClient::Observer {
public:
class Observer : public base::CheckedObserver {
public:
~Observer() override = default;
virtual void OnOrientationChanged(bool suitable_for_hps) = 0;
};
HumanPresenceOrientationController();
HumanPresenceOrientationController(
const HumanPresenceOrientationController& other) = delete;
HumanPresenceOrientationController& operator=(
const HumanPresenceOrientationController& other) = delete;
~HumanPresenceOrientationController() override;
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
bool IsOrientationSuitable() const;
private:
void OnTabletPhysicalStateChanged() override;
void OnDisplayMetricsChanged(const display::Display& display,
uint32_t changed_metrics) override;
void LidEventReceived(chromeos::PowerManagerClient::LidState state,
base::TimeTicks timestamp) override;
void OnReceiveSwitchStates(
std::optional<chromeos::PowerManagerClient::SwitchStates> switch_states);
void UpdateOrientation(bool physical_tablet_state,
bool display_rotated,
bool lid_closed);
bool physical_tablet_state_ = false;
bool display_rotated_ = false;
bool lid_closed_ = false;
base::ObserverList<Observer> observers_;
base::ScopedObservation<TabletModeController, TabletModeObserver>
tablet_mode_observation_{this};
display::ScopedDisplayObserver display_observation_{this};
base::ScopedObservation<chromeos::PowerManagerClient,
chromeos::PowerManagerClient::Observer>
power_manager_client_observation_{this};
base::WeakPtrFactory<HumanPresenceOrientationController> weak_factory_{this};
};
}
#endif