// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ASH_SYSTEM_POWER_POWER_BUTTON_DISPLAY_CONTROLLER_H_
#define ASH_SYSTEM_POWER_POWER_BUTTON_DISPLAY_CONTROLLER_H_

#include <memory>

#include "ash/ash_export.h"
#include "ash/system/power/backlights_forced_off_setter.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observer.h"
#include "base/time/time.h"
#include "chromeos/dbus/power_manager_client.h"
#include "ui/events/devices/input_device_event_observer.h"
#include "ui/events/event_handler.h"

namespace base {
class TickClock;
}  // namespace base

namespace ash {

class ScopedBacklightsForcedOff;

// PowerButtonDisplayController performs display-related tasks (e.g. forcing
// backlights off or disabling the touchscreen) on behalf of
// PowerButtonController and TabletPowerButtonController.
class ASH_EXPORT PowerButtonDisplayController
    : public BacklightsForcedOffSetter::Observer,
      public chromeos::PowerManagerClient::Observer,
      public ui::EventHandler,
      public ui::InputDeviceEventObserver {
 public:
  PowerButtonDisplayController(
      BacklightsForcedOffSetter* backlights_forced_off_setter,
      const base::TickClock* tick_clock);
  ~PowerButtonDisplayController() override;

  bool IsScreenOn() const;

  base::TimeTicks screen_state_last_changed() const {
    return screen_state_last_changed_;
  }

  // Updates the power manager's backlights-forced-off state and enables or
  // disables the touchscreen. No-op if |backlights_forced_off_| already equals
  // |forced_off|.
  void SetBacklightsForcedOff(bool forced_off);

  // Overridden from BacklightsForcedOffObserver:
  void OnBacklightsForcedOffChanged(bool forced_off) override;
  void OnScreenStateChanged(
      BacklightsForcedOffSetter::ScreenState screen_state) override;

  // Overridden from chromeos::PowerManagerClient::Observer:
  void SuspendDone(const base::TimeDelta& sleep_duration) override;
  void LidEventReceived(chromeos::PowerManagerClient::LidState state,
                        const base::TimeTicks& timestamp) override;
  void TabletModeEventReceived(chromeos::PowerManagerClient::TabletMode mode,
                               const base::TimeTicks& timestamp) override;

  // Overridden from ui::EventHandler:
  void OnKeyEvent(ui::KeyEvent* event) override;
  void OnMouseEvent(ui::MouseEvent* event) override;

  // Overridden from ui::InputDeviceObserver:
  void OnStylusStateChanged(ui::StylusState state) override;

 private:
  // Saves the most recent timestamp that screen state changed.
  base::TimeTicks screen_state_last_changed_;

  BacklightsForcedOffSetter* backlights_forced_off_setter_;  // Not owned.

  ScopedObserver<BacklightsForcedOffSetter, BacklightsForcedOffSetter::Observer>
      backlights_forced_off_observer_;

  // Whether an accessibility alert should be sent when the backlights
  // forced-off state changes.
  bool send_accessibility_alert_on_backlights_forced_off_change_ = false;

  // Time source for performed action times.
  const base::TickClock* tick_clock_;  // Not owned.

  // If set, the active request passed to |backlights_forced_off_setter_| in
  // order to force the backlights off.
  std::unique_ptr<ScopedBacklightsForcedOff> backlights_forced_off_;

  base::WeakPtrFactory<PowerButtonDisplayController> weak_ptr_factory_;

  DISALLOW_COPY_AND_ASSIGN(PowerButtonDisplayController);
};

}  // namespace ash

#endif  // ASH_SYSTEM_POWER_POWER_BUTTON_DISPLAY_CONTROLLER_H_
