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