diff options
2 files changed, 272 insertions, 7 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeEventLogger.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeEventLogger.kt index b1b7d057c756..5a277316ffd4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeEventLogger.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeEventLogger.kt @@ -19,6 +19,7 @@ package com.android.wm.shell.desktopmode import com.android.internal.annotations.VisibleForTesting import com.android.internal.protolog.ProtoLog import com.android.internal.util.FrameworkStatsLog +import com.android.window.flags.Flags import com.android.wm.shell.EventLogTags import com.android.wm.shell.protolog.ShellProtoLogGroup @@ -79,7 +80,8 @@ class DesktopModeEventLogger { ) logTaskUpdate( FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_ADDED, - sessionId, taskUpdate) + sessionId, taskUpdate + ) } /** @@ -95,7 +97,8 @@ class DesktopModeEventLogger { ) logTaskUpdate( FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_REMOVED, - sessionId, taskUpdate) + sessionId, taskUpdate + ) } /** @@ -111,7 +114,46 @@ class DesktopModeEventLogger { ) logTaskUpdate( FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INFO_CHANGED, - sessionId, taskUpdate) + sessionId, taskUpdate + ) + } + + /** + * Logs that a task resize event is starting with [taskSizeUpdate] within a + * Desktop mode [sessionId]. + */ + fun logTaskResizingStarted(sessionId: Int, taskSizeUpdate: TaskSizeUpdate) { + if (!Flags.enableResizingMetrics()) return + + ProtoLog.v( + ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE, + "DesktopModeLogger: Logging task resize is starting, session: %s taskId: %s", + sessionId, + taskSizeUpdate.instanceId + ) + logTaskSizeUpdated( + FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZING_STAGE__START_RESIZING_STAGE, + sessionId, taskSizeUpdate + ) + } + + /** + * Logs that a task resize event is ending with [taskSizeUpdate] within a + * Desktop mode [sessionId]. + */ + fun logTaskResizingEnded(sessionId: Int, taskSizeUpdate: TaskSizeUpdate) { + if (!Flags.enableResizingMetrics()) return + + ProtoLog.v( + ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE, + "DesktopModeLogger: Logging task resize is ending, session: %s taskId: %s", + sessionId, + taskSizeUpdate.instanceId + ) + logTaskSizeUpdated( + FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZING_STAGE__END_RESIZING_STAGE, + sessionId, taskSizeUpdate + ) } private fun logTaskUpdate(taskEvent: Int, sessionId: Int, taskUpdate: TaskUpdate) { @@ -162,6 +204,34 @@ class DesktopModeEventLogger { ) } + private fun logTaskSizeUpdated( + resizingStage: Int, + sessionId: Int, + taskSizeUpdate: TaskSizeUpdate + ) { + FrameworkStatsLog.write( + DESKTOP_MODE_TASK_SIZE_UPDATED_ATOM_ID, + /* resize_trigger */ + taskSizeUpdate.resizeTrigger?.trigger ?: ResizeTrigger.UNKNOWN_RESIZE_TRIGGER.trigger, + /* resizing_stage */ + resizingStage, + /* input_method */ + taskSizeUpdate.inputMethod?.method ?: InputMethod.UNKNOWN_INPUT_METHOD.method, + /* desktop_mode_session_id */ + sessionId, + /* instance_id */ + taskSizeUpdate.instanceId, + /* uid */ + taskSizeUpdate.uid, + /* task_height */ + taskSizeUpdate.taskHeight, + /* task_width */ + taskSizeUpdate.taskWidth, + /* display_area */ + taskSizeUpdate.displayArea + ) + } + companion object { /** * Describes a task position and dimensions. @@ -188,13 +258,35 @@ class DesktopModeEventLogger { val visibleTaskCount: Int, ) + /** + * Describes a task size update (resizing, snapping or maximizing to + * stable bounds). + * + * @property resizeTrigger the trigger for task resize + * @property inputMethod the input method for resizing this task + * @property instanceId instance id of the task + * @property uid uid of the app associated with the task + * @property taskHeight height of the task in dp + * @property taskWidth width of the task in dp + * @property displayArea the display size of the screen in dp + */ + data class TaskSizeUpdate( + val resizeTrigger: ResizeTrigger? = null, + val inputMethod: InputMethod? = null, + val instanceId: Int, + val uid: Int, + val taskHeight: Int, + val taskWidth: Int, + val displayArea: Int, + ) + // Default value used when the task was not minimized. @VisibleForTesting const val UNSET_MINIMIZE_REASON = FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__MINIMIZE_REASON__UNSET_MINIMIZE /** The reason a task was minimized. */ - enum class MinimizeReason (val reason: Int) { + enum class MinimizeReason(val reason: Int) { TASK_LIMIT( FrameworkStatsLog .DESKTOP_MODE_SESSION_TASK_UPDATE__MINIMIZE_REASON__MINIMIZE_TASK_LIMIT @@ -211,7 +303,7 @@ class DesktopModeEventLogger { FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__UNMINIMIZE_REASON__UNSET_UNMINIMIZE /** The reason a task was unminimized. */ - enum class UnminimizeReason (val reason: Int) { + enum class UnminimizeReason(val reason: Int) { UNKNOWN( FrameworkStatsLog .DESKTOP_MODE_SESSION_TASK_UPDATE__UNMINIMIZE_REASON__UNMINIMIZE_UNKNOWN @@ -275,8 +367,88 @@ class DesktopModeEventLogger { SCREEN_OFF(FrameworkStatsLog.DESKTOP_MODE_UICHANGED__EXIT_REASON__SCREEN_OFF) } + /** + * Enum ResizeTrigger mapped to the ResizeTrigger definition in + * stats/atoms/desktopmode/desktopmode_extensions_atoms.proto + */ + enum class ResizeTrigger(val trigger: Int) { + UNKNOWN_RESIZE_TRIGGER( + FrameworkStatsLog + .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__UNKNOWN_RESIZE_TRIGGER + ), + CORNER( + FrameworkStatsLog + .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__CORNER_RESIZE_TRIGGER + ), + EDGE( + FrameworkStatsLog + .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__EDGE_RESIZE_TRIGGER + ), + TILING_DIVIDER( + FrameworkStatsLog + .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__TILING_DIVIDER_RESIZE_TRIGGER + ), + MAXIMIZE_BUTTON( + FrameworkStatsLog + .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__MAXIMIZE_BUTTON_RESIZE_TRIGGER + ), + DOUBLE_TAP_APP_HEADER( + FrameworkStatsLog + .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__DOUBLE_TAP_APP_HEADER_RESIZE_TRIGGER + ), + DRAG_LEFT( + FrameworkStatsLog + .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__DRAG_LEFT_RESIZE_TRIGGER + ), + DRAG_RIGHT( + FrameworkStatsLog + .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__DRAG_RIGHT_RESIZE_TRIGGER + ), + SNAP_LEFT_MENU( + FrameworkStatsLog + .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__SNAP_LEFT_MENU_RESIZE_TRIGGER + ), + SNAP_RIGHT_MENU( + FrameworkStatsLog + .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__SNAP_RIGHT_MENU_RESIZE_TRIGGER + ), + } + + /** + * Enum InputMethod mapped to the InputMethod definition in + * stats/atoms/desktopmode/desktopmode_extensions_atoms.proto + */ + enum class InputMethod(val method: Int) { + UNKNOWN_INPUT_METHOD( + FrameworkStatsLog + .DESKTOP_MODE_TASK_SIZE_UPDATED__INPUT_METHOD__UNKNOWN_INPUT_METHOD + ), + TOUCH( + FrameworkStatsLog + .DESKTOP_MODE_TASK_SIZE_UPDATED__INPUT_METHOD__TOUCH_INPUT_METHOD + ), + STYLUS( + FrameworkStatsLog + .DESKTOP_MODE_TASK_SIZE_UPDATED__INPUT_METHOD__STYLUS_INPUT_METHOD + ), + MOUSE( + FrameworkStatsLog + .DESKTOP_MODE_TASK_SIZE_UPDATED__INPUT_METHOD__MOUSE_INPUT_METHOD + ), + TOUCHPAD( + FrameworkStatsLog + .DESKTOP_MODE_TASK_SIZE_UPDATED__INPUT_METHOD__TOUCHPAD_INPUT_METHOD + ), + KEYBOARD( + FrameworkStatsLog + .DESKTOP_MODE_TASK_SIZE_UPDATED__INPUT_METHOD__KEYBOARD_INPUT_METHOD + ), + } + private const val DESKTOP_MODE_ATOM_ID = FrameworkStatsLog.DESKTOP_MODE_UI_CHANGED private const val DESKTOP_MODE_TASK_UPDATE_ATOM_ID = FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE + private const val DESKTOP_MODE_TASK_SIZE_UPDATED_ATOM_ID = + FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeEventLoggerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeEventLoggerTest.kt index 6a5719ba0125..d7a132dfa1be 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeEventLoggerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeEventLoggerTest.kt @@ -16,15 +16,22 @@ package com.android.wm.shell.desktopmode +import android.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags +import android.platform.test.flag.junit.SetFlagsRule import com.android.dx.mockito.inline.extended.ExtendedMockito.verify import com.android.internal.util.FrameworkStatsLog import com.android.modules.utils.testing.ExtendedMockitoRule +import com.android.window.flags.Flags import com.android.wm.shell.EventLogTags import com.android.wm.shell.ShellTestCase import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.EnterReason import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ExitReason import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.MinimizeReason +import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ResizeTrigger +import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.InputMethod import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.TaskUpdate +import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.TaskSizeUpdate import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.UnminimizeReason import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.UNSET_MINIMIZE_REASON import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.UNSET_UNMINIMIZE_REASON @@ -41,11 +48,15 @@ class DesktopModeEventLoggerTest : ShellTestCase() { private val desktopModeEventLogger = DesktopModeEventLogger() @JvmField - @Rule + @Rule(order = 0) val extendedMockitoRule = ExtendedMockitoRule.Builder(this) .mockStatic(FrameworkStatsLog::class.java) .mockStatic(EventLogTags::class.java).build()!! + @JvmField + @Rule(order = 1) + val setFlagsRule = SetFlagsRule() + @Test fun logSessionEnter_enterReason() = runBlocking { desktopModeEventLogger.logSessionEnter(sessionId = SESSION_ID, EnterReason.UNKNOWN_ENTER) @@ -328,7 +339,65 @@ class DesktopModeEventLoggerTest : ShellTestCase() { } } - companion object { + @Test + @EnableFlags(Flags.FLAG_ENABLE_RESIZING_METRICS) + fun logTaskResizingStarted_logsTaskSizeUpdatedWithStartResizingStage() = runBlocking { + desktopModeEventLogger.logTaskResizingStarted(sessionId = SESSION_ID, createTaskSizeUpdate()) + + verify { + FrameworkStatsLog.write(eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED), + /* resize_trigger */ + eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__UNKNOWN_RESIZE_TRIGGER), + /* resizing_stage */ + eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZING_STAGE__START_RESIZING_STAGE), + /* input_method */ + eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__INPUT_METHOD__UNKNOWN_INPUT_METHOD), + /* desktop_mode_session_id */ + eq(SESSION_ID), + /* instance_id */ + eq(TASK_SIZE_UPDATE.instanceId), + /* uid */ + eq(TASK_SIZE_UPDATE.uid), + /* task_height */ + eq(TASK_SIZE_UPDATE.taskHeight), + /* task_width */ + eq(TASK_SIZE_UPDATE.taskWidth), + /* display_area */ + eq(TASK_SIZE_UPDATE.displayArea), + ) + } + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_RESIZING_METRICS) + fun logTaskResizingEnded_logsTaskSizeUpdatedWithEndResizingStage() = runBlocking { + desktopModeEventLogger.logTaskResizingEnded(sessionId = SESSION_ID, createTaskSizeUpdate()) + + verify { + FrameworkStatsLog.write(eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED), + /* resize_trigger */ + eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__UNKNOWN_RESIZE_TRIGGER), + /* resizing_stage */ + eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZING_STAGE__END_RESIZING_STAGE), + /* input_method */ + eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__INPUT_METHOD__UNKNOWN_INPUT_METHOD), + /* desktop_mode_session_id */ + eq(SESSION_ID), + /* instance_id */ + eq(TASK_SIZE_UPDATE.instanceId), + /* uid */ + eq(TASK_SIZE_UPDATE.uid), + /* task_height */ + eq(TASK_SIZE_UPDATE.taskHeight), + /* task_width */ + eq(TASK_SIZE_UPDATE.taskWidth), + /* display_area */ + eq(TASK_SIZE_UPDATE.displayArea), + ) + } + } + + private companion object { private const val SESSION_ID = 1 private const val TASK_ID = 1 private const val TASK_UID = 1 @@ -337,12 +406,36 @@ class DesktopModeEventLoggerTest : ShellTestCase() { private const val TASK_HEIGHT = 100 private const val TASK_WIDTH = 100 private const val TASK_COUNT = 1 + private const val DISPLAY_AREA = 1000 private val TASK_UPDATE = TaskUpdate( TASK_ID, TASK_UID, TASK_HEIGHT, TASK_WIDTH, TASK_X, TASK_Y, visibleTaskCount = TASK_COUNT, ) + private val TASK_SIZE_UPDATE = TaskSizeUpdate( + resizeTrigger = ResizeTrigger.UNKNOWN_RESIZE_TRIGGER, + inputMethod = InputMethod.UNKNOWN_INPUT_METHOD, + TASK_ID, + TASK_UID, + TASK_HEIGHT, + TASK_WIDTH, + DISPLAY_AREA, + ) + + private fun createTaskSizeUpdate( + resizeTrigger: ResizeTrigger = ResizeTrigger.UNKNOWN_RESIZE_TRIGGER, + inputMethod: InputMethod = InputMethod.UNKNOWN_INPUT_METHOD, + ) = TaskSizeUpdate( + resizeTrigger, + inputMethod, + TASK_ID, + TASK_UID, + TASK_HEIGHT, + TASK_WIDTH, + DISPLAY_AREA, + ) + private fun createTaskUpdate( minimizeReason: MinimizeReason? = null, unminimizeReason: UnminimizeReason? = null, |