Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(261)

Side by Side Diff: ui/chromeos/touch_exploration_controller.h

Issue 410783002: Corner Passthrough for Accessibility (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@side-gestures
Patch Set: Removed extra comment Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chromeos/audio/chromeos_sounds.h ('k') | ui/chromeos/touch_exploration_controller.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef UI_CHROMEOS_TOUCH_EXPLORATION_CONTROLLER_H_ 5 #ifndef UI_CHROMEOS_TOUCH_EXPLORATION_CONTROLLER_H_
6 #define UI_CHROMEOS_TOUCH_EXPLORATION_CONTROLLER_H_ 6 #define UI_CHROMEOS_TOUCH_EXPLORATION_CONTROLLER_H_
7 7
8 #include "base/time/tick_clock.h" 8 #include "base/time/tick_clock.h"
9 #include "base/timer/timer.h" 9 #include "base/timer/timer.h"
10 #include "base/values.h" 10 #include "base/values.h"
(...skipping 15 matching lines...) Expand all
26 class GestureEvent; 26 class GestureEvent;
27 class GestureProviderAura; 27 class GestureProviderAura;
28 class TouchEvent; 28 class TouchEvent;
29 29
30 // A delegate to handle commands in response to detected accessibility gesture 30 // A delegate to handle commands in response to detected accessibility gesture
31 // events. 31 // events.
32 class TouchExplorationControllerDelegate { 32 class TouchExplorationControllerDelegate {
33 public: 33 public:
34 virtual ~TouchExplorationControllerDelegate() {} 34 virtual ~TouchExplorationControllerDelegate() {}
35 35
36 // This function should be called whenever the delegate wants to play a sound
37 // when the volume adjusts.
38 virtual void PlayVolumeAdjustSound() = 0;
39
40 // Takes an int from 0.0 to 100.0 that indicates the percent the volume 36 // Takes an int from 0.0 to 100.0 that indicates the percent the volume
41 // should be set to. 37 // should be set to.
42 virtual void SetOutputLevel(int volume) = 0; 38 virtual void SetOutputLevel(int volume) = 0;
43 39
44 // Silences spoken feedback. 40 // Silences spoken feedback.
45 virtual void SilenceSpokenFeedback() = 0; 41 virtual void SilenceSpokenFeedback() = 0;
42
43 // This function should be called when the volume adjust earcon should be
44 // played
45 virtual void PlayVolumeAdjustEarcon() = 0;
46
47 // This function should be called when the passthrough earcon should be
48 // played.
49 virtual void PlayPassthroughEarcon() = 0;
50
51 // This function should be called when the exit screen earcon should be
52 // played.
53 virtual void PlayExitScreenEarcon() = 0;
54
55 // This function should be called when the enter screen earcon should be
56 // played.
57 virtual void PlayEnterScreenEarcon() = 0;
46 }; 58 };
47 59
48 // TouchExplorationController is used in tandem with "Spoken Feedback" to 60 // TouchExplorationController is used in tandem with "Spoken Feedback" to
49 // make the touch UI accessible. Gestures performed in the middle of the screen 61 // make the touch UI accessible. Gestures performed in the middle of the screen
50 // are mapped to accessibility key shortcuts while gestures performed on the 62 // are mapped to accessibility key shortcuts while gestures performed on the
51 // edge of the screen can change settings. 63 // edge of the screen can change settings.
52 // 64 //
53 // ** Short version ** 65 // ** Short version **
54 // 66 //
55 // At a high-level, single-finger events are used for accessibility - 67 // At a high-level, single-finger events are used for accessibility -
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 // 147 //
136 // Currently, only the right edge is mapped to control the volume. Volume 148 // Currently, only the right edge is mapped to control the volume. Volume
137 // control along the edge of the screen is directly proportional to where the 149 // control along the edge of the screen is directly proportional to where the
138 // user's finger is located on the screen. The top right corner of the screen 150 // user's finger is located on the screen. The top right corner of the screen
139 // automatically sets the volume to 100% and the bottome right corner of the 151 // automatically sets the volume to 100% and the bottome right corner of the
140 // screen automatically sets the volume to 0% once the user has moved past slop. 152 // screen automatically sets the volume to 0% once the user has moved past slop.
141 // 153 //
142 // If the user taps the screen with two fingers and lifts both fingers before 154 // If the user taps the screen with two fingers and lifts both fingers before
143 // the grace period has passed, spoken feedback is silenced. 155 // the grace period has passed, spoken feedback is silenced.
144 // 156 //
157 // The user can also enter passthrough by placing a finger on one of the bottom
158 // corners of the screen until an earcon sounds. After the earcon sounds, the
159 // user is in passthrough so all subsequent fingers placed on the screen will be
160 // passed through. Once the finger in the corner has been released, the state
161 // will switch to wait for one finger.
162 //
145 // The caller is expected to retain ownership of instances of this class and 163 // The caller is expected to retain ownership of instances of this class and
146 // destroy them before |root_window| is destroyed. 164 // destroy them before |root_window| is destroyed.
147 class UI_CHROMEOS_EXPORT TouchExplorationController 165 class UI_CHROMEOS_EXPORT TouchExplorationController
148 : public ui::EventRewriter, 166 : public ui::EventRewriter,
149 public ui::GestureProviderAuraClient { 167 public ui::GestureProviderAuraClient {
150 public: 168 public:
151 explicit TouchExplorationController( 169 explicit TouchExplorationController(
152 aura::Window* root_window, 170 aura::Window* root_window,
153 ui::TouchExplorationControllerDelegate* delegate); 171 ui::TouchExplorationControllerDelegate* delegate);
154 virtual ~TouchExplorationController(); 172 virtual ~TouchExplorationController();
(...skipping 14 matching lines...) Expand all
169 ui::EventRewriteStatus InSingleTapPressed( 187 ui::EventRewriteStatus InSingleTapPressed(
170 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event); 188 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event);
171 ui::EventRewriteStatus InSingleTapOrTouchExploreReleased( 189 ui::EventRewriteStatus InSingleTapOrTouchExploreReleased(
172 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event); 190 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event);
173 ui::EventRewriteStatus InDoubleTapPending( 191 ui::EventRewriteStatus InDoubleTapPending(
174 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event); 192 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event);
175 ui::EventRewriteStatus InTouchReleasePending( 193 ui::EventRewriteStatus InTouchReleasePending(
176 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event); 194 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event);
177 ui::EventRewriteStatus InTouchExploration( 195 ui::EventRewriteStatus InTouchExploration(
178 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event); 196 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event);
197 ui::EventRewriteStatus InCornerPassthrough(
198 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event);
179 ui::EventRewriteStatus InOneFingerPassthrough( 199 ui::EventRewriteStatus InOneFingerPassthrough(
180 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event); 200 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event);
181 ui::EventRewriteStatus InGestureInProgress( 201 ui::EventRewriteStatus InGestureInProgress(
182 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event); 202 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event);
183 ui::EventRewriteStatus InTouchExploreSecondPress( 203 ui::EventRewriteStatus InTouchExploreSecondPress(
184 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event); 204 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event);
185 ui::EventRewriteStatus InWaitForNoFingers( 205 ui::EventRewriteStatus InWaitForNoFingers(
186 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event); 206 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event);
187 ui::EventRewriteStatus InSlideGesture( 207 ui::EventRewriteStatus InSlideGesture(
188 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event); 208 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event);
189 ui::EventRewriteStatus InTwoFingerTap( 209 ui::EventRewriteStatus InTwoFingerTap(
190 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event); 210 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event);
191 211
192 // Returns the current time of the tick clock. 212 // Returns the current time of the tick clock.
193 base::TimeDelta Now(); 213 base::TimeDelta Now();
194 214
195 // This timer is started every time we get the first press event, and 215 // This timer is started every time we get the first press event, and
196 // it fires after the double-click timeout elapses (300 ms by default). 216 // it fires after the double-click timeout elapses (300 ms by default).
197 // If the user taps and releases within 300 ms and doesn't press again, 217 // If the user taps and releases within 300 ms and doesn't press again,
198 // we treat that as a single mouse move (touch exploration) event. 218 // we treat that as a single mouse move (touch exploration) event.
199 void StartTapTimer(); 219 void StartTapTimer();
200 void OnTapTimerFired(); 220 void OnTapTimerFired();
201 221
222 // This timer is started every timer we get the first press event and the
223 // finger is in the corner of the screen.
224 // It fires after the corner passthrough delay elapses. If the
225 // user is still in the corner by the time this timer fires, all subsequent
226 // fingers added on the screen will be passed through.
227 void OnPassthroughTimerFired();
228
202 // Dispatch a new event outside of the event rewriting flow. 229 // Dispatch a new event outside of the event rewriting flow.
203 void DispatchEvent(ui::Event* event); 230 void DispatchEvent(ui::Event* event);
204 231
205 // Overridden from GestureProviderAuraClient. 232 // Overridden from GestureProviderAuraClient.
206 // 233 //
207 // The gesture provider keeps track of all the touch events after 234 // The gesture provider keeps track of all the touch events after
208 // the user moves fast enough to trigger a gesture. After the user 235 // the user moves fast enough to trigger a gesture. After the user
209 // completes their gesture, this method will decide what keyboard 236 // completes their gesture, this method will decide what keyboard
210 // input their gesture corresponded to. 237 // input their gesture corresponded to.
211 virtual void OnGestureEvent(ui::GestureEvent* gesture) OVERRIDE; 238 virtual void OnGestureEvent(ui::GestureEvent* gesture) OVERRIDE;
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 // releases the touch explore finger, the other finger will continue with 332 // releases the touch explore finger, the other finger will continue with
306 // touch explore. Any fingers pressed past the first two are ignored. 333 // touch explore. Any fingers pressed past the first two are ignored.
307 TOUCH_EXPLORE_SECOND_PRESS, 334 TOUCH_EXPLORE_SECOND_PRESS,
308 335
309 // After the user double taps and holds with a single finger, all events 336 // After the user double taps and holds with a single finger, all events
310 // for that finger are passed through, displaced by an offset. Adding 337 // for that finger are passed through, displaced by an offset. Adding
311 // extra fingers has no effect. This state is left when the user removes 338 // extra fingers has no effect. This state is left when the user removes
312 // all fingers. 339 // all fingers.
313 ONE_FINGER_PASSTHROUGH, 340 ONE_FINGER_PASSTHROUGH,
314 341
342 // If the user has pressed and held down the left corner past long press,
343 // then as long as they are holding the corner, all subsequent fingers
344 // registered will be in passthrough.
345 CORNER_PASSTHROUGH,
346
315 // If the user added another finger in SINGLE_TAP_PRESSED, or if the user 347 // If the user added another finger in SINGLE_TAP_PRESSED, or if the user
316 // has multiple fingers fingers down in any other state between 348 // has multiple fingers fingers down in any other state between
317 // passthrough, touch exploration, and gestures, they must release 349 // passthrough, touch exploration, and gestures, they must release
318 // all fingers before completing any more actions. This state is 350 // all fingers before completing any more actions. This state is
319 // generally useful for developing new features, because it creates a 351 // generally useful for developing new features, because it creates a
320 // simple way to handle a dead end in user flow. 352 // simple way to handle a dead end in user flow.
321 WAIT_FOR_NO_FINGERS, 353 WAIT_FOR_NO_FINGERS,
322 354
323 // If the user is within the given bounds from an edge of the screen, not 355 // If the user is within the given bounds from an edge of the screen, not
324 // including corners, then the resulting movements will be interpreted as 356 // including corners, then the resulting movements will be interpreted as
325 // slide gestures. 357 // slide gestures.
326 SLIDE_GESTURE, 358 SLIDE_GESTURE,
327 359
328 // If the user taps the screen with two fingers and releases both fingers 360 // If the user taps the screen with two fingers and releases both fingers
329 // before the grace period has passed, spoken feedback will be silenced. 361 // before the grace period has passed, spoken feedback will be silenced.
330 TWO_FINGER_TAP, 362 TWO_FINGER_TAP,
331 }; 363 };
332 364
333 enum ScreenLocation { 365 enum ScreenLocation {
334 // Hot "edges" of the screen are each represented by a respective bit. 366 // Hot "edges" of the screen are each represented by a respective bit.
335 NO_EDGE = 0, 367 NO_EDGE = 0,
336 RIGHT_EDGE = 1 << 0, 368 RIGHT_EDGE = 1 << 0,
337 TOP_EDGE = 1 << 1, 369 TOP_EDGE = 1 << 1,
338 LEFT_EDGE = 1 << 2, 370 LEFT_EDGE = 1 << 2,
339 BOTTOM_EDGE = 1 << 3, 371 BOTTOM_EDGE = 1 << 3,
372 BOTTOM_LEFT_CORNER = LEFT_EDGE | BOTTOM_EDGE,
373 BOTTOM_RIGHT_CORNER = RIGHT_EDGE | BOTTOM_EDGE,
340 }; 374 };
341 375
342 // Given a point, if it is within the given bounds of an edge, returns the 376 // Given a point, if it is within the given bounds of an edge, returns the
343 // edge. If it is within the given bounds of two edges, returns an int with 377 // edge. If it is within the given bounds of two edges, returns an int with
344 // both bits that represent the respective edges turned on. Otherwise returns 378 // both bits that represent the respective edges turned on. Otherwise returns
345 // SCREEN_CENTER. 379 // SCREEN_CENTER.
346 int FindEdgesWithinBounds(gfx::Point point, float bounds); 380 int FindEdgesWithinBounds(gfx::Point point, float bounds);
347 381
348 // Set the state and modifies any variables related to the state change. 382 // Set the state and modifies any variables related to the state change.
349 // (e.g. resetting the gesture provider). 383 // (e.g. resetting the gesture provider).
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 // enters double-tap-hold passthrough, we need to update its location.) 424 // enters double-tap-hold passthrough, we need to update its location.)
391 scoped_ptr<ui::TouchEvent> last_unused_finger_event_; 425 scoped_ptr<ui::TouchEvent> last_unused_finger_event_;
392 426
393 // The last synthesized mouse move event. When the user double-taps, 427 // The last synthesized mouse move event. When the user double-taps,
394 // we send the passed-through tap to the location of this event. 428 // we send the passed-through tap to the location of this event.
395 scoped_ptr<ui::TouchEvent> last_touch_exploration_; 429 scoped_ptr<ui::TouchEvent> last_touch_exploration_;
396 430
397 // A timer that fires after the double-tap delay. 431 // A timer that fires after the double-tap delay.
398 base::OneShotTimer<TouchExplorationController> tap_timer_; 432 base::OneShotTimer<TouchExplorationController> tap_timer_;
399 433
434 // A timer that fires to enter passthrough.
435 base::OneShotTimer<TouchExplorationController> passthrough_timer_;
436
400 // A timer to fire an indicating sound when sliding to change volume. 437 // A timer to fire an indicating sound when sliding to change volume.
401 base::RepeatingTimer<TouchExplorationController> sound_timer_; 438 base::RepeatingTimer<TouchExplorationController> sound_timer_;
402 439
403 // A default gesture detector config, so we can share the same 440 // A default gesture detector config, so we can share the same
404 // timeout and pixel slop constants. 441 // timeout and pixel slop constants.
405 ui::GestureDetector::Config gesture_detector_config_; 442 ui::GestureDetector::Config gesture_detector_config_;
406 443
407 // Gesture Handler to interpret the touch events. 444 // Gesture Handler to interpret the touch events.
408 scoped_ptr<ui::GestureProviderAura> gesture_provider_; 445 scoped_ptr<ui::GestureProviderAura> gesture_provider_;
409 446
(...skipping 16 matching lines...) Expand all
426 std::map<int, base::Closure> right_swipe_gestures_; 463 std::map<int, base::Closure> right_swipe_gestures_;
427 std::map<int, base::Closure> up_swipe_gestures_; 464 std::map<int, base::Closure> up_swipe_gestures_;
428 std::map<int, base::Closure> down_swipe_gestures_; 465 std::map<int, base::Closure> down_swipe_gestures_;
429 466
430 DISALLOW_COPY_AND_ASSIGN(TouchExplorationController); 467 DISALLOW_COPY_AND_ASSIGN(TouchExplorationController);
431 }; 468 };
432 469
433 } // namespace ui 470 } // namespace ui
434 471
435 #endif // UI_CHROMEOS_TOUCH_EXPLORATION_CONTROLLER_H_ 472 #endif // UI_CHROMEOS_TOUCH_EXPLORATION_CONTROLLER_H_
OLDNEW
« no previous file with comments | « chromeos/audio/chromeos_sounds.h ('k') | ui/chromeos/touch_exploration_controller.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698