| // Copyright 2018 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. |
| |
| #include "ash/accessibility/key_accessibility_enabler.h" |
| |
| #include "ash/accessibility/spoken_feedback_enabler.h" |
| #include "ash/shell.h" |
| #include "ash/system/power/power_button_screenshot_controller.h" |
| #include "ash/wm/tablet_mode/tablet_mode_controller.h" |
| #include "ui/events/base_event_utils.h" |
| #include "ui/events/event.h" |
| |
| namespace ash { |
| |
| KeyAccessibilityEnabler::KeyAccessibilityEnabler() { |
| Shell::Get()->AddPreTargetHandler(this, |
| ui::EventTarget::Priority::kAccessibility); |
| } |
| |
| KeyAccessibilityEnabler::~KeyAccessibilityEnabler() { |
| Shell::Get()->RemovePreTargetHandler(this); |
| } |
| |
| void KeyAccessibilityEnabler::OnKeyEvent(ui::KeyEvent* event) { |
| if ((event->type() != ui::ET_KEY_PRESSED && |
| event->type() != ui::ET_KEY_RELEASED) || |
| !Shell::Get() |
| ->tablet_mode_controller() |
| ->IsTabletModeWindowManagerEnabled()) |
| return; |
| |
| if (event->key_code() == ui::VKEY_VOLUME_DOWN) |
| vol_down_pressed_ = event->type() == ui::ET_KEY_PRESSED; |
| else if (event->key_code() == ui::VKEY_VOLUME_UP) |
| vol_up_pressed_ = event->type() == ui::ET_KEY_PRESSED; |
| else |
| other_key_pressed_ = event->type() == ui::ET_KEY_PRESSED; |
| |
| if (vol_down_pressed_ && vol_up_pressed_ && !other_key_pressed_) { |
| if (!spoken_feedback_enabler_.get()) { |
| spoken_feedback_enabler_ = std::make_unique<SpokenFeedbackEnabler>(); |
| first_time_both_volume_keys_pressed_ = ui::EventTimeForNow(); |
| } |
| |
| if (ui::EventTimeForNow() - first_time_both_volume_keys_pressed_ > |
| PowerButtonScreenshotController::kScreenshotChordDelay) |
| event->StopPropagation(); |
| } else if (spoken_feedback_enabler_.get()) { |
| spoken_feedback_enabler_.reset(); |
| } |
| } |
| |
| } // namespace ash |