1 /*
2  * Copyright (C) 2020 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 com.android.wm.shell.onehanded;
18 
19 import com.android.internal.annotations.VisibleForTesting;
20 import com.android.internal.logging.UiEvent;
21 import com.android.internal.logging.UiEventLogger;
22 
23 /**
24  *  Helper class that ends OneHanded mode log to UiEvent, see also go/uievent
25  */
26 public class OneHandedUiEventLogger {
27     private static final String TAG = "OneHandedUiEventLogger";
28     private final UiEventLogger mUiEventLogger;
29 
30     /**
31      * One-Handed event types
32      */
33     // Triggers
34     public static final int EVENT_ONE_HANDED_TRIGGER_GESTURE_IN = 0;
35     public static final int EVENT_ONE_HANDED_TRIGGER_GESTURE_OUT = 1;
36     public static final int EVENT_ONE_HANDED_TRIGGER_OVERSPACE_OUT = 2;
37     public static final int EVENT_ONE_HANDED_TRIGGER_POP_IME_OUT = 3;
38     public static final int EVENT_ONE_HANDED_TRIGGER_ROTATION_OUT = 4;
39     public static final int EVENT_ONE_HANDED_TRIGGER_APP_TAPS_OUT = 5;
40     public static final int EVENT_ONE_HANDED_TRIGGER_TIMEOUT_OUT = 6;
41     public static final int EVENT_ONE_HANDED_TRIGGER_SCREEN_OFF_OUT = 7;
42     // Settings toggles
43     public static final int EVENT_ONE_HANDED_SETTINGS_ENABLED_ON = 8;
44     public static final int EVENT_ONE_HANDED_SETTINGS_ENABLED_OFF = 9;
45     public static final int EVENT_ONE_HANDED_SETTINGS_APP_TAPS_EXIT_ON = 10;
46     public static final int EVENT_ONE_HANDED_SETTINGS_APP_TAPS_EXIT_OFF = 11;
47     public static final int EVENT_ONE_HANDED_SETTINGS_TIMEOUT_EXIT_ON = 12;
48     public static final int EVENT_ONE_HANDED_SETTINGS_TIMEOUT_EXIT_OFF = 13;
49     public static final int EVENT_ONE_HANDED_SETTINGS_TIMEOUT_SECONDS_NEVER = 14;
50     public static final int EVENT_ONE_HANDED_SETTINGS_TIMEOUT_SECONDS_4 = 15;
51     public static final int EVENT_ONE_HANDED_SETTINGS_TIMEOUT_SECONDS_8 = 16;
52     public static final int EVENT_ONE_HANDED_SETTINGS_TIMEOUT_SECONDS_12 = 17;
53     public static final int EVENT_ONE_HANDED_SETTINGS_SHOW_NOTIFICATION_ENABLED_ON = 18;
54     public static final int EVENT_ONE_HANDED_SETTINGS_SHOW_NOTIFICATION_ENABLED_OFF = 19;
55     public static final int EVENT_ONE_HANDED_SETTINGS_SHORTCUT_ENABLED_ON = 20;
56     public static final int EVENT_ONE_HANDED_SETTINGS_SHORTCUT_ENABLED_OFF = 21;
57 
58     private static final String[] EVENT_TAGS = {
59             "one_handed_trigger_gesture_in",
60             "one_handed_trigger_gesture_out",
61             "one_handed_trigger_overspace_out",
62             "one_handed_trigger_pop_ime_out",
63             "one_handed_trigger_rotation_out",
64             "one_handed_trigger_app_taps_out",
65             "one_handed_trigger_timeout_out",
66             "one_handed_trigger_screen_off_out",
67             "one_handed_settings_enabled_on",
68             "one_handed_settings_enabled_off",
69             "one_handed_settings_app_taps_exit_on",
70             "one_handed_settings_app_taps_exit_off",
71             "one_handed_settings_timeout_exit_on",
72             "one_handed_settings_timeout_exit_off",
73             "one_handed_settings_timeout_seconds_never",
74             "one_handed_settings_timeout_seconds_4",
75             "one_handed_settings_timeout_seconds_8",
76             "one_handed_settings_timeout_seconds_12",
77             "one_handed_settings_show_notification_enabled_on",
78             "one_handed_settings_show_notification_enabled_off",
79             "one_handed_settings_shortcut_enabled_on",
80             "one_handed_settings_shortcut_enabled_off"
81     };
82 
OneHandedUiEventLogger(UiEventLogger uiEventLogger)83     public OneHandedUiEventLogger(UiEventLogger uiEventLogger) {
84         mUiEventLogger = uiEventLogger;
85     }
86 
87     /**
88      * Events definition that related to One-Handed gestures.
89      */
90     @VisibleForTesting
91     public enum OneHandedTriggerEvent implements UiEventLogger.UiEventEnum {
92         INVALID(0),
93         @UiEvent(doc = "One-Handed trigger in via NavigationBar area")
94         ONE_HANDED_TRIGGER_GESTURE_IN(366),
95 
96         @UiEvent(doc = "One-Handed trigger out via NavigationBar area")
97         ONE_HANDED_TRIGGER_GESTURE_OUT(367),
98 
99         @UiEvent(doc = "One-Handed trigger out via Overspace area")
100         ONE_HANDED_TRIGGER_OVERSPACE_OUT(368),
101 
102         @UiEvent(doc = "One-Handed trigger out while IME pop up")
103         ONE_HANDED_TRIGGER_POP_IME_OUT(369),
104 
105         @UiEvent(doc = "One-Handed trigger out while device rotation to landscape")
106         ONE_HANDED_TRIGGER_ROTATION_OUT(370),
107 
108         @UiEvent(doc = "One-Handed trigger out when an Activity is launching")
109         ONE_HANDED_TRIGGER_APP_TAPS_OUT(371),
110 
111         @UiEvent(doc = "One-Handed trigger out when one-handed mode times up")
112         ONE_HANDED_TRIGGER_TIMEOUT_OUT(372),
113 
114         @UiEvent(doc = "One-Handed trigger out when screen off")
115         ONE_HANDED_TRIGGER_SCREEN_OFF_OUT(449);
116 
117         private final int mId;
118 
OneHandedTriggerEvent(int id)119         OneHandedTriggerEvent(int id) {
120             mId = id;
121         }
122 
123         @Override
getId()124         public int getId() {
125             return mId;
126         }
127     }
128 
129     /**
130      * Events definition that related to Settings toggles.
131      */
132     @VisibleForTesting
133     public enum OneHandedSettingsTogglesEvent implements UiEventLogger.UiEventEnum {
134         INVALID(0),
135         @UiEvent(doc = "One-Handed mode enabled toggle on")
136         ONE_HANDED_SETTINGS_TOGGLES_ENABLED_ON(356),
137 
138         @UiEvent(doc = "One-Handed mode enabled toggle off")
139         ONE_HANDED_SETTINGS_TOGGLES_ENABLED_OFF(357),
140 
141         @UiEvent(doc = "One-Handed mode app-taps-exit toggle on")
142         ONE_HANDED_SETTINGS_TOGGLES_APP_TAPS_EXIT_ON(358),
143 
144         @UiEvent(doc = "One-Handed mode app-taps-exit toggle off")
145         ONE_HANDED_SETTINGS_TOGGLES_APP_TAPS_EXIT_OFF(359),
146 
147         @UiEvent(doc = "One-Handed mode timeout-exit toggle on")
148         ONE_HANDED_SETTINGS_TOGGLES_TIMEOUT_EXIT_ON(360),
149 
150         @UiEvent(doc = "One-Handed mode timeout-exit toggle off")
151         ONE_HANDED_SETTINGS_TOGGLES_TIMEOUT_EXIT_OFF(361),
152 
153         @UiEvent(doc = "One-Handed mode timeout value changed to never timeout")
154         ONE_HANDED_SETTINGS_TOGGLES_TIMEOUT_SECONDS_NEVER(362),
155 
156         @UiEvent(doc = "One-Handed mode timeout value changed to 4 seconds")
157         ONE_HANDED_SETTINGS_TOGGLES_TIMEOUT_SECONDS_4(363),
158 
159         @UiEvent(doc = "One-Handed mode timeout value changed to 8 seconds")
160         ONE_HANDED_SETTINGS_TOGGLES_TIMEOUT_SECONDS_8(364),
161 
162         @UiEvent(doc = "One-Handed mode timeout value changed to 12 seconds")
163         ONE_HANDED_SETTINGS_TOGGLES_TIMEOUT_SECONDS_12(365),
164 
165         @UiEvent(doc = "One-Handed mode show notification toggle on")
166         ONE_HANDED_SETTINGS_TOGGLES_SHOW_NOTIFICATION_ENABLED_ON(847),
167 
168         @UiEvent(doc = "One-Handed mode show notification toggle off")
169         ONE_HANDED_SETTINGS_TOGGLES_SHOW_NOTIFICATION_ENABLED_OFF(848),
170 
171         @UiEvent(doc = "One-Handed mode shortcut toggle on")
172         ONE_HANDED_SETTINGS_TOGGLES_SHORTCUT_ENABLED_ON(870),
173 
174         @UiEvent(doc = "One-Handed mode shortcut toggle off")
175         ONE_HANDED_SETTINGS_TOGGLES_SHORTCUT_ENABLED_OFF(871);
176 
177         private final int mId;
178 
OneHandedSettingsTogglesEvent(int id)179         OneHandedSettingsTogglesEvent(int id) {
180             mId = id;
181         }
182 
183         @Override
getId()184         public int getId() {
185             return mId;
186         }
187     }
188 
189 
190     /**
191      * Logs an event to the system log, to sCallback if present, and to the logEvent destinations.
192      * @param tag One of the EVENT_* codes above.
193      */
writeEvent(int tag)194     public void writeEvent(int tag) {
195         logEvent(tag);
196     }
197 
198     /**
199      * Logs an event to the UiEvent (statsd) logging.
200      * @param event One of the EVENT_* codes above.
201      * @return String a readable description of the event.  Begins "writeEvent <tag_description>"
202      * if the tag is valid.
203      */
logEvent(int event)204     private void logEvent(int event) {
205         switch (event) {
206             case EVENT_ONE_HANDED_TRIGGER_GESTURE_IN:
207                 mUiEventLogger.log(OneHandedTriggerEvent.ONE_HANDED_TRIGGER_GESTURE_IN);
208                 break;
209             case EVENT_ONE_HANDED_TRIGGER_GESTURE_OUT:
210                 mUiEventLogger.log(OneHandedTriggerEvent.ONE_HANDED_TRIGGER_GESTURE_OUT);
211                 break;
212             case EVENT_ONE_HANDED_TRIGGER_OVERSPACE_OUT:
213                 mUiEventLogger.log(OneHandedTriggerEvent.ONE_HANDED_TRIGGER_OVERSPACE_OUT);
214                 break;
215             case EVENT_ONE_HANDED_TRIGGER_POP_IME_OUT:
216                 mUiEventLogger.log(OneHandedTriggerEvent.ONE_HANDED_TRIGGER_POP_IME_OUT);
217                 break;
218             case EVENT_ONE_HANDED_TRIGGER_ROTATION_OUT:
219                 mUiEventLogger.log(OneHandedTriggerEvent.ONE_HANDED_TRIGGER_ROTATION_OUT);
220                 break;
221             case EVENT_ONE_HANDED_TRIGGER_APP_TAPS_OUT:
222                 mUiEventLogger.log(OneHandedTriggerEvent.ONE_HANDED_TRIGGER_APP_TAPS_OUT);
223                 break;
224             case EVENT_ONE_HANDED_TRIGGER_TIMEOUT_OUT:
225                 mUiEventLogger.log(OneHandedTriggerEvent.ONE_HANDED_TRIGGER_TIMEOUT_OUT);
226                 break;
227             case EVENT_ONE_HANDED_TRIGGER_SCREEN_OFF_OUT:
228                 mUiEventLogger.log(OneHandedTriggerEvent.ONE_HANDED_TRIGGER_SCREEN_OFF_OUT);
229                 break;
230             case EVENT_ONE_HANDED_SETTINGS_ENABLED_ON:
231                 mUiEventLogger.log(OneHandedSettingsTogglesEvent
232                         .ONE_HANDED_SETTINGS_TOGGLES_ENABLED_ON);
233                 break;
234             case EVENT_ONE_HANDED_SETTINGS_ENABLED_OFF:
235                 mUiEventLogger.log(OneHandedSettingsTogglesEvent
236                         .ONE_HANDED_SETTINGS_TOGGLES_ENABLED_OFF);
237                 break;
238             case EVENT_ONE_HANDED_SETTINGS_APP_TAPS_EXIT_ON:
239                 mUiEventLogger.log(OneHandedSettingsTogglesEvent
240                         .ONE_HANDED_SETTINGS_TOGGLES_APP_TAPS_EXIT_ON);
241                 break;
242             case EVENT_ONE_HANDED_SETTINGS_APP_TAPS_EXIT_OFF:
243                 mUiEventLogger.log(OneHandedSettingsTogglesEvent
244                         .ONE_HANDED_SETTINGS_TOGGLES_APP_TAPS_EXIT_OFF);
245                 break;
246             case EVENT_ONE_HANDED_SETTINGS_TIMEOUT_EXIT_ON:
247                 mUiEventLogger.log(OneHandedSettingsTogglesEvent
248                         .ONE_HANDED_SETTINGS_TOGGLES_TIMEOUT_EXIT_ON);
249                 break;
250             case EVENT_ONE_HANDED_SETTINGS_TIMEOUT_EXIT_OFF:
251                 mUiEventLogger.log(OneHandedSettingsTogglesEvent
252                         .ONE_HANDED_SETTINGS_TOGGLES_TIMEOUT_EXIT_OFF);
253                 break;
254             case EVENT_ONE_HANDED_SETTINGS_TIMEOUT_SECONDS_NEVER:
255                 mUiEventLogger.log(OneHandedSettingsTogglesEvent
256                         .ONE_HANDED_SETTINGS_TOGGLES_TIMEOUT_SECONDS_NEVER);
257                 break;
258             case EVENT_ONE_HANDED_SETTINGS_TIMEOUT_SECONDS_4:
259                 mUiEventLogger.log(OneHandedSettingsTogglesEvent
260                         .ONE_HANDED_SETTINGS_TOGGLES_TIMEOUT_SECONDS_4);
261                 break;
262             case EVENT_ONE_HANDED_SETTINGS_TIMEOUT_SECONDS_8:
263                 mUiEventLogger.log(OneHandedSettingsTogglesEvent
264                         .ONE_HANDED_SETTINGS_TOGGLES_TIMEOUT_SECONDS_8);
265                 break;
266             case EVENT_ONE_HANDED_SETTINGS_TIMEOUT_SECONDS_12:
267                 mUiEventLogger.log(OneHandedSettingsTogglesEvent
268                         .ONE_HANDED_SETTINGS_TOGGLES_TIMEOUT_SECONDS_12);
269                 break;
270             case EVENT_ONE_HANDED_SETTINGS_SHOW_NOTIFICATION_ENABLED_ON:
271                 mUiEventLogger.log(OneHandedSettingsTogglesEvent
272                         .ONE_HANDED_SETTINGS_TOGGLES_SHOW_NOTIFICATION_ENABLED_ON);
273                 break;
274             case EVENT_ONE_HANDED_SETTINGS_SHOW_NOTIFICATION_ENABLED_OFF:
275                 mUiEventLogger.log(OneHandedSettingsTogglesEvent
276                         .ONE_HANDED_SETTINGS_TOGGLES_SHOW_NOTIFICATION_ENABLED_OFF);
277                 break;
278             case EVENT_ONE_HANDED_SETTINGS_SHORTCUT_ENABLED_ON:
279                 mUiEventLogger.log(OneHandedSettingsTogglesEvent
280                         .ONE_HANDED_SETTINGS_TOGGLES_SHORTCUT_ENABLED_ON);
281                 break;
282             case EVENT_ONE_HANDED_SETTINGS_SHORTCUT_ENABLED_OFF:
283                 mUiEventLogger.log(OneHandedSettingsTogglesEvent
284                         .ONE_HANDED_SETTINGS_TOGGLES_SHORTCUT_ENABLED_OFF);
285                 break;
286             default:
287                 // Do nothing
288                 break;
289         }
290     }
291 }
292