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

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

Merge "Desktop Windowing: Log task minimize reasons" into main

parents 2bc4a7e2 98f85f45
Loading
Loading
Loading
Loading
+5 −2
Original line number Original line Diff line number Diff line
@@ -1154,9 +1154,12 @@ public abstract class WMShellModule {
            Context context,
            Context context,
            ShellInit shellInit,
            ShellInit shellInit,
            Transitions transitions,
            Transitions transitions,
            DesktopModeEventLogger desktopModeEventLogger) {
            DesktopModeEventLogger desktopModeEventLogger,
            Optional<DesktopTasksLimiter> desktopTasksLimiter,
            ShellTaskOrganizer shellTaskOrganizer) {
        return new DesktopModeLoggerTransitionObserver(
        return new DesktopModeLoggerTransitionObserver(
                context, shellInit, transitions, desktopModeEventLogger);
                context, shellInit, transitions, desktopModeEventLogger,
                desktopTasksLimiter, shellTaskOrganizer);
    }
    }


    @WMSingleton
    @WMSingleton
+5 −1
Original line number Original line Diff line number Diff line
@@ -467,9 +467,13 @@ class DesktopModeEventLogger {
                FrameworkStatsLog
                FrameworkStatsLog
                    .DESKTOP_MODE_SESSION_TASK_UPDATE__MINIMIZE_REASON__MINIMIZE_TASK_LIMIT
                    .DESKTOP_MODE_SESSION_TASK_UPDATE__MINIMIZE_REASON__MINIMIZE_TASK_LIMIT
            ),
            ),
            MINIMIZE_BUTTON( // TODO(b/356843241): use this enum value
            MINIMIZE_BUTTON(
                FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__MINIMIZE_REASON__MINIMIZE_BUTTON
                FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__MINIMIZE_REASON__MINIMIZE_BUTTON
            ),
            ),
            KEY_GESTURE(
                FrameworkStatsLog
                    .DESKTOP_MODE_SESSION_TASK_UPDATE__MINIMIZE_REASON__MINIMIZE_KEY_GESTURE
            ),
        }
        }


        // Default value used when the task was not unminimized.
        // Default value used when the task was not unminimized.
+4 −1
Original line number Original line Diff line number Diff line
@@ -30,6 +30,7 @@ import com.android.window.flags.Flags.enableTaskResizingKeyboardShortcuts
import com.android.wm.shell.ShellTaskOrganizer
import com.android.wm.shell.ShellTaskOrganizer
import com.android.wm.shell.common.DisplayController
import com.android.wm.shell.common.DisplayController
import com.android.wm.shell.common.ShellExecutor
import com.android.wm.shell.common.ShellExecutor
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.MinimizeReason
import com.android.wm.shell.desktopmode.common.ToggleTaskSizeInteraction
import com.android.wm.shell.desktopmode.common.ToggleTaskSizeInteraction
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
import com.android.wm.shell.shared.annotations.ShellMainThread
import com.android.wm.shell.shared.annotations.ShellMainThread
@@ -125,7 +126,9 @@ class DesktopModeKeyGestureHandler(
            KeyGestureEvent.KEY_GESTURE_TYPE_MINIMIZE_FREEFORM_WINDOW -> {
            KeyGestureEvent.KEY_GESTURE_TYPE_MINIMIZE_FREEFORM_WINDOW -> {
                logV("Key gesture MINIMIZE_FREEFORM_WINDOW is handled")
                logV("Key gesture MINIMIZE_FREEFORM_WINDOW is handled")
                getGloballyFocusedFreeformTask()?.let {
                getGloballyFocusedFreeformTask()?.let {
                    mainExecutor.execute { desktopTasksController.get().minimizeTask(it) }
                    mainExecutor.execute {
                        desktopTasksController.get().minimizeTask(it, MinimizeReason.KEY_GESTURE)
                    }
                }
                }
                return true
                return true
            }
            }
+29 −6
Original line number Original line Diff line number Diff line
@@ -36,6 +36,7 @@ import androidx.core.util.isNotEmpty
import androidx.core.util.plus
import androidx.core.util.plus
import androidx.core.util.putAll
import androidx.core.util.putAll
import com.android.internal.protolog.ProtoLog
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.EnterReason
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ExitReason
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.MinimizeReason
@@ -52,6 +53,8 @@ import com.android.wm.shell.shared.TransitionUtil
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
import com.android.wm.shell.sysui.ShellInit
import com.android.wm.shell.sysui.ShellInit
import com.android.wm.shell.transition.Transitions
import com.android.wm.shell.transition.Transitions
import java.util.Optional
import kotlin.jvm.optionals.getOrNull


/**
/**
 * A [Transitions.TransitionObserver] that observes transitions and the proposed changes to log
 * A [Transitions.TransitionObserver] that observes transitions and the proposed changes to log
@@ -63,6 +66,8 @@ class DesktopModeLoggerTransitionObserver(
    shellInit: ShellInit,
    shellInit: ShellInit,
    private val transitions: Transitions,
    private val transitions: Transitions,
    private val desktopModeEventLogger: DesktopModeEventLogger,
    private val desktopModeEventLogger: DesktopModeEventLogger,
    private val desktopTasksLimiter: Optional<DesktopTasksLimiter>,
    private val shellTaskOrganizer: ShellTaskOrganizer,
) : Transitions.TransitionObserver {
) : Transitions.TransitionObserver {


    init {
    init {
@@ -141,6 +146,7 @@ class DesktopModeLoggerTransitionObserver(


        // identify if we need to log any changes and update the state of visible freeform tasks
        // identify if we need to log any changes and update the state of visible freeform tasks
        identifyLogEventAndUpdateState(
        identifyLogEventAndUpdateState(
            transition = transition,
            transitionInfo = info,
            transitionInfo = info,
            preTransitionVisibleFreeformTasks = visibleFreeformTaskInfos,
            preTransitionVisibleFreeformTasks = visibleFreeformTaskInfos,
            postTransitionVisibleFreeformTasks = postTransitionVisibleFreeformTasks,
            postTransitionVisibleFreeformTasks = postTransitionVisibleFreeformTasks,
@@ -227,6 +233,7 @@ class DesktopModeLoggerTransitionObserver(
     * state and update it
     * state and update it
     */
     */
    private fun identifyLogEventAndUpdateState(
    private fun identifyLogEventAndUpdateState(
        transition: IBinder,
        transitionInfo: TransitionInfo,
        transitionInfo: TransitionInfo,
        preTransitionVisibleFreeformTasks: SparseArray<TaskInfo>,
        preTransitionVisibleFreeformTasks: SparseArray<TaskInfo>,
        postTransitionVisibleFreeformTasks: SparseArray<TaskInfo>,
        postTransitionVisibleFreeformTasks: SparseArray<TaskInfo>,
@@ -238,6 +245,7 @@ class DesktopModeLoggerTransitionObserver(
        ) {
        ) {
            // Sessions is finishing, log task updates followed by an exit event
            // Sessions is finishing, log task updates followed by an exit event
            identifyAndLogTaskUpdates(
            identifyAndLogTaskUpdates(
                transition,
                transitionInfo,
                transitionInfo,
                preTransitionVisibleFreeformTasks,
                preTransitionVisibleFreeformTasks,
                postTransitionVisibleFreeformTasks,
                postTransitionVisibleFreeformTasks,
@@ -255,6 +263,7 @@ class DesktopModeLoggerTransitionObserver(
            desktopModeEventLogger.logSessionEnter(getEnterReason(transitionInfo))
            desktopModeEventLogger.logSessionEnter(getEnterReason(transitionInfo))


            identifyAndLogTaskUpdates(
            identifyAndLogTaskUpdates(
                transition,
                transitionInfo,
                transitionInfo,
                preTransitionVisibleFreeformTasks,
                preTransitionVisibleFreeformTasks,
                postTransitionVisibleFreeformTasks,
                postTransitionVisibleFreeformTasks,
@@ -262,6 +271,7 @@ class DesktopModeLoggerTransitionObserver(
        } else if (isSessionActive) {
        } else if (isSessionActive) {
            // Session is neither starting, nor finishing, log task updates if there are any
            // Session is neither starting, nor finishing, log task updates if there are any
            identifyAndLogTaskUpdates(
            identifyAndLogTaskUpdates(
                transition,
                transitionInfo,
                transitionInfo,
                preTransitionVisibleFreeformTasks,
                preTransitionVisibleFreeformTasks,
                postTransitionVisibleFreeformTasks,
                postTransitionVisibleFreeformTasks,
@@ -275,6 +285,7 @@ class DesktopModeLoggerTransitionObserver(


    /** Compare the old and new state of taskInfos and identify and log the changes */
    /** Compare the old and new state of taskInfos and identify and log the changes */
    private fun identifyAndLogTaskUpdates(
    private fun identifyAndLogTaskUpdates(
        transition: IBinder,
        transitionInfo: TransitionInfo,
        transitionInfo: TransitionInfo,
        preTransitionVisibleFreeformTasks: SparseArray<TaskInfo>,
        preTransitionVisibleFreeformTasks: SparseArray<TaskInfo>,
        postTransitionVisibleFreeformTasks: SparseArray<TaskInfo>,
        postTransitionVisibleFreeformTasks: SparseArray<TaskInfo>,
@@ -310,12 +321,9 @@ class DesktopModeLoggerTransitionObserver(
        // find old tasks that were removed
        // find old tasks that were removed
        preTransitionVisibleFreeformTasks.forEach { taskId, taskInfo ->
        preTransitionVisibleFreeformTasks.forEach { taskId, taskInfo ->
            if (!postTransitionVisibleFreeformTasks.containsKey(taskId)) {
            if (!postTransitionVisibleFreeformTasks.containsKey(taskId)) {
                val minimizeReason =
                // The task is no longer visible, it might have been minimized, get the minimize
                    if (transitionInfo.type == Transitions.TRANSIT_MINIMIZE) {
                // reason (if any)
                        MinimizeReason.MINIMIZE_BUTTON
                val minimizeReason = getMinimizeReason(transition, transitionInfo, taskInfo)
                    } else {
                        null
                    }
                val taskUpdate =
                val taskUpdate =
                    buildTaskUpdateForTask(
                    buildTaskUpdateForTask(
                        taskInfo,
                        taskInfo,
@@ -336,6 +344,21 @@ class DesktopModeLoggerTransitionObserver(
        }
        }
    }
    }


    private fun getMinimizeReason(
        transition: IBinder,
        transitionInfo: TransitionInfo,
        taskInfo: TaskInfo,
    ): MinimizeReason? {
        if (transitionInfo.type == Transitions.TRANSIT_MINIMIZE) {
            return MinimizeReason.MINIMIZE_BUTTON
        }
        val minimizingTask = desktopTasksLimiter.getOrNull()?.getMinimizingTask(transition)
        if (minimizingTask?.taskId == taskInfo.taskId) {
            return minimizingTask.minimizeReason
        }
        return null
    }

    private fun buildTaskUpdateForTask(
    private fun buildTaskUpdateForTask(
        taskInfo: TaskInfo,
        taskInfo: TaskInfo,
        visibleTasks: Int,
        visibleTasks: Int,
+27 −12
Original line number Original line Diff line number Diff line
@@ -87,6 +87,7 @@ import com.android.wm.shell.common.SyncTransactionQueue
import com.android.wm.shell.compatui.isTopActivityExemptFromDesktopWindowing
import com.android.wm.shell.compatui.isTopActivityExemptFromDesktopWindowing
import com.android.wm.shell.compatui.isTransparentTask
import com.android.wm.shell.compatui.isTransparentTask
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.InputMethod
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.ResizeTrigger
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ResizeTrigger
import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger.DesktopUiEventEnum
import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger.DesktopUiEventEnum
import com.android.wm.shell.desktopmode.DesktopModeVisualIndicator.DragStartState
import com.android.wm.shell.desktopmode.DesktopModeVisualIndicator.DragStartState
@@ -466,7 +467,9 @@ class DesktopTasksController(
        desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted(
        desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted(
            FREEFORM_ANIMATION_DURATION
            FREEFORM_ANIMATION_DURATION
        )
        )
        taskIdToMinimize?.let { addPendingMinimizeTransition(transition, it) }
        taskIdToMinimize?.let {
            addPendingMinimizeTransition(transition, it, MinimizeReason.TASK_LIMIT)
        }
        exitResult.asExit()?.runOnTransitionStart?.invoke(transition)
        exitResult.asExit()?.runOnTransitionStart?.invoke(transition)
        return true
        return true
    }
    }
@@ -512,7 +515,9 @@ class DesktopTasksController(
        desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted(
        desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted(
            FREEFORM_ANIMATION_DURATION
            FREEFORM_ANIMATION_DURATION
        )
        )
        taskIdToMinimize?.let { addPendingMinimizeTransition(transition, it) }
        taskIdToMinimize?.let {
            addPendingMinimizeTransition(transition, it, MinimizeReason.TASK_LIMIT)
        }
        exitResult.asExit()?.runOnTransitionStart?.invoke(transition)
        exitResult.asExit()?.runOnTransitionStart?.invoke(transition)
    }
    }


@@ -573,7 +578,9 @@ class DesktopTasksController(
            DRAG_TO_DESKTOP_FINISH_ANIM_DURATION_MS.toInt()
            DRAG_TO_DESKTOP_FINISH_ANIM_DURATION_MS.toInt()
        )
        )
        transition?.let {
        transition?.let {
            taskIdToMinimize?.let { taskId -> addPendingMinimizeTransition(it, taskId) }
            taskIdToMinimize?.let { taskId ->
                addPendingMinimizeTransition(it, taskId, MinimizeReason.TASK_LIMIT)
            }
            exitResult.asExit()?.runOnTransitionStart?.invoke(transition)
            exitResult.asExit()?.runOnTransitionStart?.invoke(transition)
        }
        }
    }
    }
@@ -622,7 +629,7 @@ class DesktopTasksController(
            ?.runOnTransitionStart
            ?.runOnTransitionStart
    }
    }


    fun minimizeTask(taskInfo: RunningTaskInfo) {
    fun minimizeTask(taskInfo: RunningTaskInfo, minimizeReason: MinimizeReason) {
        val wct = WindowContainerTransaction()
        val wct = WindowContainerTransaction()


        val isMinimizingToPip = taskInfo.pictureInPictureParams?.isAutoEnterEnabled() ?: false
        val isMinimizingToPip = taskInfo.pictureInPictureParams?.isAutoEnterEnabled() ?: false
@@ -642,16 +649,16 @@ class DesktopTasksController(
            freeformTaskTransitionStarter.startPipTransition(wct)
            freeformTaskTransitionStarter.startPipTransition(wct)
            taskRepository.setTaskInPip(taskInfo.displayId, taskInfo.taskId, enterPip = true)
            taskRepository.setTaskInPip(taskInfo.displayId, taskInfo.taskId, enterPip = true)
            taskRepository.setOnPipAbortedCallback { displayId, taskId ->
            taskRepository.setOnPipAbortedCallback { displayId, taskId ->
                minimizeTaskInner(shellTaskOrganizer.getRunningTaskInfo(taskId)!!)
                minimizeTaskInner(shellTaskOrganizer.getRunningTaskInfo(taskId)!!, minimizeReason)
                taskRepository.setTaskInPip(displayId, taskId, enterPip = false)
                taskRepository.setTaskInPip(displayId, taskId, enterPip = false)
            }
            }
            return
            return
        }
        }


        minimizeTaskInner(taskInfo)
        minimizeTaskInner(taskInfo, minimizeReason)
    }
    }


    private fun minimizeTaskInner(taskInfo: RunningTaskInfo) {
    private fun minimizeTaskInner(taskInfo: RunningTaskInfo, minimizeReason: MinimizeReason) {
        val taskId = taskInfo.taskId
        val taskId = taskInfo.taskId
        val displayId = taskInfo.displayId
        val displayId = taskInfo.displayId
        val wct = WindowContainerTransaction()
        val wct = WindowContainerTransaction()
@@ -671,6 +678,7 @@ class DesktopTasksController(
                transition = transition,
                transition = transition,
                displayId = displayId,
                displayId = displayId,
                taskId = taskId,
                taskId = taskId,
                minimizeReason = minimizeReason,
            )
            )
        }
        }
        exitResult.asExit()?.runOnTransitionStart?.invoke(transition)
        exitResult.asExit()?.runOnTransitionStart?.invoke(transition)
@@ -826,7 +834,7 @@ class DesktopTasksController(
                    minimizingTaskId = taskIdToMinimize,
                    minimizingTaskId = taskIdToMinimize,
                    exitingImmersiveTask = exitImmersiveResult.asExit()?.exitingTask,
                    exitingImmersiveTask = exitImmersiveResult.asExit()?.exitingTask,
                )
                )
            taskIdToMinimize?.let { addPendingMinimizeTransition(t, it) }
            taskIdToMinimize?.let { addPendingMinimizeTransition(t, it, MinimizeReason.TASK_LIMIT) }
            exitImmersiveResult.asExit()?.runOnTransitionStart?.invoke(t)
            exitImmersiveResult.asExit()?.runOnTransitionStart?.invoke(t)
            return t
            return t
        }
        }
@@ -846,7 +854,7 @@ class DesktopTasksController(
            )
            )
        val t = transitions.startTransition(transitionType, wct, remoteTransitionHandler)
        val t = transitions.startTransition(transitionType, wct, remoteTransitionHandler)
        remoteTransitionHandler.setTransition(t)
        remoteTransitionHandler.setTransition(t)
        taskIdToMinimize.let { addPendingMinimizeTransition(t, it) }
        taskIdToMinimize.let { addPendingMinimizeTransition(t, it, MinimizeReason.TASK_LIMIT) }
        exitImmersiveResult.asExit()?.runOnTransitionStart?.invoke(t)
        exitImmersiveResult.asExit()?.runOnTransitionStart?.invoke(t)
        return t
        return t
    }
    }
@@ -1898,7 +1906,7 @@ class DesktopTasksController(
        val taskIdToMinimize = addAndGetMinimizeChanges(task.displayId, wct, task.taskId)
        val taskIdToMinimize = addAndGetMinimizeChanges(task.displayId, wct, task.taskId)
        addPendingAppLaunchTransition(transition, task.taskId, taskIdToMinimize)
        addPendingAppLaunchTransition(transition, task.taskId, taskIdToMinimize)
        if (taskIdToMinimize != null) {
        if (taskIdToMinimize != null) {
            addPendingMinimizeTransition(transition, taskIdToMinimize)
            addPendingMinimizeTransition(transition, taskIdToMinimize, MinimizeReason.TASK_LIMIT)
            return wct
            return wct
        }
        }
        if (!wct.isEmpty) {
        if (!wct.isEmpty) {
@@ -1932,7 +1940,9 @@ class DesktopTasksController(
                // Desktop Mode is already showing and we're launching a new Task - we might need to
                // Desktop Mode is already showing and we're launching a new Task - we might need to
                // minimize another Task.
                // minimize another Task.
                val taskIdToMinimize = addAndGetMinimizeChanges(task.displayId, wct, task.taskId)
                val taskIdToMinimize = addAndGetMinimizeChanges(task.displayId, wct, task.taskId)
                taskIdToMinimize?.let { addPendingMinimizeTransition(transition, it) }
                taskIdToMinimize?.let {
                    addPendingMinimizeTransition(transition, it, MinimizeReason.TASK_LIMIT)
                }
                addPendingAppLaunchTransition(transition, task.taskId, taskIdToMinimize)
                addPendingAppLaunchTransition(transition, task.taskId, taskIdToMinimize)
                desktopImmersiveController.exitImmersiveIfApplicable(
                desktopImmersiveController.exitImmersiveIfApplicable(
                    transition,
                    transition,
@@ -2180,13 +2190,18 @@ class DesktopTasksController(
            .addAndGetMinimizeTaskChanges(displayId, wct, newTaskId, launchingNewIntent)
            .addAndGetMinimizeTaskChanges(displayId, wct, newTaskId, launchingNewIntent)
    }
    }


    private fun addPendingMinimizeTransition(transition: IBinder, taskIdToMinimize: Int) {
    private fun addPendingMinimizeTransition(
        transition: IBinder,
        taskIdToMinimize: Int,
        minimizeReason: MinimizeReason,
    ) {
        val taskToMinimize = shellTaskOrganizer.getRunningTaskInfo(taskIdToMinimize)
        val taskToMinimize = shellTaskOrganizer.getRunningTaskInfo(taskIdToMinimize)
        desktopTasksLimiter.ifPresent {
        desktopTasksLimiter.ifPresent {
            it.addPendingMinimizeChange(
            it.addPendingMinimizeChange(
                transition = transition,
                transition = transition,
                displayId = taskToMinimize?.displayId ?: DEFAULT_DISPLAY,
                displayId = taskToMinimize?.displayId ?: DEFAULT_DISPLAY,
                taskId = taskIdToMinimize,
                taskId = taskIdToMinimize,
                minimizeReason = minimizeReason,
            )
            )
        }
        }
    }
    }
Loading