1 /* 2 * Copyright (C) 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.accessibilityservice; 18 19 20 import static android.accessibilityservice.AccessibilityService.GESTURE_2_FINGER_DOUBLE_TAP; 21 import static android.accessibilityservice.AccessibilityService.GESTURE_2_FINGER_DOUBLE_TAP_AND_HOLD; 22 import static android.accessibilityservice.AccessibilityService.GESTURE_2_FINGER_SINGLE_TAP; 23 import static android.accessibilityservice.AccessibilityService.GESTURE_2_FINGER_SWIPE_DOWN; 24 import static android.accessibilityservice.AccessibilityService.GESTURE_2_FINGER_SWIPE_LEFT; 25 import static android.accessibilityservice.AccessibilityService.GESTURE_2_FINGER_SWIPE_RIGHT; 26 import static android.accessibilityservice.AccessibilityService.GESTURE_2_FINGER_SWIPE_UP; 27 import static android.accessibilityservice.AccessibilityService.GESTURE_2_FINGER_TRIPLE_TAP; 28 import static android.accessibilityservice.AccessibilityService.GESTURE_3_FINGER_DOUBLE_TAP; 29 import static android.accessibilityservice.AccessibilityService.GESTURE_3_FINGER_DOUBLE_TAP_AND_HOLD; 30 import static android.accessibilityservice.AccessibilityService.GESTURE_3_FINGER_SINGLE_TAP; 31 import static android.accessibilityservice.AccessibilityService.GESTURE_3_FINGER_SWIPE_DOWN; 32 import static android.accessibilityservice.AccessibilityService.GESTURE_3_FINGER_SWIPE_LEFT; 33 import static android.accessibilityservice.AccessibilityService.GESTURE_3_FINGER_SWIPE_RIGHT; 34 import static android.accessibilityservice.AccessibilityService.GESTURE_3_FINGER_SWIPE_UP; 35 import static android.accessibilityservice.AccessibilityService.GESTURE_3_FINGER_TRIPLE_TAP; 36 import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_DOUBLE_TAP; 37 import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_DOUBLE_TAP_AND_HOLD; 38 import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_SINGLE_TAP; 39 import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_SWIPE_DOWN; 40 import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_SWIPE_LEFT; 41 import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_SWIPE_RIGHT; 42 import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_SWIPE_UP; 43 import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_TRIPLE_TAP; 44 import static android.accessibilityservice.AccessibilityService.GESTURE_DOUBLE_TAP; 45 import static android.accessibilityservice.AccessibilityService.GESTURE_DOUBLE_TAP_AND_HOLD; 46 import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_DOWN; 47 import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_DOWN_AND_LEFT; 48 import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_DOWN_AND_RIGHT; 49 import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_DOWN_AND_UP; 50 import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_LEFT; 51 import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_LEFT_AND_DOWN; 52 import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_LEFT_AND_RIGHT; 53 import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_LEFT_AND_UP; 54 import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_RIGHT; 55 import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_RIGHT_AND_DOWN; 56 import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_RIGHT_AND_LEFT; 57 import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_RIGHT_AND_UP; 58 import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_UP; 59 import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_UP_AND_DOWN; 60 import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_UP_AND_LEFT; 61 import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_UP_AND_RIGHT; 62 63 import android.annotation.IntDef; 64 import android.annotation.NonNull; 65 import android.annotation.TestApi; 66 import android.os.Parcel; 67 import android.os.Parcelable; 68 69 import java.lang.annotation.Retention; 70 import java.lang.annotation.RetentionPolicy; 71 72 /** 73 * This class describes the gesture event including gesture id and which display it happens 74 * on. 75 * <p> 76 * <strong>Note:</strong> Accessibility services setting the 77 * {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_REQUEST_TOUCH_EXPLORATION_MODE} 78 * flag can receive gestures. 79 * 80 * @see AccessibilityService#onGesture(AccessibilityGestureEvent) 81 */ 82 83 public final class AccessibilityGestureEvent implements Parcelable { 84 85 /** @hide */ 86 @IntDef(prefix = { "GESTURE_" }, value = { 87 GESTURE_2_FINGER_SINGLE_TAP, 88 GESTURE_2_FINGER_DOUBLE_TAP, 89 GESTURE_2_FINGER_DOUBLE_TAP_AND_HOLD, 90 GESTURE_2_FINGER_TRIPLE_TAP, 91 GESTURE_3_FINGER_SINGLE_TAP, 92 GESTURE_3_FINGER_DOUBLE_TAP, 93 GESTURE_3_FINGER_DOUBLE_TAP_AND_HOLD, 94 GESTURE_3_FINGER_TRIPLE_TAP, 95 GESTURE_DOUBLE_TAP, 96 GESTURE_DOUBLE_TAP_AND_HOLD, 97 GESTURE_SWIPE_UP, 98 GESTURE_SWIPE_UP_AND_LEFT, 99 GESTURE_SWIPE_UP_AND_DOWN, 100 GESTURE_SWIPE_UP_AND_RIGHT, 101 GESTURE_SWIPE_DOWN, 102 GESTURE_SWIPE_DOWN_AND_LEFT, 103 GESTURE_SWIPE_DOWN_AND_UP, 104 GESTURE_SWIPE_DOWN_AND_RIGHT, 105 GESTURE_SWIPE_LEFT, 106 GESTURE_SWIPE_LEFT_AND_UP, 107 GESTURE_SWIPE_LEFT_AND_RIGHT, 108 GESTURE_SWIPE_LEFT_AND_DOWN, 109 GESTURE_SWIPE_RIGHT, 110 GESTURE_SWIPE_RIGHT_AND_UP, 111 GESTURE_SWIPE_RIGHT_AND_LEFT, 112 GESTURE_SWIPE_RIGHT_AND_DOWN, 113 GESTURE_2_FINGER_SWIPE_DOWN, 114 GESTURE_2_FINGER_SWIPE_LEFT, 115 GESTURE_2_FINGER_SWIPE_RIGHT, 116 GESTURE_2_FINGER_SWIPE_UP, 117 GESTURE_3_FINGER_SWIPE_DOWN, 118 GESTURE_3_FINGER_SWIPE_LEFT, 119 GESTURE_3_FINGER_SWIPE_RIGHT, 120 GESTURE_3_FINGER_SWIPE_UP, 121 GESTURE_4_FINGER_DOUBLE_TAP, 122 GESTURE_4_FINGER_DOUBLE_TAP_AND_HOLD, 123 GESTURE_4_FINGER_SINGLE_TAP, 124 GESTURE_4_FINGER_SWIPE_DOWN, 125 GESTURE_4_FINGER_SWIPE_LEFT, 126 GESTURE_4_FINGER_SWIPE_RIGHT, 127 GESTURE_4_FINGER_SWIPE_UP, 128 GESTURE_4_FINGER_TRIPLE_TAP 129 }) 130 @Retention(RetentionPolicy.SOURCE) 131 public @interface GestureId {} 132 133 @GestureId 134 private final int mGestureId; 135 private final int mDisplayId; 136 137 /** @hide */ 138 @TestApi AccessibilityGestureEvent(int gestureId, int displayId)139 public AccessibilityGestureEvent(int gestureId, int displayId) { 140 mGestureId = gestureId; 141 mDisplayId = displayId; 142 } 143 AccessibilityGestureEvent(@onNull Parcel parcel)144 private AccessibilityGestureEvent(@NonNull Parcel parcel) { 145 mGestureId = parcel.readInt(); 146 mDisplayId = parcel.readInt(); 147 } 148 149 /** 150 * Returns the display id of the received-gesture display, for use with 151 * {@link android.hardware.display.DisplayManager#getDisplay(int)}. 152 * 153 * @return the display id. 154 */ getDisplayId()155 public int getDisplayId() { 156 return mDisplayId; 157 } 158 159 /** 160 * Returns performed gesture id. 161 * 162 * @return the performed gesture id. 163 * 164 */ getGestureId()165 @GestureId public int getGestureId() { 166 return mGestureId; 167 } 168 169 @NonNull 170 @Override toString()171 public String toString() { 172 StringBuilder stringBuilder = new StringBuilder("AccessibilityGestureEvent["); 173 stringBuilder.append("gestureId: ").append(eventTypeToString(mGestureId)); 174 stringBuilder.append(", "); 175 stringBuilder.append("displayId: ").append(mDisplayId); 176 stringBuilder.append(']'); 177 return stringBuilder.toString(); 178 } 179 eventTypeToString(int eventType)180 private static String eventTypeToString(int eventType) { 181 switch (eventType) { 182 case GESTURE_2_FINGER_SINGLE_TAP: return "GESTURE_2_FINGER_SINGLE_TAP"; 183 case GESTURE_2_FINGER_DOUBLE_TAP: return "GESTURE_2_FINGER_DOUBLE_TAP"; 184 case GESTURE_2_FINGER_DOUBLE_TAP_AND_HOLD: 185 return "GESTURE_2_FINGER_DOUBLE_TAP_AND_HOLD"; 186 case GESTURE_2_FINGER_TRIPLE_TAP: return "GESTURE_2_FINGER_TRIPLE_TAP"; 187 case GESTURE_3_FINGER_SINGLE_TAP: return "GESTURE_3_FINGER_SINGLE_TAP"; 188 case GESTURE_3_FINGER_DOUBLE_TAP: return "GESTURE_3_FINGER_DOUBLE_TAP"; 189 case GESTURE_3_FINGER_DOUBLE_TAP_AND_HOLD: 190 return "GESTURE_3_FINGER_DOUBLE_TAP_AND_HOLD"; 191 case GESTURE_3_FINGER_TRIPLE_TAP: return "GESTURE_3_FINGER_TRIPLE_TAP"; 192 case GESTURE_4_FINGER_SINGLE_TAP: return "GESTURE_4_FINGER_SINGLE_TAP"; 193 case GESTURE_4_FINGER_DOUBLE_TAP: return "GESTURE_4_FINGER_DOUBLE_TAP"; 194 case GESTURE_4_FINGER_DOUBLE_TAP_AND_HOLD: 195 return "GESTURE_4_FINGER_DOUBLE_TAP_AND_HOLD"; 196 case GESTURE_4_FINGER_TRIPLE_TAP: return "GESTURE_4_FINGER_TRIPLE_TAP"; 197 case GESTURE_DOUBLE_TAP: return "GESTURE_DOUBLE_TAP"; 198 case GESTURE_DOUBLE_TAP_AND_HOLD: return "GESTURE_DOUBLE_TAP_AND_HOLD"; 199 case GESTURE_SWIPE_DOWN: return "GESTURE_SWIPE_DOWN"; 200 case GESTURE_SWIPE_DOWN_AND_LEFT: return "GESTURE_SWIPE_DOWN_AND_LEFT"; 201 case GESTURE_SWIPE_DOWN_AND_UP: return "GESTURE_SWIPE_DOWN_AND_UP"; 202 case GESTURE_SWIPE_DOWN_AND_RIGHT: return "GESTURE_SWIPE_DOWN_AND_RIGHT"; 203 case GESTURE_SWIPE_LEFT: return "GESTURE_SWIPE_LEFT"; 204 case GESTURE_SWIPE_LEFT_AND_UP: return "GESTURE_SWIPE_LEFT_AND_UP"; 205 case GESTURE_SWIPE_LEFT_AND_RIGHT: return "GESTURE_SWIPE_LEFT_AND_RIGHT"; 206 case GESTURE_SWIPE_LEFT_AND_DOWN: return "GESTURE_SWIPE_LEFT_AND_DOWN"; 207 case GESTURE_SWIPE_RIGHT: return "GESTURE_SWIPE_RIGHT"; 208 case GESTURE_SWIPE_RIGHT_AND_UP: return "GESTURE_SWIPE_RIGHT_AND_UP"; 209 case GESTURE_SWIPE_RIGHT_AND_LEFT: return "GESTURE_SWIPE_RIGHT_AND_LEFT"; 210 case GESTURE_SWIPE_RIGHT_AND_DOWN: return "GESTURE_SWIPE_RIGHT_AND_DOWN"; 211 case GESTURE_SWIPE_UP: return "GESTURE_SWIPE_UP"; 212 case GESTURE_SWIPE_UP_AND_LEFT: return "GESTURE_SWIPE_UP_AND_LEFT"; 213 case GESTURE_SWIPE_UP_AND_DOWN: return "GESTURE_SWIPE_UP_AND_DOWN"; 214 case GESTURE_SWIPE_UP_AND_RIGHT: return "GESTURE_SWIPE_UP_AND_RIGHT"; 215 case GESTURE_2_FINGER_SWIPE_DOWN: return "GESTURE_2_FINGER_SWIPE_DOWN"; 216 case GESTURE_2_FINGER_SWIPE_LEFT: return "GESTURE_2_FINGER_SWIPE_LEFT"; 217 case GESTURE_2_FINGER_SWIPE_RIGHT: return "GESTURE_2_FINGER_SWIPE_RIGHT"; 218 case GESTURE_2_FINGER_SWIPE_UP: return "GESTURE_2_FINGER_SWIPE_UP"; 219 case GESTURE_3_FINGER_SWIPE_DOWN: return "GESTURE_3_FINGER_SWIPE_DOWN"; 220 case GESTURE_3_FINGER_SWIPE_LEFT: return "GESTURE_3_FINGER_SWIPE_LEFT"; 221 case GESTURE_3_FINGER_SWIPE_RIGHT: return "GESTURE_3_FINGER_SWIPE_RIGHT"; 222 case GESTURE_3_FINGER_SWIPE_UP: return "GESTURE_3_FINGER_SWIPE_UP"; 223 case GESTURE_4_FINGER_SWIPE_DOWN: return "GESTURE_4_FINGER_SWIPE_DOWN"; 224 case GESTURE_4_FINGER_SWIPE_LEFT: return "GESTURE_4_FINGER_SWIPE_LEFT"; 225 case GESTURE_4_FINGER_SWIPE_RIGHT: return "GESTURE_4_FINGER_SWIPE_RIGHT"; 226 case GESTURE_4_FINGER_SWIPE_UP: return "GESTURE_4_FINGER_SWIPE_UP"; 227 default: return Integer.toHexString(eventType); 228 } 229 } 230 231 /** 232 * {@inheritDoc} 233 */ 234 @Override describeContents()235 public int describeContents() { 236 return 0; 237 } 238 239 @Override writeToParcel(@onNull Parcel parcel, int flags)240 public void writeToParcel(@NonNull Parcel parcel, int flags) { 241 parcel.writeInt(mGestureId); 242 parcel.writeInt(mDisplayId); 243 } 244 245 /** 246 * @see Parcelable.Creator 247 */ 248 public static final @NonNull Parcelable.Creator<AccessibilityGestureEvent> CREATOR = 249 new Parcelable.Creator<AccessibilityGestureEvent>() { 250 public AccessibilityGestureEvent createFromParcel(Parcel parcel) { 251 return new AccessibilityGestureEvent(parcel); 252 } 253 254 public AccessibilityGestureEvent[] newArray(int size) { 255 return new AccessibilityGestureEvent[size]; 256 } 257 }; 258 259 } 260