• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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