1 /* 2 * Copyright 2024 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.hardware.input; 18 19 import android.annotation.IntDef; 20 import android.annotation.NonNull; 21 import android.annotation.Nullable; 22 import android.app.role.RoleManager; 23 import android.content.Intent; 24 import android.view.Display; 25 import android.view.KeyCharacterMap; 26 27 import com.android.internal.util.FrameworkStatsLog; 28 29 import java.lang.annotation.Retention; 30 import java.lang.annotation.RetentionPolicy; 31 import java.util.Objects; 32 33 /** 34 * Provides information about the keyboard gesture event being triggered by an external keyboard. 35 * 36 * @hide 37 */ 38 public final class KeyGestureEvent { 39 40 @NonNull 41 private AidlKeyGestureEvent mKeyGestureEvent; 42 43 private static final int LOG_EVENT_UNSPECIFIED = 44 FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__UNSPECIFIED; 45 46 // Used as a placeholder to identify if a gesture is reserved for system 47 public static final int KEY_GESTURE_TYPE_SYSTEM_RESERVED = -1; 48 49 // These values should not change and values should not be re-used as this data is persisted to 50 // long term storage and must be kept backwards compatible. 51 public static final int KEY_GESTURE_TYPE_UNSPECIFIED = 0; 52 public static final int KEY_GESTURE_TYPE_HOME = 1; 53 public static final int KEY_GESTURE_TYPE_RECENT_APPS = 2; 54 public static final int KEY_GESTURE_TYPE_BACK = 3; 55 public static final int KEY_GESTURE_TYPE_APP_SWITCH = 4; 56 public static final int KEY_GESTURE_TYPE_LAUNCH_ASSISTANT = 5; 57 public static final int KEY_GESTURE_TYPE_LAUNCH_VOICE_ASSISTANT = 6; 58 public static final int KEY_GESTURE_TYPE_LAUNCH_SYSTEM_SETTINGS = 7; 59 public static final int KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL = 8; 60 public static final int KEY_GESTURE_TYPE_TOGGLE_TASKBAR = 9; 61 public static final int KEY_GESTURE_TYPE_TAKE_SCREENSHOT = 10; 62 public static final int KEY_GESTURE_TYPE_SCREENSHOT_CHORD = 11; 63 public static final int KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER = 12; 64 public static final int KEY_GESTURE_TYPE_BRIGHTNESS_UP = 13; 65 public static final int KEY_GESTURE_TYPE_BRIGHTNESS_DOWN = 14; 66 public static final int KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_UP = 15; 67 public static final int KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_DOWN = 16; 68 public static final int KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_TOGGLE = 17; 69 public static final int KEY_GESTURE_TYPE_VOLUME_UP = 18; 70 public static final int KEY_GESTURE_TYPE_VOLUME_DOWN = 19; 71 public static final int KEY_GESTURE_TYPE_VOLUME_MUTE = 20; 72 public static final int KEY_GESTURE_TYPE_ALL_APPS = 21; 73 public static final int KEY_GESTURE_TYPE_LAUNCH_SEARCH = 22; 74 public static final int KEY_GESTURE_TYPE_LANGUAGE_SWITCH = 23; 75 @Deprecated 76 public static final int DEPRECATED_KEY_GESTURE_TYPE_ACCESSIBILITY_ALL_APPS = 24; 77 public static final int KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK = 25; 78 public static final int KEY_GESTURE_TYPE_SYSTEM_MUTE = 26; 79 public static final int KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_LEFT = 27; 80 public static final int KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_RIGHT = 28; 81 public static final int KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_LEFT = 29; 82 public static final int KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_RIGHT = 30; 83 public static final int KEY_GESTURE_TYPE_TRIGGER_BUG_REPORT = 31; 84 public static final int KEY_GESTURE_TYPE_LOCK_SCREEN = 32; 85 public static final int KEY_GESTURE_TYPE_OPEN_NOTES = 33; 86 public static final int KEY_GESTURE_TYPE_TOGGLE_POWER = 34; 87 public static final int KEY_GESTURE_TYPE_SYSTEM_NAVIGATION = 35; 88 public static final int KEY_GESTURE_TYPE_SLEEP = 36; 89 public static final int KEY_GESTURE_TYPE_WAKEUP = 37; 90 public static final int KEY_GESTURE_TYPE_MEDIA_KEY = 38; 91 // TODO(b/280423320): Remove "LAUNCH_DEFAULT_..." gestures and rely on launch intent to find 92 // the correct logging event. 93 public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_BROWSER = 39; 94 public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_EMAIL = 40; 95 public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CONTACTS = 41; 96 public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CALENDAR = 42; 97 public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CALCULATOR = 43; 98 public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MUSIC = 44; 99 public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MAPS = 45; 100 public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MESSAGING = 46; 101 public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_GALLERY = 47; 102 public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FILES = 48; 103 public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_WEATHER = 49; 104 public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FITNESS = 50; 105 public static final int KEY_GESTURE_TYPE_LAUNCH_APPLICATION = 51; 106 public static final int KEY_GESTURE_TYPE_DESKTOP_MODE = 52; 107 public static final int KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION = 53; 108 public static final int KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER = 54; 109 public static final int KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD = 55; 110 public static final int KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD = 56; 111 public static final int KEY_GESTURE_TYPE_GLOBAL_ACTIONS = 57; 112 @Deprecated 113 public static final int DEPRECATED_KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD = 58; 114 public static final int KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT = 59; 115 public static final int KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT = 60; 116 public static final int KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS = 61; 117 public static final int KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY = 62; 118 public static final int KEY_GESTURE_TYPE_TOGGLE_TALKBACK = 63; 119 public static final int KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS = 64; 120 public static final int KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS = 65; 121 public static final int KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS = 66; 122 public static final int KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS = 67; 123 public static final int KEY_GESTURE_TYPE_SNAP_LEFT_FREEFORM_WINDOW = 68; 124 public static final int KEY_GESTURE_TYPE_SNAP_RIGHT_FREEFORM_WINDOW = 69; 125 public static final int KEY_GESTURE_TYPE_MINIMIZE_FREEFORM_WINDOW = 70; 126 public static final int KEY_GESTURE_TYPE_TOGGLE_MAXIMIZE_FREEFORM_WINDOW = 71; 127 public static final int KEY_GESTURE_TYPE_TOGGLE_MAGNIFICATION = 72; 128 public static final int KEY_GESTURE_TYPE_ACTIVATE_SELECT_TO_SPEAK = 73; 129 public static final int KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW = 74; 130 public static final int KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB = 75; 131 public static final int KEY_GESTURE_TYPE_TOGGLE_VOICE_ACCESS = 76; 132 133 public static final int FLAG_CANCELLED = 1; 134 135 // NOTE: Valid KeyGestureEvent streams: 136 // - GESTURE_START -> GESTURE_CANCEL 137 // - GESTURE_START -> GESTURE_COMPLETE 138 // - GESTURE_COMPLETE 139 140 /** Key gesture started (e.g. Key down of the relevant key) */ 141 public static final int ACTION_GESTURE_START = 1; 142 /** Key gesture completed (e.g. Key up of the relevant key) */ 143 public static final int ACTION_GESTURE_COMPLETE = 2; 144 145 @IntDef(prefix = "KEY_GESTURE_TYPE_", value = { 146 KEY_GESTURE_TYPE_SYSTEM_RESERVED, 147 KEY_GESTURE_TYPE_UNSPECIFIED, 148 KEY_GESTURE_TYPE_HOME, 149 KEY_GESTURE_TYPE_RECENT_APPS, 150 KEY_GESTURE_TYPE_BACK, 151 KEY_GESTURE_TYPE_APP_SWITCH, 152 KEY_GESTURE_TYPE_LAUNCH_ASSISTANT, 153 KEY_GESTURE_TYPE_LAUNCH_VOICE_ASSISTANT, 154 KEY_GESTURE_TYPE_LAUNCH_SYSTEM_SETTINGS, 155 KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL, 156 KEY_GESTURE_TYPE_TOGGLE_TASKBAR, 157 KEY_GESTURE_TYPE_TAKE_SCREENSHOT, 158 KEY_GESTURE_TYPE_SCREENSHOT_CHORD, 159 KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER, 160 KEY_GESTURE_TYPE_BRIGHTNESS_UP, 161 KEY_GESTURE_TYPE_BRIGHTNESS_DOWN, 162 KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_UP, 163 KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_DOWN, 164 KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_TOGGLE, 165 KEY_GESTURE_TYPE_VOLUME_UP, 166 KEY_GESTURE_TYPE_VOLUME_DOWN, 167 KEY_GESTURE_TYPE_VOLUME_MUTE, 168 KEY_GESTURE_TYPE_ALL_APPS, 169 KEY_GESTURE_TYPE_LAUNCH_SEARCH, 170 KEY_GESTURE_TYPE_LANGUAGE_SWITCH, 171 KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK, 172 KEY_GESTURE_TYPE_SYSTEM_MUTE, 173 KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_LEFT, 174 KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_RIGHT, 175 KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_LEFT, 176 KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_RIGHT, 177 KEY_GESTURE_TYPE_TRIGGER_BUG_REPORT, 178 KEY_GESTURE_TYPE_LOCK_SCREEN, 179 KEY_GESTURE_TYPE_OPEN_NOTES, 180 KEY_GESTURE_TYPE_TOGGLE_POWER, 181 KEY_GESTURE_TYPE_SYSTEM_NAVIGATION, 182 KEY_GESTURE_TYPE_SLEEP, 183 KEY_GESTURE_TYPE_WAKEUP, 184 KEY_GESTURE_TYPE_MEDIA_KEY, 185 KEY_GESTURE_TYPE_LAUNCH_DEFAULT_BROWSER, 186 KEY_GESTURE_TYPE_LAUNCH_DEFAULT_EMAIL, 187 KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CONTACTS, 188 KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CALENDAR, 189 KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CALCULATOR, 190 KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MUSIC, 191 KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MAPS, 192 KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MESSAGING, 193 KEY_GESTURE_TYPE_LAUNCH_DEFAULT_GALLERY, 194 KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FILES, 195 KEY_GESTURE_TYPE_LAUNCH_DEFAULT_WEATHER, 196 KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FITNESS, 197 KEY_GESTURE_TYPE_LAUNCH_APPLICATION, 198 KEY_GESTURE_TYPE_DESKTOP_MODE, 199 KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION, 200 KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER, 201 KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD, 202 KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD, 203 KEY_GESTURE_TYPE_GLOBAL_ACTIONS, 204 KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT, 205 KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT, 206 KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS, 207 KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY, 208 KEY_GESTURE_TYPE_TOGGLE_TALKBACK, 209 KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS, 210 KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS, 211 KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS, 212 KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS, 213 KEY_GESTURE_TYPE_SNAP_LEFT_FREEFORM_WINDOW, 214 KEY_GESTURE_TYPE_SNAP_RIGHT_FREEFORM_WINDOW, 215 KEY_GESTURE_TYPE_MINIMIZE_FREEFORM_WINDOW, 216 KEY_GESTURE_TYPE_TOGGLE_MAXIMIZE_FREEFORM_WINDOW, 217 KEY_GESTURE_TYPE_TOGGLE_MAGNIFICATION, 218 KEY_GESTURE_TYPE_ACTIVATE_SELECT_TO_SPEAK, 219 KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW, 220 KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB, 221 KEY_GESTURE_TYPE_TOGGLE_VOICE_ACCESS, 222 }) 223 @Retention(RetentionPolicy.SOURCE) 224 public @interface KeyGestureType { 225 } 226 227 /** 228 * Returns whether the key gesture type passed as argument is allowed for visible background 229 * users. 230 * 231 * @hide 232 */ isVisibleBackgrounduserAllowedGesture(int keyGestureType)233 public static boolean isVisibleBackgrounduserAllowedGesture(int keyGestureType) { 234 switch (keyGestureType) { 235 case KEY_GESTURE_TYPE_SLEEP: 236 case KEY_GESTURE_TYPE_WAKEUP: 237 case KEY_GESTURE_TYPE_LAUNCH_ASSISTANT: 238 case KEY_GESTURE_TYPE_LAUNCH_VOICE_ASSISTANT: 239 case KEY_GESTURE_TYPE_VOLUME_MUTE: 240 case KEY_GESTURE_TYPE_RECENT_APPS: 241 case KEY_GESTURE_TYPE_APP_SWITCH: 242 return false; 243 } 244 return true; 245 } 246 KeyGestureEvent(@onNull AidlKeyGestureEvent keyGestureEvent)247 public KeyGestureEvent(@NonNull AidlKeyGestureEvent keyGestureEvent) { 248 this.mKeyGestureEvent = keyGestureEvent; 249 } 250 251 /** 252 * Tests whether this keyboard shortcut event has the given modifiers (i.e. all of the given 253 * modifiers were pressed when this shortcut was triggered). 254 */ hasModifiers(int modifiers)255 public boolean hasModifiers(int modifiers) { 256 return (getModifierState() & modifiers) == modifiers; 257 } 258 259 /** 260 * Key gesture event builder used to create a KeyGestureEvent for tests in Java. 261 * 262 * @hide 263 */ 264 public static class Builder { 265 private int mDeviceId = KeyCharacterMap.VIRTUAL_KEYBOARD; 266 private int[] mKeycodes = new int[0]; 267 private int mModifierState = 0; 268 @KeyGestureType 269 private int mKeyGestureType = KeyGestureEvent.KEY_GESTURE_TYPE_UNSPECIFIED; 270 private int mAction = KeyGestureEvent.ACTION_GESTURE_COMPLETE; 271 private int mDisplayId = Display.DEFAULT_DISPLAY; 272 private int mFlags = 0; 273 @Nullable 274 private AppLaunchData mAppLaunchData = null; 275 276 /** 277 * @see KeyGestureEvent#getDeviceId() 278 */ setDeviceId(int deviceId)279 public Builder setDeviceId(int deviceId) { 280 mDeviceId = deviceId; 281 return this; 282 } 283 284 /** 285 * @see KeyGestureEvent#getKeycodes() 286 */ setKeycodes(@onNull int[] keycodes)287 public Builder setKeycodes(@NonNull int[] keycodes) { 288 mKeycodes = keycodes; 289 return this; 290 } 291 292 /** 293 * @see KeyGestureEvent#getModifierState() 294 */ setModifierState(int modifierState)295 public Builder setModifierState(int modifierState) { 296 mModifierState = modifierState; 297 return this; 298 } 299 300 /** 301 * @see KeyGestureEvent#getKeyGestureType() 302 */ setKeyGestureType(@eyGestureEvent.KeyGestureType int keyGestureType)303 public Builder setKeyGestureType(@KeyGestureEvent.KeyGestureType int keyGestureType) { 304 mKeyGestureType = keyGestureType; 305 return this; 306 } 307 308 /** 309 * @see KeyGestureEvent#getAction() 310 */ setAction(int action)311 public Builder setAction(int action) { 312 mAction = action; 313 return this; 314 } 315 316 /** 317 * @see KeyGestureEvent#getDisplayId() 318 */ setDisplayId(int displayId)319 public Builder setDisplayId(int displayId) { 320 mDisplayId = displayId; 321 return this; 322 } 323 324 /** 325 * @see KeyGestureEvent#getFlags() 326 */ setFlags(int flags)327 public Builder setFlags(int flags) { 328 mFlags = flags; 329 return this; 330 } 331 332 /** 333 * @see KeyGestureEvent#getAppLaunchData() 334 */ setAppLaunchData(@onNull AppLaunchData appLaunchData)335 public Builder setAppLaunchData(@NonNull AppLaunchData appLaunchData) { 336 mAppLaunchData = appLaunchData; 337 return this; 338 } 339 340 /** 341 * Build {@link KeyGestureEvent} 342 */ build()343 public KeyGestureEvent build() { 344 AidlKeyGestureEvent event = new AidlKeyGestureEvent(); 345 event.deviceId = mDeviceId; 346 event.keycodes = mKeycodes; 347 event.modifierState = mModifierState; 348 event.gestureType = mKeyGestureType; 349 event.action = mAction; 350 event.displayId = mDisplayId; 351 event.flags = mFlags; 352 if (mAppLaunchData != null) { 353 if (mAppLaunchData instanceof AppLaunchData.CategoryData) { 354 event.appLaunchCategory = 355 ((AppLaunchData.CategoryData) mAppLaunchData).getCategory(); 356 } else if (mAppLaunchData instanceof AppLaunchData.RoleData) { 357 event.appLaunchRole = ((AppLaunchData.RoleData) mAppLaunchData).getRole(); 358 } else if (mAppLaunchData instanceof AppLaunchData.ComponentData) { 359 event.appLaunchPackageName = 360 ((AppLaunchData.ComponentData) mAppLaunchData).getPackageName(); 361 event.appLaunchClassName = 362 ((AppLaunchData.ComponentData) mAppLaunchData).getClassName(); 363 } else { 364 throw new IllegalArgumentException("AppLaunchData type is invalid!"); 365 } 366 } 367 return new KeyGestureEvent(event); 368 } 369 } 370 getDeviceId()371 public int getDeviceId() { 372 return mKeyGestureEvent.deviceId; 373 } 374 getKeycodes()375 public @NonNull int[] getKeycodes() { 376 return mKeyGestureEvent.keycodes; 377 } 378 getModifierState()379 public int getModifierState() { 380 return mKeyGestureEvent.modifierState; 381 } 382 getKeyGestureType()383 public @KeyGestureType int getKeyGestureType() { 384 return mKeyGestureEvent.gestureType; 385 } 386 getAction()387 public int getAction() { 388 return mKeyGestureEvent.action; 389 } 390 getDisplayId()391 public int getDisplayId() { 392 return mKeyGestureEvent.displayId; 393 } 394 getFlags()395 public int getFlags() { 396 return mKeyGestureEvent.flags; 397 } 398 isCancelled()399 public boolean isCancelled() { 400 return (mKeyGestureEvent.flags & FLAG_CANCELLED) != 0; 401 } 402 getLogEvent()403 public int getLogEvent() { 404 if (getKeyGestureType() == KEY_GESTURE_TYPE_LAUNCH_APPLICATION) { 405 return getLogEventFromLaunchAppData(getAppLaunchData()); 406 } 407 return keyGestureTypeToLogEvent(getKeyGestureType()); 408 } 409 410 /** 411 * @return Launch app data associated with the event, only if key gesture type is 412 * {@code KEY_GESTURE_TYPE_LAUNCH_APPLICATION} 413 */ 414 @Nullable getAppLaunchData()415 public AppLaunchData getAppLaunchData() { 416 if (mKeyGestureEvent.gestureType != KEY_GESTURE_TYPE_LAUNCH_APPLICATION) { 417 return null; 418 } 419 return AppLaunchData.createLaunchData(mKeyGestureEvent.appLaunchCategory, 420 mKeyGestureEvent.appLaunchRole, mKeyGestureEvent.appLaunchPackageName, 421 mKeyGestureEvent.appLaunchClassName); 422 } 423 424 @Override toString()425 public String toString() { 426 return "KeyGestureEvent { " 427 + "deviceId = " + mKeyGestureEvent.deviceId + ", " 428 + "keycodes = " + java.util.Arrays.toString(mKeyGestureEvent.keycodes) + ", " 429 + "modifierState = " + mKeyGestureEvent.modifierState + ", " 430 + "keyGestureType = " + keyGestureTypeToString(mKeyGestureEvent.gestureType) + ", " 431 + "action = " + mKeyGestureEvent.action + ", " 432 + "displayId = " + mKeyGestureEvent.displayId + ", " 433 + "flags = " + mKeyGestureEvent.flags + ", " 434 + "appLaunchData = " + getAppLaunchData() 435 + " }"; 436 } 437 438 @Override equals(@ullable Object o)439 public boolean equals(@Nullable Object o) { 440 if (this == o) return true; 441 if (o == null || getClass() != o.getClass()) return false; 442 KeyGestureEvent that = (KeyGestureEvent) o; 443 return mKeyGestureEvent.deviceId == that.mKeyGestureEvent.deviceId 444 && java.util.Arrays.equals(mKeyGestureEvent.keycodes, that.mKeyGestureEvent.keycodes) 445 && mKeyGestureEvent.modifierState == that.mKeyGestureEvent.modifierState 446 && mKeyGestureEvent.gestureType == that.mKeyGestureEvent.gestureType 447 && mKeyGestureEvent.action == that.mKeyGestureEvent.action 448 && mKeyGestureEvent.displayId == that.mKeyGestureEvent.displayId 449 && mKeyGestureEvent.flags == that.mKeyGestureEvent.flags 450 && Objects.equals(mKeyGestureEvent.appLaunchCategory, that.mKeyGestureEvent.appLaunchCategory) 451 && Objects.equals(mKeyGestureEvent.appLaunchRole, that.mKeyGestureEvent.appLaunchRole) 452 && Objects.equals(mKeyGestureEvent.appLaunchPackageName, that.mKeyGestureEvent.appLaunchPackageName) 453 && Objects.equals(mKeyGestureEvent.appLaunchClassName, that.mKeyGestureEvent.appLaunchClassName); 454 } 455 456 @Override hashCode()457 public int hashCode() { 458 int _hash = 1; 459 _hash = 31 * _hash + mKeyGestureEvent.deviceId; 460 _hash = 31 * _hash + java.util.Arrays.hashCode(mKeyGestureEvent.keycodes); 461 _hash = 31 * _hash + mKeyGestureEvent.modifierState; 462 _hash = 31 * _hash + mKeyGestureEvent.gestureType; 463 _hash = 31 * _hash + mKeyGestureEvent.action; 464 _hash = 31 * _hash + mKeyGestureEvent.displayId; 465 _hash = 31 * _hash + mKeyGestureEvent.flags; 466 _hash = 31 * _hash + (mKeyGestureEvent.appLaunchCategory != null 467 ? mKeyGestureEvent.appLaunchCategory.hashCode() : 0); 468 _hash = 31 * _hash + (mKeyGestureEvent.appLaunchRole != null 469 ? mKeyGestureEvent.appLaunchRole.hashCode() : 0); 470 _hash = 31 * _hash + (mKeyGestureEvent.appLaunchPackageName != null 471 ? mKeyGestureEvent.appLaunchPackageName.hashCode() : 0); 472 _hash = 31 * _hash + (mKeyGestureEvent.appLaunchClassName != null 473 ? mKeyGestureEvent.appLaunchClassName.hashCode() : 0); 474 return _hash; 475 } 476 477 /** 478 * Convert KeyGestureEvent type to corresponding log event got KeyboardSystemsEvent 479 */ keyGestureTypeToLogEvent(@eyGestureType int value)480 private static int keyGestureTypeToLogEvent(@KeyGestureType int value) { 481 switch (value) { 482 case KEY_GESTURE_TYPE_HOME: 483 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__HOME; 484 case KEY_GESTURE_TYPE_RECENT_APPS: 485 case KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER: 486 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__RECENT_APPS; 487 case KEY_GESTURE_TYPE_BACK: 488 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__BACK; 489 case KEY_GESTURE_TYPE_APP_SWITCH: 490 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__APP_SWITCH; 491 case KEY_GESTURE_TYPE_LAUNCH_ASSISTANT: 492 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_ASSISTANT; 493 case KEY_GESTURE_TYPE_LAUNCH_VOICE_ASSISTANT: 494 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_VOICE_ASSISTANT; 495 case KEY_GESTURE_TYPE_LAUNCH_SYSTEM_SETTINGS: 496 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_SYSTEM_SETTINGS; 497 case KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL: 498 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__TOGGLE_NOTIFICATION_PANEL; 499 case KEY_GESTURE_TYPE_TOGGLE_TASKBAR: 500 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__TOGGLE_TASKBAR; 501 case KEY_GESTURE_TYPE_TAKE_SCREENSHOT: 502 case KEY_GESTURE_TYPE_SCREENSHOT_CHORD: 503 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__TAKE_SCREENSHOT; 504 case KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER: 505 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__OPEN_SHORTCUT_HELPER; 506 case KEY_GESTURE_TYPE_BRIGHTNESS_UP: 507 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__BRIGHTNESS_UP; 508 case KEY_GESTURE_TYPE_BRIGHTNESS_DOWN: 509 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__BRIGHTNESS_DOWN; 510 case KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_UP: 511 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__KEYBOARD_BACKLIGHT_UP; 512 case KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_DOWN: 513 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__KEYBOARD_BACKLIGHT_DOWN; 514 case KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_TOGGLE: 515 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__KEYBOARD_BACKLIGHT_TOGGLE; 516 case KEY_GESTURE_TYPE_VOLUME_UP: 517 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__VOLUME_UP; 518 case KEY_GESTURE_TYPE_VOLUME_DOWN: 519 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__VOLUME_DOWN; 520 case KEY_GESTURE_TYPE_VOLUME_MUTE: 521 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__VOLUME_MUTE; 522 case KEY_GESTURE_TYPE_ALL_APPS: 523 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__ALL_APPS; 524 case KEY_GESTURE_TYPE_LAUNCH_SEARCH: 525 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_SEARCH; 526 case KEY_GESTURE_TYPE_LANGUAGE_SWITCH: 527 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LANGUAGE_SWITCH; 528 case KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK: 529 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__TOGGLE_CAPS_LOCK; 530 case KEY_GESTURE_TYPE_SYSTEM_MUTE: 531 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__SYSTEM_MUTE; 532 case KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_LEFT: 533 case KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_RIGHT: 534 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__SPLIT_SCREEN_NAVIGATION; 535 case KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_LEFT: 536 case KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_RIGHT: 537 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__CHANGE_SPLITSCREEN_FOCUS; 538 case KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY: 539 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__MOVE_TO_NEXT_DISPLAY; 540 case KEY_GESTURE_TYPE_TRIGGER_BUG_REPORT: 541 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__TRIGGER_BUG_REPORT; 542 case KEY_GESTURE_TYPE_LOCK_SCREEN: 543 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LOCK_SCREEN; 544 case KEY_GESTURE_TYPE_OPEN_NOTES: 545 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__OPEN_NOTES; 546 case KEY_GESTURE_TYPE_TOGGLE_POWER: 547 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__TOGGLE_POWER; 548 case KEY_GESTURE_TYPE_SYSTEM_NAVIGATION: 549 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__SYSTEM_NAVIGATION; 550 case KEY_GESTURE_TYPE_SLEEP: 551 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__SLEEP; 552 case KEY_GESTURE_TYPE_WAKEUP: 553 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__WAKEUP; 554 case KEY_GESTURE_TYPE_MEDIA_KEY: 555 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__MEDIA_KEY; 556 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_BROWSER: 557 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_BROWSER; 558 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_EMAIL: 559 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_EMAIL; 560 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CONTACTS: 561 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_CONTACTS; 562 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CALENDAR: 563 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_CALENDAR; 564 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CALCULATOR: 565 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_CALCULATOR; 566 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MUSIC: 567 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_MUSIC; 568 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MAPS: 569 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_MAPS; 570 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MESSAGING: 571 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_MESSAGING; 572 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_GALLERY: 573 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_GALLERY; 574 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FILES: 575 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_FILES; 576 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_WEATHER: 577 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_WEATHER; 578 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FITNESS: 579 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_FITNESS; 580 case KEY_GESTURE_TYPE_LAUNCH_APPLICATION: 581 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_APPLICATION_BY_PACKAGE_NAME; 582 case KEY_GESTURE_TYPE_DESKTOP_MODE: 583 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__DESKTOP_MODE; 584 case KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION: 585 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__MULTI_WINDOW_NAVIGATION; 586 default: 587 return LOG_EVENT_UNSPECIFIED; 588 } 589 } 590 591 /** 592 * Find Log event type corresponding to app launch data. 593 * Returns {@code LOG_EVENT_UNSPECIFIED} if no matching event found 594 */ getLogEventFromLaunchAppData(@ullable AppLaunchData data)595 private static int getLogEventFromLaunchAppData(@Nullable AppLaunchData data) { 596 if (data == null) { 597 return LOG_EVENT_UNSPECIFIED; 598 } 599 if (data instanceof AppLaunchData.CategoryData) { 600 return getLogEventFromSelectorCategory( 601 ((AppLaunchData.CategoryData) data).getCategory()); 602 } else if (data instanceof AppLaunchData.RoleData) { 603 return getLogEventFromRole(((AppLaunchData.RoleData) data).getRole()); 604 } else if (data instanceof AppLaunchData.ComponentData) { 605 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_APPLICATION_BY_PACKAGE_NAME; 606 } else { 607 throw new IllegalArgumentException("AppLaunchData type is invalid!"); 608 } 609 } 610 getLogEventFromSelectorCategory(@onNull String category)611 private static int getLogEventFromSelectorCategory(@NonNull String category) { 612 switch (category) { 613 case Intent.CATEGORY_APP_BROWSER: 614 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_BROWSER; 615 case Intent.CATEGORY_APP_EMAIL: 616 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_EMAIL; 617 case Intent.CATEGORY_APP_CONTACTS: 618 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_CONTACTS; 619 case Intent.CATEGORY_APP_CALENDAR: 620 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_CALENDAR; 621 case Intent.CATEGORY_APP_CALCULATOR: 622 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_CALCULATOR; 623 case Intent.CATEGORY_APP_MUSIC: 624 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_MUSIC; 625 case Intent.CATEGORY_APP_MAPS: 626 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_MAPS; 627 case Intent.CATEGORY_APP_MESSAGING: 628 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_MESSAGING; 629 case Intent.CATEGORY_APP_GALLERY: 630 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_GALLERY; 631 case Intent.CATEGORY_APP_FILES: 632 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_FILES; 633 case Intent.CATEGORY_APP_WEATHER: 634 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_WEATHER; 635 case Intent.CATEGORY_APP_FITNESS: 636 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_FITNESS; 637 default: 638 return LOG_EVENT_UNSPECIFIED; 639 } 640 } 641 642 /** 643 * Find Log event corresponding to the provide system role name. 644 * Returns {@code LOG_EVENT_UNSPECIFIED} if no matching event found. 645 */ getLogEventFromRole(@onNull String role)646 private static int getLogEventFromRole(@NonNull String role) { 647 if (RoleManager.ROLE_BROWSER.equals(role)) { 648 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_BROWSER; 649 } else if (RoleManager.ROLE_SMS.equals(role)) { 650 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__LAUNCH_DEFAULT_MESSAGING; 651 } else { 652 return LOG_EVENT_UNSPECIFIED; 653 } 654 } 655 keyGestureTypeToString(@eyGestureType int value)656 private static String keyGestureTypeToString(@KeyGestureType int value) { 657 switch (value) { 658 case KEY_GESTURE_TYPE_SYSTEM_RESERVED: 659 return "KEY_GESTURE_TYPE_SYSTEM_RESERVED"; 660 case KEY_GESTURE_TYPE_UNSPECIFIED: 661 return "KEY_GESTURE_TYPE_UNSPECIFIED"; 662 case KEY_GESTURE_TYPE_HOME: 663 return "KEY_GESTURE_TYPE_HOME"; 664 case KEY_GESTURE_TYPE_RECENT_APPS: 665 return "KEY_GESTURE_TYPE_RECENT_APPS"; 666 case KEY_GESTURE_TYPE_BACK: 667 return "KEY_GESTURE_TYPE_BACK"; 668 case KEY_GESTURE_TYPE_APP_SWITCH: 669 return "KEY_GESTURE_TYPE_APP_SWITCH"; 670 case KEY_GESTURE_TYPE_LAUNCH_ASSISTANT: 671 return "KEY_GESTURE_TYPE_LAUNCH_ASSISTANT"; 672 case KEY_GESTURE_TYPE_LAUNCH_VOICE_ASSISTANT: 673 return "KEY_GESTURE_TYPE_LAUNCH_VOICE_ASSISTANT"; 674 case KEY_GESTURE_TYPE_LAUNCH_SYSTEM_SETTINGS: 675 return "KEY_GESTURE_TYPE_LAUNCH_SYSTEM_SETTINGS"; 676 case KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL: 677 return "KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL"; 678 case KEY_GESTURE_TYPE_TOGGLE_TASKBAR: 679 return "KEY_GESTURE_TYPE_TOGGLE_TASKBAR"; 680 case KEY_GESTURE_TYPE_TAKE_SCREENSHOT: 681 return "KEY_GESTURE_TYPE_TAKE_SCREENSHOT"; 682 case KEY_GESTURE_TYPE_SCREENSHOT_CHORD: 683 return "KEY_GESTURE_TYPE_SCREENSHOT_CHORD"; 684 case KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER: 685 return "KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER"; 686 case KEY_GESTURE_TYPE_BRIGHTNESS_UP: 687 return "KEY_GESTURE_TYPE_BRIGHTNESS_UP"; 688 case KEY_GESTURE_TYPE_BRIGHTNESS_DOWN: 689 return "KEY_GESTURE_TYPE_BRIGHTNESS_DOWN"; 690 case KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_UP: 691 return "KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_UP"; 692 case KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_DOWN: 693 return "KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_DOWN"; 694 case KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_TOGGLE: 695 return "KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_TOGGLE"; 696 case KEY_GESTURE_TYPE_VOLUME_UP: 697 return "KEY_GESTURE_TYPE_VOLUME_UP"; 698 case KEY_GESTURE_TYPE_VOLUME_DOWN: 699 return "KEY_GESTURE_TYPE_VOLUME_DOWN"; 700 case KEY_GESTURE_TYPE_VOLUME_MUTE: 701 return "KEY_GESTURE_TYPE_VOLUME_MUTE"; 702 case KEY_GESTURE_TYPE_ALL_APPS: 703 return "KEY_GESTURE_TYPE_ALL_APPS"; 704 case KEY_GESTURE_TYPE_LAUNCH_SEARCH: 705 return "KEY_GESTURE_TYPE_LAUNCH_SEARCH"; 706 case KEY_GESTURE_TYPE_LANGUAGE_SWITCH: 707 return "KEY_GESTURE_TYPE_LANGUAGE_SWITCH"; 708 case KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK: 709 return "KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK"; 710 case KEY_GESTURE_TYPE_SYSTEM_MUTE: 711 return "KEY_GESTURE_TYPE_SYSTEM_MUTE"; 712 case KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_LEFT: 713 return "KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_LEFT"; 714 case KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_RIGHT: 715 return "KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_RIGHT"; 716 case KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_LEFT: 717 return "KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_LEFT"; 718 case KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_RIGHT: 719 return "KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_RIGHT"; 720 case KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY: 721 return "KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY"; 722 case KEY_GESTURE_TYPE_TRIGGER_BUG_REPORT: 723 return "KEY_GESTURE_TYPE_TRIGGER_BUG_REPORT"; 724 case KEY_GESTURE_TYPE_LOCK_SCREEN: 725 return "KEY_GESTURE_TYPE_LOCK_SCREEN"; 726 case KEY_GESTURE_TYPE_OPEN_NOTES: 727 return "KEY_GESTURE_TYPE_OPEN_NOTES"; 728 case KEY_GESTURE_TYPE_TOGGLE_POWER: 729 return "KEY_GESTURE_TYPE_TOGGLE_POWER"; 730 case KEY_GESTURE_TYPE_SYSTEM_NAVIGATION: 731 return "KEY_GESTURE_TYPE_SYSTEM_NAVIGATION"; 732 case KEY_GESTURE_TYPE_SLEEP: 733 return "KEY_GESTURE_TYPE_SLEEP"; 734 case KEY_GESTURE_TYPE_WAKEUP: 735 return "KEY_GESTURE_TYPE_WAKEUP"; 736 case KEY_GESTURE_TYPE_MEDIA_KEY: 737 return "KEY_GESTURE_TYPE_MEDIA_KEY"; 738 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_BROWSER: 739 return "KEY_GESTURE_TYPE_LAUNCH_DEFAULT_BROWSER"; 740 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_EMAIL: 741 return "KEY_GESTURE_TYPE_LAUNCH_DEFAULT_EMAIL"; 742 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CONTACTS: 743 return "KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CONTACTS"; 744 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CALENDAR: 745 return "KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CALENDAR"; 746 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CALCULATOR: 747 return "KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CALCULATOR"; 748 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MUSIC: 749 return "KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MUSIC"; 750 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MAPS: 751 return "KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MAPS"; 752 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MESSAGING: 753 return "KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MESSAGING"; 754 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_GALLERY: 755 return "KEY_GESTURE_TYPE_LAUNCH_DEFAULT_GALLERY"; 756 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FILES: 757 return "KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FILES"; 758 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_WEATHER: 759 return "KEY_GESTURE_TYPE_LAUNCH_DEFAULT_WEATHER"; 760 case KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FITNESS: 761 return "KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FITNESS"; 762 case KEY_GESTURE_TYPE_LAUNCH_APPLICATION: 763 return "KEY_GESTURE_TYPE_LAUNCH_APPLICATION"; 764 case KEY_GESTURE_TYPE_DESKTOP_MODE: 765 return "KEY_GESTURE_TYPE_DESKTOP_MODE"; 766 case KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION: 767 return "KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION"; 768 case KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER: 769 return "KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER"; 770 case KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD: 771 return "KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD"; 772 case KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD: 773 return "KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD"; 774 case KEY_GESTURE_TYPE_GLOBAL_ACTIONS: 775 return "KEY_GESTURE_TYPE_GLOBAL_ACTIONS"; 776 case KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT: 777 return "KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT"; 778 case KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT: 779 return "KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT"; 780 case KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS: 781 return "KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS"; 782 case KEY_GESTURE_TYPE_TOGGLE_TALKBACK: 783 return "KEY_GESTURE_TYPE_TOGGLE_TALKBACK"; 784 case KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS: 785 return "KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS"; 786 case KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS: 787 return "KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS"; 788 case KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS: 789 return "KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS"; 790 case KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS: 791 return "KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS"; 792 case KEY_GESTURE_TYPE_SNAP_LEFT_FREEFORM_WINDOW: 793 return "KEY_GESTURE_TYPE_SNAP_LEFT_FREEFORM_WINDOW"; 794 case KEY_GESTURE_TYPE_SNAP_RIGHT_FREEFORM_WINDOW: 795 return "KEY_GESTURE_TYPE_SNAP_RIGHT_FREEFORM_WINDOW"; 796 case KEY_GESTURE_TYPE_MINIMIZE_FREEFORM_WINDOW: 797 return "KEY_GESTURE_TYPE_MINIMIZE_FREEFORM_WINDOW"; 798 case KEY_GESTURE_TYPE_TOGGLE_MAXIMIZE_FREEFORM_WINDOW: 799 return "KEY_GESTURE_TYPE_TOGGLE_MAXIMIZE_FREEFORM_WINDOW"; 800 case KEY_GESTURE_TYPE_TOGGLE_MAGNIFICATION: 801 return "KEY_GESTURE_TYPE_TOGGLE_MAGNIFICATION"; 802 case KEY_GESTURE_TYPE_ACTIVATE_SELECT_TO_SPEAK: 803 return "KEY_GESTURE_TYPE_ACTIVATE_SELECT_TO_SPEAK"; 804 case KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW: 805 return "KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW"; 806 case KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB: 807 return "KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB"; 808 case KEY_GESTURE_TYPE_TOGGLE_VOICE_ACCESS: 809 return "KEY_GESTURE_TYPE_TOGGLE_VOICE_ACCESS"; 810 default: 811 return Integer.toHexString(value); 812 } 813 } 814 } 815