1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef ASH_SYSTEM_POWER_POWER_BUTTON_DISPLAY_CONTROLLER_H_
6 #define ASH_SYSTEM_POWER_POWER_BUTTON_DISPLAY_CONTROLLER_H_
7 
8 #include <memory>
9 
10 #include "ash/ash_export.h"
11 #include "ash/system/power/backlights_forced_off_setter.h"
12 #include "base/macros.h"
13 #include "base/memory/weak_ptr.h"
14 #include "base/scoped_observer.h"
15 #include "base/time/time.h"
16 #include "chromeos/dbus/power/power_manager_client.h"
17 #include "ui/events/devices/input_device_event_observer.h"
18 #include "ui/events/event_handler.h"
19 
20 namespace base {
21 class TickClock;
22 }  // namespace base
23 
24 namespace ash {
25 
26 class ScopedBacklightsForcedOff;
27 
28 // PowerButtonDisplayController performs display-related tasks (e.g. forcing
29 // backlights off or disabling the touchscreen) on behalf of
30 // PowerButtonController and TabletPowerButtonController.
31 class ASH_EXPORT PowerButtonDisplayController
32     : public ScreenBacklightObserver,
33       public chromeos::PowerManagerClient::Observer,
34       public ui::EventHandler,
35       public ui::InputDeviceEventObserver {
36  public:
37   PowerButtonDisplayController(
38       BacklightsForcedOffSetter* backlights_forced_off_setter,
39       const base::TickClock* tick_clock);
40   ~PowerButtonDisplayController() override;
41 
42   bool IsScreenOn() const;
43 
screen_state_last_changed()44   base::TimeTicks screen_state_last_changed() const {
45     return screen_state_last_changed_;
46   }
47 
48   // Updates the power manager's backlights-forced-off state and enables or
49   // disables the touchscreen. No-op if |backlights_forced_off_| already equals
50   // |forced_off|.
51   void SetBacklightsForcedOff(bool forced_off);
52 
53   // Overridden from ScreenBacklightObserver:
54   void OnBacklightsForcedOffChanged(bool forced_off) override;
55   void OnScreenStateChanged(ScreenState screen_state) override;
56 
57   // Overridden from chromeos::PowerManagerClient::Observer:
58   void SuspendDone(const base::TimeDelta& sleep_duration) override;
59   void LidEventReceived(chromeos::PowerManagerClient::LidState state,
60                         const base::TimeTicks& timestamp) override;
61   void TabletModeEventReceived(chromeos::PowerManagerClient::TabletMode mode,
62                                const base::TimeTicks& timestamp) override;
63 
64   // Overridden from ui::EventHandler:
65   void OnKeyEvent(ui::KeyEvent* event) override;
66   void OnMouseEvent(ui::MouseEvent* event) override;
67 
68   // Overridden from ui::InputDeviceObserver:
69   void OnStylusStateChanged(ui::StylusState state) override;
70 
71  private:
72   // Saves the most recent timestamp that screen state changed.
73   base::TimeTicks screen_state_last_changed_;
74 
75   BacklightsForcedOffSetter* backlights_forced_off_setter_;  // Not owned.
76 
77   ScopedObserver<BacklightsForcedOffSetter, ScreenBacklightObserver>
78       backlights_forced_off_observer_;
79 
80   // Whether an accessibility alert should be sent when the backlights
81   // forced-off state changes.
82   bool send_accessibility_alert_on_backlights_forced_off_change_ = false;
83 
84   // Time source for performed action times.
85   const base::TickClock* tick_clock_;  // Not owned.
86 
87   // If set, the active request passed to |backlights_forced_off_setter_| in
88   // order to force the backlights off.
89   std::unique_ptr<ScopedBacklightsForcedOff> backlights_forced_off_;
90 
91   base::WeakPtrFactory<PowerButtonDisplayController> weak_ptr_factory_{this};
92 
93   DISALLOW_COPY_AND_ASSIGN(PowerButtonDisplayController);
94 };
95 
96 }  // namespace ash
97 
98 #endif  // ASH_SYSTEM_POWER_POWER_BUTTON_DISPLAY_CONTROLLER_H_
99