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