blob: f6ea2025a0023cb8c9c8594c59025af90ae56e09 [file] [log] [blame]
dmazzoni16d2dec2016-12-19 23:27:571// Copyright 2016 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
James Cook864dabc2018-02-14 18:12:085#include "ash/accessibility/touch_accessibility_enabler.h"
dmazzoni16d2dec2016-12-19 23:27:576
James Cook864dabc2018-02-14 18:12:087#include "ash/accessibility/touch_exploration_controller.h"
dmazzoni16d2dec2016-12-19 23:27:578#include "base/macros.h"
9#include "base/test/simple_test_tick_clock.h"
10#include "base/time/time.h"
11#include "ui/aura/test/aura_test_base.h"
12#include "ui/aura/window.h"
13#include "ui/events/event.h"
14#include "ui/events/event_utils.h"
15#include "ui/events/gestures/gesture_provider_aura.h"
16#include "ui/events/test/event_generator.h"
17#include "ui/events/test/events_test_utils.h"
18#include "ui/gfx/geometry/point.h"
19
James Cook864dabc2018-02-14 18:12:0820namespace ash {
dmazzoni16d2dec2016-12-19 23:27:5721
22namespace {
23
24class MockTouchAccessibilityEnablerDelegate
James Cook864dabc2018-02-14 18:12:0825 : public TouchAccessibilityEnablerDelegate {
dmazzoni16d2dec2016-12-19 23:27:5726 public:
27 MockTouchAccessibilityEnablerDelegate() {}
28 ~MockTouchAccessibilityEnablerDelegate() override {}
29
dmazzonidf9a1e922017-04-13 05:10:4430 void OnTwoFingerTouchStart() override { started_ = true; }
31
32 void OnTwoFingerTouchStop() override { stopped_ = true; }
33
dmazzoni16d2dec2016-12-19 23:27:5734 void PlaySpokenFeedbackToggleCountdown(int tick_count) override {
35 ++feedback_progress_sound_count_;
36 }
37 void ToggleSpokenFeedback() override { toggle_spoken_feedback_ = true; }
38
dmazzonidf9a1e922017-04-13 05:10:4439 bool started() { return started_; }
40 bool stopped() { return stopped_; }
dmazzoni16d2dec2016-12-19 23:27:5741 size_t feedback_progress_sound_count() const {
42 return feedback_progress_sound_count_;
43 }
44 bool toggle_spoken_feedback() const { return toggle_spoken_feedback_; }
45
46 private:
dmazzonidf9a1e922017-04-13 05:10:4447 bool started_ = false;
48 bool stopped_ = false;
dmazzoni16d2dec2016-12-19 23:27:5749 size_t feedback_progress_sound_count_ = 0;
50 bool toggle_spoken_feedback_ = false;
51
52 DISALLOW_COPY_AND_ASSIGN(MockTouchAccessibilityEnablerDelegate);
53};
54
55class TouchAccessibilityEnablerTest : public aura::test::AuraTestBase {
56 public:
57 TouchAccessibilityEnablerTest() {}
58 ~TouchAccessibilityEnablerTest() override {}
59
60 void SetUp() override {
61 aura::test::AuraTestBase::SetUp();
62
James Cook864dabc2018-02-14 18:12:0863 generator_.reset(new ui::test::EventGenerator(root_window()));
dmazzoni16d2dec2016-12-19 23:27:5764
dmazzoni16d2dec2016-12-19 23:27:5765 // Tests fail if time is ever 0.
tzik8529bdd82018-02-28 05:47:2166 simulated_clock_.Advance(base::TimeDelta::FromMilliseconds(10));
67 ui::SetEventTickClockForTesting(&simulated_clock_);
dmazzoni16d2dec2016-12-19 23:27:5768
69 enabler_.reset(new TouchAccessibilityEnabler(root_window(), &delegate_));
70 }
71
72 void TearDown() override {
73 enabler_.reset(nullptr);
74 ui::SetEventTickClockForTesting(nullptr);
75 aura::test::AuraTestBase::TearDown();
76 }
77
78 protected:
79 base::TimeTicks Now() {
80 // This is the same as what EventTimeForNow() does, but here we do it
81 // with our simulated clock.
tzik8529bdd82018-02-28 05:47:2182 return simulated_clock_.NowTicks();
dmazzoni16d2dec2016-12-19 23:27:5783 }
84
James Cook864dabc2018-02-14 18:12:0885 std::unique_ptr<ui::test::EventGenerator> generator_;
tzik8529bdd82018-02-28 05:47:2186 base::SimpleTestTickClock simulated_clock_;
dmazzoni16d2dec2016-12-19 23:27:5787 MockTouchAccessibilityEnablerDelegate delegate_;
88 std::unique_ptr<TouchAccessibilityEnabler> enabler_;
89 ui::GestureDetector::Config gesture_detector_config_;
90
91 DISALLOW_COPY_AND_ASSIGN(TouchAccessibilityEnablerTest);
92};
93
94} // namespace
95
Dominic Mazzoni51c65f22017-08-22 19:36:0696TEST_F(TouchAccessibilityEnablerTest, InteractsWithTouchExplorationController) {
97 // This test ensures that if TouchExplorationController starts and stops,
98 // TouchAccessibilityEnabler continues to work correctly. Because
99 // TouchExplorationController rewrites most touch events, it can screw up
100 // TouchAccessibilityEnabler if they don't explicitly coordinate.
101
102 std::unique_ptr<TouchExplorationController> controller(
103 new TouchExplorationController(root_window(), nullptr,
104 enabler_->GetWeakPtr()));
105
106 EXPECT_TRUE(enabler_->IsInNoFingersDownForTesting());
Peter Kasting5243a7e2018-11-27 17:11:53107 generator_->set_current_screen_location(gfx::Point(11, 12));
Dominic Mazzoni51c65f22017-08-22 19:36:06108 generator_->PressTouchId(1);
109
tzik8529bdd82018-02-28 05:47:21110 simulated_clock_.Advance(base::TimeDelta::FromMilliseconds(500));
Dominic Mazzoni51c65f22017-08-22 19:36:06111
Peter Kasting5243a7e2018-11-27 17:11:53112 generator_->set_current_screen_location(gfx::Point(22, 34));
Dominic Mazzoni51c65f22017-08-22 19:36:06113 generator_->PressTouchId(2);
114
115 EXPECT_TRUE(enabler_->IsInTwoFingersDownForTesting());
116
117 controller.reset();
118
119 generator_->ReleaseTouchId(1);
120 generator_->ReleaseTouchId(2);
121 EXPECT_TRUE(enabler_->IsInNoFingersDownForTesting());
122}
123
dmazzoni16d2dec2016-12-19 23:27:57124TEST_F(TouchAccessibilityEnablerTest, EntersOneFingerDownMode) {
125 EXPECT_TRUE(enabler_->IsInNoFingersDownForTesting());
126 EXPECT_FALSE(enabler_->IsInOneFingerDownForTesting());
Peter Kasting5243a7e2018-11-27 17:11:53127 generator_->set_current_screen_location(gfx::Point(11, 12));
dmazzoni16d2dec2016-12-19 23:27:57128 generator_->PressTouch();
129
130 EXPECT_FALSE(enabler_->IsInNoFingersDownForTesting());
131 EXPECT_TRUE(enabler_->IsInOneFingerDownForTesting());
132}
133
134TEST_F(TouchAccessibilityEnablerTest, EntersTwoFingersDownMode) {
135 EXPECT_TRUE(enabler_->IsInNoFingersDownForTesting());
Peter Kasting5243a7e2018-11-27 17:11:53136 generator_->set_current_screen_location(gfx::Point(11, 12));
dmazzoni16d2dec2016-12-19 23:27:57137 generator_->PressTouchId(1);
138
Peter Kasting5243a7e2018-11-27 17:11:53139 generator_->set_current_screen_location(gfx::Point(22, 34));
dmazzoni16d2dec2016-12-19 23:27:57140 generator_->PressTouchId(2);
141
142 EXPECT_TRUE(enabler_->IsInTwoFingersDownForTesting());
143}
144
145TEST_F(TouchAccessibilityEnablerTest, PlaysProgressSound) {
146 EXPECT_TRUE(enabler_->IsInNoFingersDownForTesting());
Peter Kasting5243a7e2018-11-27 17:11:53147 generator_->set_current_screen_location(gfx::Point(11, 12));
dmazzoni16d2dec2016-12-19 23:27:57148 generator_->PressTouchId(1);
149
Peter Kasting5243a7e2018-11-27 17:11:53150 generator_->set_current_screen_location(gfx::Point(22, 34));
dmazzoni16d2dec2016-12-19 23:27:57151 generator_->PressTouchId(2);
152
153 EXPECT_TRUE(enabler_->IsInTwoFingersDownForTesting());
154 EXPECT_EQ(0U, delegate_.feedback_progress_sound_count());
155
156 enabler_->TriggerOnTimerForTesting();
157 EXPECT_EQ(0U, delegate_.feedback_progress_sound_count());
158
tzik8529bdd82018-02-28 05:47:21159 simulated_clock_.Advance(base::TimeDelta::FromMilliseconds(3000));
dmazzoni16d2dec2016-12-19 23:27:57160 enabler_->TriggerOnTimerForTesting();
161 EXPECT_EQ(1U, delegate_.feedback_progress_sound_count());
162}
163
164TEST_F(TouchAccessibilityEnablerTest, TogglesSpokenFeedback) {
165 EXPECT_TRUE(enabler_->IsInNoFingersDownForTesting());
Peter Kasting5243a7e2018-11-27 17:11:53166 generator_->set_current_screen_location(gfx::Point(11, 12));
dmazzoni16d2dec2016-12-19 23:27:57167 generator_->PressTouchId(1);
168
Peter Kasting5243a7e2018-11-27 17:11:53169 generator_->set_current_screen_location(gfx::Point(22, 34));
dmazzoni16d2dec2016-12-19 23:27:57170 generator_->PressTouchId(2);
171
172 EXPECT_TRUE(enabler_->IsInTwoFingersDownForTesting());
173 EXPECT_FALSE(delegate_.toggle_spoken_feedback());
dmazzonidf9a1e922017-04-13 05:10:44174 EXPECT_TRUE(delegate_.started());
175 EXPECT_FALSE(delegate_.stopped());
dmazzoni16d2dec2016-12-19 23:27:57176
177 enabler_->TriggerOnTimerForTesting();
178 EXPECT_FALSE(delegate_.toggle_spoken_feedback());
179
tzik8529bdd82018-02-28 05:47:21180 simulated_clock_.Advance(base::TimeDelta::FromMilliseconds(5000));
dmazzoni16d2dec2016-12-19 23:27:57181 enabler_->TriggerOnTimerForTesting();
182 EXPECT_TRUE(delegate_.toggle_spoken_feedback());
dmazzonidf9a1e922017-04-13 05:10:44183 EXPECT_TRUE(delegate_.started());
184 EXPECT_FALSE(delegate_.stopped());
dmazzoni16d2dec2016-12-19 23:27:57185}
186
187TEST_F(TouchAccessibilityEnablerTest, ThreeFingersCancelsDetection) {
188 EXPECT_TRUE(enabler_->IsInNoFingersDownForTesting());
Peter Kasting5243a7e2018-11-27 17:11:53189 generator_->set_current_screen_location(gfx::Point(11, 12));
dmazzoni16d2dec2016-12-19 23:27:57190 generator_->PressTouchId(1);
191
Peter Kasting5243a7e2018-11-27 17:11:53192 generator_->set_current_screen_location(gfx::Point(22, 34));
dmazzoni16d2dec2016-12-19 23:27:57193 generator_->PressTouchId(2);
194
195 EXPECT_TRUE(enabler_->IsInTwoFingersDownForTesting());
dmazzonidf9a1e922017-04-13 05:10:44196 EXPECT_TRUE(delegate_.started());
197 EXPECT_FALSE(delegate_.stopped());
dmazzoni16d2dec2016-12-19 23:27:57198
Peter Kasting5243a7e2018-11-27 17:11:53199 generator_->set_current_screen_location(gfx::Point(33, 56));
dmazzoni16d2dec2016-12-19 23:27:57200 generator_->PressTouchId(3);
201
202 EXPECT_TRUE(enabler_->IsInWaitForNoFingersForTesting());
dmazzonidf9a1e922017-04-13 05:10:44203 EXPECT_TRUE(delegate_.started());
204 EXPECT_TRUE(delegate_.stopped());
dmazzoni16d2dec2016-12-19 23:27:57205}
206
207TEST_F(TouchAccessibilityEnablerTest, MovingFingerPastSlopCancelsDetection) {
208 EXPECT_TRUE(enabler_->IsInNoFingersDownForTesting());
Peter Kasting5243a7e2018-11-27 17:11:53209 generator_->set_current_screen_location(gfx::Point(11, 12));
dmazzoni16d2dec2016-12-19 23:27:57210 generator_->PressTouch();
211
212 int slop = gesture_detector_config_.double_tap_slop;
213 int half_slop = slop / 2;
214
215 generator_->MoveTouch(gfx::Point(11 + half_slop, 12));
216 EXPECT_TRUE(enabler_->IsInOneFingerDownForTesting());
217
218 generator_->MoveTouch(gfx::Point(11 + slop + 1, 12));
219 EXPECT_TRUE(enabler_->IsInWaitForNoFingersForTesting());
220}
221
James Cook864dabc2018-02-14 18:12:08222} // namespace ash