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

Commit aec8597a authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Log focus-changed updates." into main

parents a42aeb70 2b095a7a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -8,4 +8,4 @@ option java_package com.android.wm.shell

38500 wm_shell_enter_desktop_mode (EnterReason|1|5),(SessionId|1|5)
38501 wm_shell_exit_desktop_mode (ExitReason|1|5),(SessionId|1|5)
38502 wm_shell_desktop_mode_task_update (TaskEvent|1|5),(InstanceId|1|5),(uid|1|5),(TaskHeight|1),(TaskWidth|1),(TaskX|1),(TaskY|1),(SessionId|1|5),(MinimiseReason|1|5),(UnminimiseReason|1|5),(VisibleTaskCount|1)
38502 wm_shell_desktop_mode_task_update (TaskEvent|1|5),(InstanceId|1|5),(uid|1|5),(TaskHeight|1),(TaskWidth|1),(TaskX|1),(TaskY|1),(SessionId|1|5),(MinimiseReason|1|5),(UnminimiseReason|1|5),(VisibleTaskCount|1),(FocusReason|1|5)
+15 −0
Original line number Diff line number Diff line
@@ -342,6 +342,7 @@ class DesktopModeEventLogger {
            taskUpdate.unminimizeReason?.reason ?: UNSET_UNMINIMIZE_REASON,
            /* visible_task_count */
            taskUpdate.visibleTaskCount,
            taskUpdate.focusReason?.reason ?: UNSET_FOCUS_REASON,
        )
        EventLogTags.writeWmShellDesktopModeTaskUpdate(
            /* task_event */
@@ -364,6 +365,7 @@ class DesktopModeEventLogger {
            taskUpdate.unminimizeReason?.reason ?: UNSET_UNMINIMIZE_REASON,
            /* visible_task_count */
            taskUpdate.visibleTaskCount,
            taskUpdate.focusReason?.reason ?: UNSET_FOCUS_REASON,
        )
    }

@@ -408,6 +410,8 @@ class DesktopModeEventLogger {
         * @property taskY y-coordinate of the top-left corner
         * @property minimizeReason the reason the task was minimized
         * @property unminimizeReason the reason the task was unminimized
         * @property visibleTaskCount the number of visible tasks after this update
         * @property focusReason the reason the task was focused
         */
        data class TaskUpdate(
            val instanceId: Int,
@@ -419,6 +423,7 @@ class DesktopModeEventLogger {
            val minimizeReason: MinimizeReason? = null,
            val unminimizeReason: UnminimizeReason? = null,
            val visibleTaskCount: Int,
            val focusReason: FocusReason? = null,
        )

        /**
@@ -509,6 +514,16 @@ class DesktopModeEventLogger {
            ),
        }

        // Default value used when the task was not unminimized.
        @VisibleForTesting
        const val UNSET_FOCUS_REASON =
            FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__FOCUS_REASON__UNSET_FOCUS

        /** The reason a task was unminimized. */
        enum class FocusReason(val reason: Int) {
            UNKNOWN(FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__FOCUS_REASON__FOCUS_UNKNOWN)
        }

        /**
         * Enum EnterReason mapped to the EnterReason definition in
         * stats/atoms/desktopmode/desktopmode_extensions_atoms.proto
+51 −1
Original line number Diff line number Diff line
@@ -27,7 +27,9 @@ import android.os.Trace
import android.util.SparseArray
import android.view.SurfaceControl
import android.view.WindowManager
import android.view.WindowManager.TRANSIT_OPEN
import android.window.TransitionInfo
import android.window.TransitionInfo.FLAG_MOVED_TO_TOP
import androidx.annotation.VisibleForTesting
import androidx.core.util.containsKey
import androidx.core.util.forEach
@@ -39,6 +41,7 @@ import com.android.internal.protolog.ProtoLog
import com.android.wm.shell.ShellTaskOrganizer
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.FocusReason
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.MinimizeReason
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.TaskUpdate
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.UnminimizeReason
@@ -91,6 +94,8 @@ class DesktopModeLoggerTransitionObserver(
    // following enter reason could be Screen On
    private var wasPreviousTransitionExitByScreenOff: Boolean = false

    private var focusedFreeformTask: TaskInfo? = null

    @VisibleForTesting var isSessionActive: Boolean = false

    fun onInit() {
@@ -151,6 +156,7 @@ class DesktopModeLoggerTransitionObserver(
            transitionInfo = info,
            preTransitionVisibleFreeformTasks = visibleFreeformTaskInfos,
            postTransitionVisibleFreeformTasks = postTransitionVisibleFreeformTasks,
            newFocusedFreeformTask = getNewFocusedFreeformTask(info),
        )
        wasPreviousTransitionExitToOverview = info.isExitToRecentsTransition()
    }
@@ -161,6 +167,19 @@ class DesktopModeLoggerTransitionObserver(

    override fun onTransitionFinished(transition: IBinder, aborted: Boolean) {}

    // Returns null if there was no change in focused task
    private fun getNewFocusedFreeformTask(info: TransitionInfo): TaskInfo? {
        val freeformWindowChanges =
            info.changes
                .filter { it.taskInfo != null && it.requireTaskInfo().taskId != INVALID_TASK_ID }
                .filter { it.requireTaskInfo().isFreeformWindow() }
        return freeformWindowChanges
            .findLast { change ->
                change.hasFlags(FLAG_MOVED_TO_TOP) || change.mode == TRANSIT_OPEN
            }
            ?.taskInfo
    }

    private fun getPostTransitionVisibleFreeformTaskInfos(
        info: TransitionInfo
    ): SparseArray<TaskInfo> {
@@ -238,6 +257,7 @@ class DesktopModeLoggerTransitionObserver(
        transitionInfo: TransitionInfo,
        preTransitionVisibleFreeformTasks: SparseArray<TaskInfo>,
        postTransitionVisibleFreeformTasks: SparseArray<TaskInfo>,
        newFocusedFreeformTask: TaskInfo?,
    ) {
        if (
            postTransitionVisibleFreeformTasks.isEmpty() &&
@@ -250,6 +270,7 @@ class DesktopModeLoggerTransitionObserver(
                transitionInfo,
                preTransitionVisibleFreeformTasks,
                postTransitionVisibleFreeformTasks,
                newFocusedFreeformTask,
            )

            desktopModeEventLogger.logSessionExit(getExitReason(transitionInfo))
@@ -268,6 +289,7 @@ class DesktopModeLoggerTransitionObserver(
                transitionInfo,
                preTransitionVisibleFreeformTasks,
                postTransitionVisibleFreeformTasks,
                newFocusedFreeformTask,
            )
        } else if (isSessionActive) {
            // Session is neither starting, nor finishing, log task updates if there are any
@@ -276,12 +298,14 @@ class DesktopModeLoggerTransitionObserver(
                transitionInfo,
                preTransitionVisibleFreeformTasks,
                postTransitionVisibleFreeformTasks,
                newFocusedFreeformTask,
            )
        }

        // update the state to the new version
        visibleFreeformTaskInfos.clear()
        visibleFreeformTaskInfos.putAll(postTransitionVisibleFreeformTasks)
        focusedFreeformTask = newFocusedFreeformTask
    }

    /** Compare the old and new state of taskInfos and identify and log the changes */
@@ -290,10 +314,16 @@ class DesktopModeLoggerTransitionObserver(
        transitionInfo: TransitionInfo,
        preTransitionVisibleFreeformTasks: SparseArray<TaskInfo>,
        postTransitionVisibleFreeformTasks: SparseArray<TaskInfo>,
        newFocusedFreeformTask: TaskInfo?,
    ) {
        postTransitionVisibleFreeformTasks.forEach { taskId, taskInfo ->
            val focusChangedReason = getFocusChangedReason(taskId, newFocusedFreeformTask)
            val currentTaskUpdate =
                buildTaskUpdateForTask(taskInfo, postTransitionVisibleFreeformTasks.size())
                buildTaskUpdateForTask(
                    taskInfo,
                    postTransitionVisibleFreeformTasks.size(),
                    focusChangedReason = focusChangedReason,
                )
            val previousTaskInfo = preTransitionVisibleFreeformTasks[taskId]
            when {
                // new tasks added
@@ -314,11 +344,14 @@ class DesktopModeLoggerTransitionObserver(
                        postTransitionVisibleFreeformTasks.size().toString(),
                    )
                }
                focusChangedReason != null ->
                    desktopModeEventLogger.logTaskInfoChanged(currentTaskUpdate)
                // old tasks that were resized or repositioned
                // TODO(b/347935387): Log changes only once they are stable.
                buildTaskUpdateForTask(
                    previousTaskInfo,
                    postTransitionVisibleFreeformTasks.size(),
                    focusChangedReason = focusChangedReason,
                ) != currentTaskUpdate ->
                    desktopModeEventLogger.logTaskInfoChanged(currentTaskUpdate)
            }
@@ -373,11 +406,21 @@ class DesktopModeLoggerTransitionObserver(
        return null
    }

    private fun getFocusChangedReason(
        taskId: Int,
        newFocusedFreeformTask: TaskInfo?,
    ): FocusReason? {
        val newFocusedTask = newFocusedFreeformTask ?: return null
        if (taskId != newFocusedTask.taskId) return null
        return if (newFocusedTask != focusedFreeformTask) FocusReason.UNKNOWN else null
    }

    private fun buildTaskUpdateForTask(
        taskInfo: TaskInfo,
        visibleTasks: Int,
        minimizeReason: MinimizeReason? = null,
        unminimizeReason: UnminimizeReason? = null,
        focusChangedReason: FocusReason? = null,
    ): TaskUpdate {
        val screenBounds = taskInfo.configuration.windowConfiguration.bounds
        val positionInParent = taskInfo.positionInParent
@@ -393,6 +436,7 @@ class DesktopModeLoggerTransitionObserver(
            visibleTaskCount = visibleTasks,
            minimizeReason = minimizeReason,
            unminimizeReason = unminimizeReason,
            focusReason = focusChangedReason,
        )
    }

@@ -475,6 +519,12 @@ class DesktopModeLoggerTransitionObserver(
        visibleFreeformTaskInfos.set(taskInfo.taskId, taskInfo)
    }

    /** Sets the focused task - only used for testing. */
    @VisibleForTesting
    fun setFocusedTaskForTesting(taskInfo: TaskInfo) {
        focusedFreeformTask = taskInfo
    }

    private fun TransitionInfo.Change.requireTaskInfo(): RunningTaskInfo =
        this.taskInfo ?: throw IllegalStateException("Expected TaskInfo in the Change")

+0 −1
Original line number Diff line number Diff line
@@ -33,7 +33,6 @@ import com.android.wm.shell.shared.annotations.ShellMainThread
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus.canEnterDesktopMode
import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource
import com.android.wm.shell.windowdecor.common.DecorThemeUtil
import com.android.wm.shell.windowdecor.common.Theme
import com.android.wm.shell.windowdecor.education.DesktopWindowingEducationTooltipController
import com.android.wm.shell.windowdecor.education.DesktopWindowingEducationTooltipController.TooltipColorScheme
import com.android.wm.shell.windowdecor.education.DesktopWindowingEducationTooltipController.TooltipEducationViewConfig
+64 −0
Original line number Diff line number Diff line
@@ -35,12 +35,14 @@ import com.android.wm.shell.common.DisplayController
import com.android.wm.shell.common.DisplayLayout
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.FocusReason
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.InputMethod
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.MinimizeReason
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.NO_SESSION_ID
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ResizeTrigger
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.TaskSizeUpdate
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.TaskUpdate
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.UNSET_FOCUS_REASON
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.UNSET_MINIMIZE_REASON
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.UNSET_UNMINIMIZE_REASON
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.UnminimizeReason
@@ -188,6 +190,7 @@ class DesktopModeEventLoggerTest : ShellTestCase() {
            UNSET_MINIMIZE_REASON,
            UNSET_UNMINIMIZE_REASON,
            TASK_COUNT,
            UNSET_FOCUS_REASON,
        )
        verify {
            EventLogTags.writeWmShellDesktopModeTaskUpdate(
@@ -202,6 +205,7 @@ class DesktopModeEventLoggerTest : ShellTestCase() {
                eq(UNSET_MINIMIZE_REASON),
                eq(UNSET_UNMINIMIZE_REASON),
                eq(TASK_COUNT),
                eq(UNSET_FOCUS_REASON),
            )
        }
        verifyZeroInteractions(staticMockMarker(EventLogTags::class.java))
@@ -233,6 +237,7 @@ class DesktopModeEventLoggerTest : ShellTestCase() {
            UNSET_MINIMIZE_REASON,
            UNSET_UNMINIMIZE_REASON,
            TASK_COUNT,
            UNSET_FOCUS_REASON,
        )
        verify {
            EventLogTags.writeWmShellDesktopModeTaskUpdate(
@@ -247,6 +252,7 @@ class DesktopModeEventLoggerTest : ShellTestCase() {
                eq(UNSET_MINIMIZE_REASON),
                eq(UNSET_UNMINIMIZE_REASON),
                eq(TASK_COUNT),
                eq(UNSET_FOCUS_REASON),
            )
        }
        verifyZeroInteractions(staticMockMarker(EventLogTags::class.java))
@@ -278,6 +284,7 @@ class DesktopModeEventLoggerTest : ShellTestCase() {
            UNSET_MINIMIZE_REASON,
            UNSET_UNMINIMIZE_REASON,
            TASK_COUNT,
            UNSET_FOCUS_REASON,
        )
        verify {
            EventLogTags.writeWmShellDesktopModeTaskUpdate(
@@ -295,6 +302,7 @@ class DesktopModeEventLoggerTest : ShellTestCase() {
                eq(UNSET_MINIMIZE_REASON),
                eq(UNSET_UNMINIMIZE_REASON),
                eq(TASK_COUNT),
                eq(UNSET_FOCUS_REASON),
            )
        }
        verifyZeroInteractions(staticMockMarker(EventLogTags::class.java))
@@ -320,6 +328,7 @@ class DesktopModeEventLoggerTest : ShellTestCase() {
            MinimizeReason.TASK_LIMIT.reason,
            UNSET_UNMINIMIZE_REASON,
            TASK_COUNT,
            UNSET_FOCUS_REASON,
        )
        verify {
            EventLogTags.writeWmShellDesktopModeTaskUpdate(
@@ -337,6 +346,7 @@ class DesktopModeEventLoggerTest : ShellTestCase() {
                eq(MinimizeReason.TASK_LIMIT.reason),
                eq(UNSET_UNMINIMIZE_REASON),
                eq(TASK_COUNT),
                eq(UNSET_FOCUS_REASON),
            )
        }
        verifyZeroInteractions(staticMockMarker(EventLogTags::class.java))
@@ -362,6 +372,7 @@ class DesktopModeEventLoggerTest : ShellTestCase() {
            UNSET_MINIMIZE_REASON,
            UnminimizeReason.TASKBAR_TAP.reason,
            TASK_COUNT,
            UNSET_FOCUS_REASON,
        )
        verify {
            EventLogTags.writeWmShellDesktopModeTaskUpdate(
@@ -379,6 +390,51 @@ class DesktopModeEventLoggerTest : ShellTestCase() {
                eq(UNSET_MINIMIZE_REASON),
                eq(UnminimizeReason.TASKBAR_TAP.reason),
                eq(TASK_COUNT),
                eq(UNSET_FOCUS_REASON),
            )
        }
        verifyZeroInteractions(staticMockMarker(EventLogTags::class.java))
    }

    @Test
    fun logTaskInfoChanged_logsTaskUpdateWithFocusReason() {
        val sessionId = startDesktopModeSession()

        desktopModeEventLogger.logTaskInfoChanged(
            createTaskUpdate(focusChangesReason = FocusReason.UNKNOWN)
        )

        verifyOnlyOneTaskUpdateLogging(
            FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INFO_CHANGED,
            TASK_UPDATE.instanceId,
            TASK_UPDATE.uid,
            TASK_UPDATE.taskHeight,
            TASK_UPDATE.taskWidth,
            TASK_UPDATE.taskX,
            TASK_UPDATE.taskY,
            sessionId,
            UNSET_MINIMIZE_REASON,
            UNSET_UNMINIMIZE_REASON,
            TASK_COUNT,
            FocusReason.UNKNOWN.reason,
        )
        verify {
            EventLogTags.writeWmShellDesktopModeTaskUpdate(
                eq(
                    FrameworkStatsLog
                        .DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INFO_CHANGED
                ),
                eq(TASK_UPDATE.instanceId),
                eq(TASK_UPDATE.uid),
                eq(TASK_UPDATE.taskHeight),
                eq(TASK_UPDATE.taskWidth),
                eq(TASK_UPDATE.taskX),
                eq(TASK_UPDATE.taskY),
                eq(sessionId),
                eq(UNSET_MINIMIZE_REASON),
                eq(UNSET_UNMINIMIZE_REASON),
                eq(TASK_COUNT),
                eq(FocusReason.UNKNOWN.reason),
            )
        }
        verifyZeroInteractions(staticMockMarker(EventLogTags::class.java))
@@ -497,6 +553,8 @@ class DesktopModeEventLoggerTest : ShellTestCase() {
                eq(UNSET_UNMINIMIZE_REASON),
                /* visible_task_count */
                eq(0),
                /* focus_reason */
                eq(UNSET_FOCUS_REASON),
            )
        }
    }
@@ -536,6 +594,7 @@ class DesktopModeEventLoggerTest : ShellTestCase() {
                    anyInt(),
                    anyInt(),
                    anyInt(),
                    anyInt(),
                )
            },
            never(),
@@ -597,6 +656,7 @@ class DesktopModeEventLoggerTest : ShellTestCase() {
        minimizeReason: Int,
        unminimizeReason: Int,
        visibleTaskCount: Int,
        focusChangedReason: Int,
    ) {
        verify({
            FrameworkStatsLog.write(
@@ -612,6 +672,7 @@ class DesktopModeEventLoggerTest : ShellTestCase() {
                eq(minimizeReason),
                eq(unminimizeReason),
                eq(visibleTaskCount),
                eq(focusChangedReason),
            )
        })
        verify({
@@ -628,6 +689,7 @@ class DesktopModeEventLoggerTest : ShellTestCase() {
                anyInt(),
                anyInt(),
                anyInt(),
                anyInt(),
            )
        })
    }
@@ -710,6 +772,7 @@ class DesktopModeEventLoggerTest : ShellTestCase() {
        private fun createTaskUpdate(
            minimizeReason: MinimizeReason? = null,
            unminimizeReason: UnminimizeReason? = null,
            focusChangesReason: FocusReason? = null,
        ) =
            TaskUpdate(
                TASK_ID,
@@ -721,6 +784,7 @@ class DesktopModeEventLoggerTest : ShellTestCase() {
                minimizeReason,
                unminimizeReason,
                TASK_COUNT,
                focusChangesReason,
            )
    }
}
Loading