Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4f81b666 authored by Vania Desmonda's avatar Vania Desmonda Committed by Android (Google) Code Review
Browse files

Merge "Add logging methods for task resize events in Desktop mode." into main

parents 7ec04416 a550cf30
Loading
Loading
Loading
Loading
+177 −5
Original line number Diff line number Diff line
@@ -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,6 +258,28 @@ 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 =
@@ -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
    }
}
+95 −2
Original line number Diff line number Diff line
@@ -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,