power_button_display_controller.cc 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. #include "ash/system/power/power_button_display_controller.h"
  5. #include "ash/accessibility/accessibility_controller_impl.h"
  6. #include "ash/media/media_controller_impl.h"
  7. #include "ash/shell.h"
  8. #include "ash/system/power/scoped_backlights_forced_off.h"
  9. #include "ash/wm/tablet_mode/tablet_mode_controller.h"
  10. #include "base/time/tick_clock.h"
  11. #include "chromeos/dbus/power/power_policy_controller.h"
  12. #include "ui/events/devices/device_data_manager.h"
  13. #include "ui/events/devices/stylus_state.h"
  14. #include "ui/events/event.h"
  15. namespace ash {
  16. namespace {
  17. // Returns true if device is currently in tablet/tablet mode, otherwise false.
  18. bool IsTabletModeActive() {
  19. TabletModeController* tablet_mode_controller =
  20. Shell::Get()->tablet_mode_controller();
  21. return tablet_mode_controller && tablet_mode_controller->InTabletMode();
  22. }
  23. } // namespace
  24. PowerButtonDisplayController::PowerButtonDisplayController(
  25. BacklightsForcedOffSetter* backlights_forced_off_setter,
  26. const base::TickClock* tick_clock)
  27. : backlights_forced_off_setter_(backlights_forced_off_setter),
  28. tick_clock_(tick_clock) {
  29. chromeos::PowerManagerClient::Get()->AddObserver(this);
  30. ui::DeviceDataManager::GetInstance()->AddObserver(this);
  31. Shell::Get()->AddPreTargetHandler(this, ui::EventTarget::Priority::kSystem);
  32. backlights_forced_off_observation_.Observe(backlights_forced_off_setter_);
  33. }
  34. PowerButtonDisplayController::~PowerButtonDisplayController() {
  35. Shell::Get()->RemovePreTargetHandler(this);
  36. ui::DeviceDataManager::GetInstance()->RemoveObserver(this);
  37. chromeos::PowerManagerClient::Get()->RemoveObserver(this);
  38. }
  39. bool PowerButtonDisplayController::IsScreenOn() const {
  40. return backlights_forced_off_setter_->GetScreenBacklightState() ==
  41. ScreenBacklightState::ON;
  42. }
  43. void PowerButtonDisplayController::SetBacklightsForcedOff(bool forced_off) {
  44. if ((backlights_forced_off_ != nullptr) == forced_off)
  45. return;
  46. send_accessibility_alert_on_backlights_forced_off_change_ = true;
  47. if (forced_off) {
  48. backlights_forced_off_ =
  49. backlights_forced_off_setter_->ForceBacklightsOff();
  50. } else {
  51. backlights_forced_off_.reset();
  52. }
  53. // Let PowerPolicyController update inactivity delays:
  54. // https://crbug.com/812504
  55. chromeos::PowerPolicyController::Get()
  56. ->HandleBacklightsForcedOffForPowerButton(forced_off);
  57. if (forced_off)
  58. Shell::Get()->media_controller()->SuspendMediaSessions();
  59. }
  60. void PowerButtonDisplayController::OnBacklightsForcedOffChanged(
  61. bool forced_off) {
  62. if (send_accessibility_alert_on_backlights_forced_off_change_) {
  63. Shell::Get()->accessibility_controller()->TriggerAccessibilityAlert(
  64. forced_off ? AccessibilityAlert::SCREEN_OFF
  65. : AccessibilityAlert::SCREEN_ON);
  66. }
  67. send_accessibility_alert_on_backlights_forced_off_change_ = false;
  68. }
  69. void PowerButtonDisplayController::OnScreenBacklightStateChanged(
  70. ScreenBacklightState screen_backlight_state) {
  71. screen_state_last_changed_ = tick_clock_->NowTicks();
  72. }
  73. void PowerButtonDisplayController::SuspendDone(base::TimeDelta sleep_duration) {
  74. // Stop forcing backlights off on resume to handle situations where the power
  75. // button resumed but we didn't receive the event (crbug.com/735291).
  76. SetBacklightsForcedOff(false);
  77. }
  78. void PowerButtonDisplayController::LidEventReceived(
  79. chromeos::PowerManagerClient::LidState state,
  80. base::TimeTicks timestamp) {
  81. SetBacklightsForcedOff(false);
  82. }
  83. void PowerButtonDisplayController::TabletModeEventReceived(
  84. chromeos::PowerManagerClient::TabletMode mode,
  85. base::TimeTicks timestamp) {
  86. SetBacklightsForcedOff(false);
  87. }
  88. void PowerButtonDisplayController::OnKeyEvent(ui::KeyEvent* event) {
  89. // Ignore key events generated by the power button since power button activity
  90. // is already handled elsewhere.
  91. if (event->key_code() == ui::VKEY_POWER)
  92. return;
  93. if (!IsTabletModeActive())
  94. SetBacklightsForcedOff(false);
  95. }
  96. void PowerButtonDisplayController::OnMouseEvent(ui::MouseEvent* event) {
  97. if (event->flags() & ui::EF_IS_SYNTHESIZED)
  98. return;
  99. if (!IsTabletModeActive())
  100. SetBacklightsForcedOff(false);
  101. }
  102. void PowerButtonDisplayController::OnStylusStateChanged(ui::StylusState state) {
  103. if (state == ui::StylusState::REMOVED)
  104. SetBacklightsForcedOff(false);
  105. }
  106. } // namespace ash