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

Commit a550cf30 authored by Vania Desmonda's avatar Vania Desmonda
Browse files

Add logging methods for task resize events in Desktop mode.

Change-Id: I2cb1932de5e5ec7283fd5a8e2860ec24c66c4401
Test: atest DesktopModeEventLoggerTest
Bug: 341320763
Flag: EXEMPT adding new logging methods
parent 26d17f19
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,