Add four-finger gestures.

This CL includes the following gestures:
1) Four-finger single / double / triple tap.
2) Four-finger swipe up / down / left / right.

Bug: 136131815
Test: atest GestureManifoldTest AccessibilityGestureDetectorTest TouchExplorerTest
Change-Id: If5b4bfc680423f0672452b9aa440c8f18333f565
This commit is contained in:
Ameer Armaly
2020-01-30 15:42:17 -08:00
parent 6dc501b986
commit ec5eb82a6d
6 changed files with 81 additions and 6 deletions

View File

@@ -2888,6 +2888,13 @@ package android.accessibilityservice {
field public static final int GESTURE_3_FINGER_SWIPE_RIGHT = 32; // 0x20
field public static final int GESTURE_3_FINGER_SWIPE_UP = 29; // 0x1d
field public static final int GESTURE_3_FINGER_TRIPLE_TAP = 24; // 0x18
field public static final int GESTURE_4_FINGER_DOUBLE_TAP = 38; // 0x26
field public static final int GESTURE_4_FINGER_SINGLE_TAP = 37; // 0x25
field public static final int GESTURE_4_FINGER_SWIPE_DOWN = 34; // 0x22
field public static final int GESTURE_4_FINGER_SWIPE_LEFT = 35; // 0x23
field public static final int GESTURE_4_FINGER_SWIPE_RIGHT = 36; // 0x24
field public static final int GESTURE_4_FINGER_SWIPE_UP = 33; // 0x21
field public static final int GESTURE_4_FINGER_TRIPLE_TAP = 39; // 0x27
field public static final int GESTURE_DOUBLE_TAP = 17; // 0x11
field public static final int GESTURE_DOUBLE_TAP_AND_HOLD = 18; // 0x12
field public static final int GESTURE_SWIPE_DOWN = 2; // 0x2

View File

@@ -31,6 +31,13 @@ import static android.accessibilityservice.AccessibilityService.GESTURE_3_FINGER
import static android.accessibilityservice.AccessibilityService.GESTURE_3_FINGER_SWIPE_RIGHT;
import static android.accessibilityservice.AccessibilityService.GESTURE_3_FINGER_SWIPE_UP;
import static android.accessibilityservice.AccessibilityService.GESTURE_3_FINGER_TRIPLE_TAP;
import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_DOUBLE_TAP;
import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_SINGLE_TAP;
import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_SWIPE_DOWN;
import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_SWIPE_LEFT;
import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_SWIPE_RIGHT;
import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_SWIPE_UP;
import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_TRIPLE_TAP;
import static android.accessibilityservice.AccessibilityService.GESTURE_DOUBLE_TAP;
import static android.accessibilityservice.AccessibilityService.GESTURE_DOUBLE_TAP_AND_HOLD;
import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_DOWN;
@@ -105,7 +112,14 @@ public final class AccessibilityGestureEvent implements Parcelable {
GESTURE_3_FINGER_SWIPE_DOWN,
GESTURE_3_FINGER_SWIPE_LEFT,
GESTURE_3_FINGER_SWIPE_RIGHT,
GESTURE_3_FINGER_SWIPE_UP
GESTURE_3_FINGER_SWIPE_UP,
GESTURE_4_FINGER_DOUBLE_TAP,
GESTURE_4_FINGER_SINGLE_TAP,
GESTURE_4_FINGER_SWIPE_DOWN,
GESTURE_4_FINGER_SWIPE_LEFT,
GESTURE_4_FINGER_SWIPE_RIGHT,
GESTURE_4_FINGER_SWIPE_UP,
GESTURE_4_FINGER_TRIPLE_TAP
})
@Retention(RetentionPolicy.SOURCE)
public @interface GestureId {}
@@ -165,6 +179,9 @@ public final class AccessibilityGestureEvent implements Parcelable {
case GESTURE_3_FINGER_SINGLE_TAP: return "GESTURE_3_FINGER_SINGLE_TAP";
case GESTURE_3_FINGER_DOUBLE_TAP: return "GESTURE_3_FINGER_DOUBLE_TAP";
case GESTURE_3_FINGER_TRIPLE_TAP: return "GESTURE_3_FINGER_TRIPLE_TAP";
case GESTURE_4_FINGER_SINGLE_TAP: return "GESTURE_4_FINGER_SINGLE_TAP";
case GESTURE_4_FINGER_DOUBLE_TAP: return "GESTURE_4_FINGER_DOUBLE_TAP";
case GESTURE_4_FINGER_TRIPLE_TAP: return "GESTURE_4_FINGER_TRIPLE_TAP";
case GESTURE_DOUBLE_TAP: return "GESTURE_DOUBLE_TAP";
case GESTURE_DOUBLE_TAP_AND_HOLD: return "GESTURE_DOUBLE_TAP_AND_HOLD";
case GESTURE_SWIPE_DOWN: return "GESTURE_SWIPE_DOWN";
@@ -191,6 +208,10 @@ public final class AccessibilityGestureEvent implements Parcelable {
case GESTURE_3_FINGER_SWIPE_LEFT: return "GESTURE_3_FINGER_SWIPE_LEFT";
case GESTURE_3_FINGER_SWIPE_RIGHT: return "GESTURE_3_FINGER_SWIPE_RIGHT";
case GESTURE_3_FINGER_SWIPE_UP: return "GESTURE_3_FINGER_SWIPE_UP";
case GESTURE_4_FINGER_SWIPE_DOWN: return "GESTURE_4_FINGER_SWIPE_DOWN";
case GESTURE_4_FINGER_SWIPE_LEFT: return "GESTURE_4_FINGER_SWIPE_LEFT";
case GESTURE_4_FINGER_SWIPE_RIGHT: return "GESTURE_4_FINGER_SWIPE_RIGHT";
case GESTURE_4_FINGER_SWIPE_UP: return "GESTURE_4_FINGER_SWIPE_UP";
default: return Integer.toHexString(eventType);
}
}

View File

@@ -388,6 +388,27 @@ public abstract class AccessibilityService extends Service {
*/
public static final int GESTURE_3_FINGER_SWIPE_RIGHT = 32;
/** The user has performed a four-finger swipe up gesture on the touch screen. */
public static final int GESTURE_4_FINGER_SWIPE_UP = 33;
/** The user has performed a four-finger swipe down gesture on the touch screen. */
public static final int GESTURE_4_FINGER_SWIPE_DOWN = 34;
/** The user has performed a four-finger swipe left gesture on the touch screen. */
public static final int GESTURE_4_FINGER_SWIPE_LEFT = 35;
/** The user has performed a four-finger swipe right gesture on the touch screen. */
public static final int GESTURE_4_FINGER_SWIPE_RIGHT = 36;
/** The user has performed a four-finger single tap gesture on the touch screen. */
public static final int GESTURE_4_FINGER_SINGLE_TAP = 37;
/** The user has performed a four-finger double tap gesture on the touch screen. */
public static final int GESTURE_4_FINGER_DOUBLE_TAP = 38;
/** The user has performed a four-finger triple tap gesture on the touch screen. */
public static final int GESTURE_4_FINGER_TRIPLE_TAP = 39;
/**
* The {@link Intent} that must be declared as handled by the service.
*/

View File

@@ -40,7 +40,7 @@ import java.util.List;
*/
public final class GestureDescription {
/** Gestures may contain no more than this many strokes */
private static final int MAX_STROKE_COUNT = 10;
private static final int MAX_STROKE_COUNT = 20;
/**
* Upper bound on total gesture duration. Nearly all gestures will be much shorter.
@@ -194,7 +194,10 @@ public final class GestureDescription {
public Builder addStroke(@NonNull StrokeDescription strokeDescription) {
if (mStrokes.size() >= MAX_STROKE_COUNT) {
throw new IllegalStateException(
"Attempting to add too many strokes to a gesture");
"Attempting to add too many strokes to a gesture. Maximum is "
+ MAX_STROKE_COUNT
+ ", got "
+ mStrokes.size());
}
mStrokes.add(strokeDescription);

View File

@@ -30,6 +30,13 @@ import static android.accessibilityservice.AccessibilityService.GESTURE_3_FINGER
import static android.accessibilityservice.AccessibilityService.GESTURE_3_FINGER_SWIPE_RIGHT;
import static android.accessibilityservice.AccessibilityService.GESTURE_3_FINGER_SWIPE_UP;
import static android.accessibilityservice.AccessibilityService.GESTURE_3_FINGER_TRIPLE_TAP;
import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_DOUBLE_TAP;
import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_SINGLE_TAP;
import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_SWIPE_DOWN;
import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_SWIPE_LEFT;
import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_SWIPE_RIGHT;
import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_SWIPE_UP;
import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_TRIPLE_TAP;
import static android.accessibilityservice.AccessibilityService.GESTURE_DOUBLE_TAP;
import static android.accessibilityservice.AccessibilityService.GESTURE_DOUBLE_TAP_AND_HOLD;
import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_DOWN;
@@ -133,6 +140,13 @@ class GestureManifold implements GestureMatcher.StateChangeListener {
new MultiFingerMultiTap(mContext, 3, 2, GESTURE_3_FINGER_DOUBLE_TAP, this));
mMultiFingerGestures.add(
new MultiFingerMultiTap(mContext, 3, 3, GESTURE_3_FINGER_TRIPLE_TAP, this));
// Four-finger taps.
mMultiFingerGestures.add(
new MultiFingerMultiTap(mContext, 4, 1, GESTURE_4_FINGER_SINGLE_TAP, this));
mMultiFingerGestures.add(
new MultiFingerMultiTap(mContext, 4, 2, GESTURE_4_FINGER_DOUBLE_TAP, this));
mMultiFingerGestures.add(
new MultiFingerMultiTap(mContext, 4, 3, GESTURE_4_FINGER_TRIPLE_TAP, this));
// Two-finger swipes.
mMultiFingerGestures.add(
new MultiFingerSwipe(context, 2, DOWN, GESTURE_2_FINGER_SWIPE_DOWN, this));
@@ -151,6 +165,15 @@ class GestureManifold implements GestureMatcher.StateChangeListener {
new MultiFingerSwipe(context, 3, RIGHT, GESTURE_3_FINGER_SWIPE_RIGHT, this));
mMultiFingerGestures.add(
new MultiFingerSwipe(context, 3, UP, GESTURE_3_FINGER_SWIPE_UP, this));
// Four-finger swipes.
mMultiFingerGestures.add(
new MultiFingerSwipe(context, 4, DOWN, GESTURE_4_FINGER_SWIPE_DOWN, this));
mMultiFingerGestures.add(
new MultiFingerSwipe(context, 4, LEFT, GESTURE_4_FINGER_SWIPE_LEFT, this));
mMultiFingerGestures.add(
new MultiFingerSwipe(context, 4, RIGHT, GESTURE_4_FINGER_SWIPE_RIGHT, this));
mMultiFingerGestures.add(
new MultiFingerSwipe(context, 4, UP, GESTURE_4_FINGER_SWIPE_UP, this));
}
/**

View File

@@ -139,7 +139,7 @@ class MultiFingerSwipe extends GestureMatcher {
final int actionIndex = getActionIndex(rawEvent);
final int pointerId = rawEvent.getPointerId(actionIndex);
int pointerIndex = rawEvent.getPointerCount() - 1;
if (pointerId < 0 || pointerId > rawEvent.getPointerCount() - 1) {
if (pointerId < 0) {
// Nonsensical pointer id.
cancelGesture(event, rawEvent, policyFlags);
return;
@@ -185,7 +185,7 @@ class MultiFingerSwipe extends GestureMatcher {
}
final int actionIndex = getActionIndex(rawEvent);
final int pointerId = rawEvent.getPointerId(actionIndex);
if (pointerId < 0 || pointerId > rawEvent.getPointerCount() - 1) {
if (pointerId < 0) {
// Nonsensical pointer id.
cancelGesture(event, rawEvent, policyFlags);
return;
@@ -224,7 +224,7 @@ class MultiFingerSwipe extends GestureMatcher {
mCurrentFingerCount -= 1;
final int actionIndex = getActionIndex(event);
final int pointerId = event.getPointerId(actionIndex);
if (pointerId < 0 || pointerId > rawEvent.getPointerCount() - 1) {
if (pointerId < 0) {
// Nonsensical pointer id.
cancelGesture(event, rawEvent, policyFlags);
return;