1 /*
2  * Copyright (C) 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 com.android.wm.shell.desktopmode
18 
19 import com.android.internal.util.FrameworkStatsLog
20 import com.android.wm.shell.protolog.ShellProtoLogGroup
21 import com.android.wm.shell.util.KtProtoLog
22 
23 /** Event logger for logging desktop mode session events */
24 class DesktopModeEventLogger {
25     /**
26      * Logs the enter of desktop mode having session id [sessionId] and the reason [enterReason] for
27      * entering desktop mode
28      */
logSessionEnternull29     fun logSessionEnter(sessionId: Int, enterReason: EnterReason) {
30         KtProtoLog.v(
31             ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
32             "DesktopModeLogger: Logging session enter, session: %s reason: %s",
33             sessionId,
34             enterReason.name
35         )
36         FrameworkStatsLog.write(
37             DESKTOP_MODE_ATOM_ID,
38             /* event */ FrameworkStatsLog.DESKTOP_MODE_UICHANGED__EVENT__ENTER,
39             /* enterReason */ enterReason.reason,
40             /* exitReason */ 0,
41             /* session_id */ sessionId
42         )
43     }
44 
45     /**
46      * Logs the exit of desktop mode having session id [sessionId] and the reason [exitReason] for
47      * exiting desktop mode
48      */
logSessionExitnull49     fun logSessionExit(sessionId: Int, exitReason: ExitReason) {
50         KtProtoLog.v(
51             ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
52             "DesktopModeLogger: Logging session exit, session: %s reason: %s",
53             sessionId,
54             exitReason.name
55         )
56         FrameworkStatsLog.write(
57             DESKTOP_MODE_ATOM_ID,
58             /* event */ FrameworkStatsLog.DESKTOP_MODE_UICHANGED__EVENT__EXIT,
59             /* enterReason */ 0,
60             /* exitReason */ exitReason.reason,
61             /* session_id */ sessionId
62         )
63     }
64 
65     /**
66      * Logs that the task with update [taskUpdate] was added in the desktop mode session having
67      * session id [sessionId]
68      */
logTaskAddednull69     fun logTaskAdded(sessionId: Int, taskUpdate: TaskUpdate) {
70         KtProtoLog.v(
71             ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
72             "DesktopModeLogger: Logging task added, session: %s taskId: %s",
73             sessionId,
74             taskUpdate.instanceId
75         )
76         FrameworkStatsLog.write(
77             DESKTOP_MODE_TASK_UPDATE_ATOM_ID,
78             /* task_event */
79             FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_ADDED,
80             /* instance_id */
81             taskUpdate.instanceId,
82             /* uid */
83             taskUpdate.uid,
84             /* task_height */
85             taskUpdate.taskHeight,
86             /* task_width */
87             taskUpdate.taskWidth,
88             /* task_x */
89             taskUpdate.taskX,
90             /* task_y */
91             taskUpdate.taskY,
92             /* session_id */
93             sessionId
94         )
95     }
96 
97     /**
98      * Logs that the task with update [taskUpdate] was removed in the desktop mode session having
99      * session id [sessionId]
100      */
logTaskRemovednull101     fun logTaskRemoved(sessionId: Int, taskUpdate: TaskUpdate) {
102         KtProtoLog.v(
103             ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
104             "DesktopModeLogger: Logging task remove, session: %s taskId: %s",
105             sessionId,
106             taskUpdate.instanceId
107         )
108         FrameworkStatsLog.write(
109             DESKTOP_MODE_TASK_UPDATE_ATOM_ID,
110             /* task_event */
111             FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_REMOVED,
112             /* instance_id */
113             taskUpdate.instanceId,
114             /* uid */
115             taskUpdate.uid,
116             /* task_height */
117             taskUpdate.taskHeight,
118             /* task_width */
119             taskUpdate.taskWidth,
120             /* task_x */
121             taskUpdate.taskX,
122             /* task_y */
123             taskUpdate.taskY,
124             /* session_id */
125             sessionId
126         )
127     }
128 
129     /**
130      * Logs that the task with update [taskUpdate] had it's info changed in the desktop mode session
131      * having session id [sessionId]
132      */
logTaskInfoChangednull133     fun logTaskInfoChanged(sessionId: Int, taskUpdate: TaskUpdate) {
134         KtProtoLog.v(
135             ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
136             "DesktopModeLogger: Logging task info changed, session: %s taskId: %s",
137             sessionId,
138             taskUpdate.instanceId
139         )
140         FrameworkStatsLog.write(
141             DESKTOP_MODE_TASK_UPDATE_ATOM_ID,
142             /* task_event */
143             FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INFO_CHANGED,
144             /* instance_id */
145             taskUpdate.instanceId,
146             /* uid */
147             taskUpdate.uid,
148             /* task_height */
149             taskUpdate.taskHeight,
150             /* task_width */
151             taskUpdate.taskWidth,
152             /* task_x */
153             taskUpdate.taskX,
154             /* task_y */
155             taskUpdate.taskY,
156             /* session_id */
157             sessionId
158         )
159     }
160 
161     companion object {
162         data class TaskUpdate(
163             val instanceId: Int,
164             val uid: Int,
165             val taskHeight: Int = Int.MIN_VALUE,
166             val taskWidth: Int = Int.MIN_VALUE,
167             val taskX: Int = Int.MIN_VALUE,
168             val taskY: Int = Int.MIN_VALUE,
169         )
170 
171         /**
172          * Enum EnterReason mapped to the EnterReason definition in
173          * stats/atoms/desktopmode/desktopmode_extensions_atoms.proto
174          */
175         enum class EnterReason(val reason: Int) {
176             UNKNOWN_ENTER(FrameworkStatsLog.DESKTOP_MODE_UICHANGED__ENTER_REASON__UNKNOWN_ENTER),
177             OVERVIEW(FrameworkStatsLog.DESKTOP_MODE_UICHANGED__ENTER_REASON__OVERVIEW),
178             APP_HANDLE_DRAG(
179                 FrameworkStatsLog.DESKTOP_MODE_UICHANGED__ENTER_REASON__APP_HANDLE_DRAG
180             ),
181             APP_HANDLE_MENU_BUTTON(
182                 FrameworkStatsLog.DESKTOP_MODE_UICHANGED__ENTER_REASON__APP_HANDLE_MENU_BUTTON
183             ),
184             APP_FREEFORM_INTENT(
185                 FrameworkStatsLog.DESKTOP_MODE_UICHANGED__ENTER_REASON__APP_FREEFORM_INTENT
186             ),
187             KEYBOARD_SHORTCUT_ENTER(
188                 FrameworkStatsLog.DESKTOP_MODE_UICHANGED__ENTER_REASON__KEYBOARD_SHORTCUT_ENTER
189             ),
190             SCREEN_ON(FrameworkStatsLog.DESKTOP_MODE_UICHANGED__ENTER_REASON__SCREEN_ON),
191             APP_FROM_OVERVIEW(
192                 FrameworkStatsLog.DESKTOP_MODE_UICHANGED__ENTER_REASON__APP_FROM_OVERVIEW
193             ),
194         }
195 
196         /**
197          * Enum ExitReason mapped to the ExitReason definition in
198          * stats/atoms/desktopmode/desktopmode_extensions_atoms.proto
199          */
200         enum class ExitReason(val reason: Int) {
201             UNKNOWN_EXIT(FrameworkStatsLog.DESKTOP_MODE_UICHANGED__EXIT_REASON__UNKNOWN_EXIT),
202             DRAG_TO_EXIT(FrameworkStatsLog.DESKTOP_MODE_UICHANGED__EXIT_REASON__DRAG_TO_EXIT),
203             APP_HANDLE_MENU_BUTTON_EXIT(
204                 FrameworkStatsLog.DESKTOP_MODE_UICHANGED__EXIT_REASON__APP_HANDLE_MENU_BUTTON_EXIT
205             ),
206             KEYBOARD_SHORTCUT_EXIT(
207                 FrameworkStatsLog.DESKTOP_MODE_UICHANGED__EXIT_REASON__KEYBOARD_SHORTCUT_EXIT
208             ),
209             RETURN_HOME_OR_OVERVIEW(
210                 FrameworkStatsLog.DESKTOP_MODE_UICHANGED__EXIT_REASON__RETURN_HOME_OR_OVERVIEW
211             ),
212             TASK_FINISHED(FrameworkStatsLog.DESKTOP_MODE_UICHANGED__EXIT_REASON__TASK_FINISHED),
213             SCREEN_OFF(FrameworkStatsLog.DESKTOP_MODE_UICHANGED__EXIT_REASON__SCREEN_OFF)
214         }
215 
216         private const val DESKTOP_MODE_ATOM_ID = FrameworkStatsLog.DESKTOP_MODE_UI_CHANGED
217         private const val DESKTOP_MODE_TASK_UPDATE_ATOM_ID =
218             FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE
219     }
220 }
221