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

Commit f4ea0f6c authored by Jorge Gil's avatar Jorge Gil Committed by Android (Google) Code Review
Browse files

Merge "Expand logging in DesktopTaskChangeListener" into main

parents 54dc16fb 6529dee6
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -984,11 +984,12 @@ public abstract class WMShellModule {
    @Provides
    static Optional<TaskChangeListener> provideDesktopTaskChangeListener(
            @DynamicOverride DesktopUserRepositories desktopUserRepositories,
            DesktopState desktopState) {
            DesktopState desktopState,
            ShellController shellController) {
        if (ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS.isTrue()
                && desktopState.canEnterDesktopMode()) {
            return Optional.of(new DesktopTaskChangeListener(
                    desktopUserRepositories, desktopState));
                    desktopUserRepositories, desktopState, shellController));
        }
        return Optional.empty();
    }
+104 −19
Original line number Diff line number Diff line
@@ -17,25 +17,38 @@
package com.android.wm.shell.desktopmode

import android.app.ActivityManager.RunningTaskInfo
import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
import android.window.DesktopExperienceFlags
import android.window.DesktopModeFlags
import com.android.internal.protolog.ProtoLog
import com.android.wm.shell.freeform.TaskChangeListener
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
import com.android.wm.shell.shared.desktopmode.DesktopState
import com.android.wm.shell.sysui.ShellController

/** Manages tasks handling specific to Android Desktop Mode. */
class DesktopTaskChangeListener(
    private val desktopUserRepositories: DesktopUserRepositories,
    private val desktopState: DesktopState,
    private val shellController: ShellController,
) : TaskChangeListener {

    override fun onTaskOpening(taskInfo: RunningTaskInfo) {
        logD("onTaskOpening for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId)
        val desktopRepository: DesktopRepository =
            desktopUserRepositories.getProfile(taskInfo.userId)
        if (!isFreeformTask(taskInfo) && desktopRepository.isActiveTask(taskInfo.taskId)) {
        val isFreeformTask = taskInfo.isFreeform
        val isActiveTask = desktopRepository.isActiveTask(taskInfo.taskId)
        logD(
            "onTaskOpening for taskId=%d, displayId=%d userId=%s currentUserId=%d " +
                "parentTaskId=%b isFreeform=%b isActive=%b",
            taskInfo.taskId,
            taskInfo.displayId,
            taskInfo.userId,
            shellController.currentUserId,
            taskInfo.parentTaskId,
            isFreeformTask,
            isActiveTask,
        )
        if (!isFreeformTask && isActiveTask) {
            desktopRepository.removeTask(taskInfo.taskId)
            return
        }
@@ -43,14 +56,20 @@ class DesktopTaskChangeListener(
            !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) &&
                DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue
        ) {
            logD(
                "onTaskOpening for taskId=%d, displayId=%d - desktop not supported",
                taskInfo.taskId,
                taskInfo.displayId,
            )
            return
        }
        if (isFreeformTask(taskInfo) && !desktopRepository.isActiveTask(taskInfo.taskId)) {
        if (isFreeformTask && !isActiveTask) {
            // TODO: b/420917959 - Remove this once LaunchParams respects activity options set for
            // [DesktopWallpaperActivity] launch which should always be in fullscreen.
            if (DesktopWallpaperActivity.isWallpaperTask(taskInfo)) {
                logE(
                    "Trying to add freeform DesktopWallpaperActivity to DesktopRepository, returning early instead"
                    "Trying to add freeform DesktopWallpaperActivity to DesktopRepository, " +
                        "returning early instead"
                )
                return
            }
@@ -64,15 +83,32 @@ class DesktopTaskChangeListener(
    }

    override fun onTaskChanging(taskInfo: RunningTaskInfo) {
        logD("onTaskChanging for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId)
        if (
            !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) &&
                DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue
        ) {
            logD(
                "onTaskChanging for taskId=%d, displayId=%d - desktop not supported",
                taskInfo.taskId,
                taskInfo.displayId,
            )
            return
        }
        val desktopRepository: DesktopRepository =
            desktopUserRepositories.getProfile(taskInfo.userId)
        val isFreeformTask = taskInfo.isFreeform
        val isActiveTask = desktopRepository.isActiveTask(taskInfo.taskId)
        logD(
            "onTaskChanging for taskId=%d, displayId=%d userId=%s currentUserId=%d " +
                "parentTaskId=%b isFreeform=%b isActive=%b",
            taskInfo.taskId,
            taskInfo.displayId,
            taskInfo.userId,
            shellController.currentUserId,
            taskInfo.parentTaskId,
            isFreeformTask,
            isActiveTask,
        )
        // TODO: b/394281403 - with multiple desks, it's possible to have a non-freeform task
        //  inside a desk, so this should be decoupled from windowing mode.
        //  Also, changes in/out of desks are handled by the [DesksTransitionObserver], which has
@@ -82,14 +118,15 @@ class DesktopTaskChangeListener(
        // Case 1: When the task change is from a task in the desktop repository which is now
        // fullscreen,
        // remove the task from the desktop repository since it is no longer a freeform task.
        if (!isFreeformTask(taskInfo) && desktopRepository.isActiveTask(taskInfo.taskId)) {
        if (!isFreeformTask && isActiveTask) {
            desktopRepository.removeTask(taskInfo.taskId)
        } else if (isFreeformTask(taskInfo)) {
        } else if (isFreeformTask) {
            // TODO: b/420917959 - Remove this once LaunchParams respects activity options set for
            // [DesktopWallpaperActivity] launch which should always be in fullscreen.
            if (DesktopWallpaperActivity.isWallpaperTask(taskInfo)) {
                logE(
                    "Trying to add freeform DesktopWallpaperActivity to DesktopRepository, returning early instead"
                    "Trying to add freeform DesktopWallpaperActivity to DesktopRepository, " +
                        "returning early instead"
                )
                return
            }
@@ -119,21 +156,38 @@ class DesktopTaskChangeListener(
    }

    override fun onTaskMovingToFront(taskInfo: RunningTaskInfo) {
        logD("onTaskMovingToFront for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId)
        if (
            !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) &&
                DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue
        ) {
            logD(
                "onTaskMovingToFront for taskId=%d, displayId=%d - desktop not supported",
                taskInfo.taskId,
                taskInfo.displayId,
            )
            return
        }
        val desktopRepository: DesktopRepository =
            desktopUserRepositories.getProfile(taskInfo.userId)
        val isFreeformTask = taskInfo.isFreeform
        val isActiveTask = desktopRepository.isActiveTask(taskInfo.taskId)
        logD(
            "onTaskMovingToFront for taskId=%d, displayId=%d userId=%s currentUserId=%d " +
                "parentTaskId=%b isFreeform=%b isActive=%b",
            taskInfo.taskId,
            taskInfo.displayId,
            taskInfo.userId,
            shellController.currentUserId,
            taskInfo.parentTaskId,
            isFreeformTask,
            isActiveTask,
        )
        // When the task change is from a task in the desktop repository which is now fullscreen,
        // remove the task from the desktop repository since it is no longer a freeform task.
        if (!isFreeformTask(taskInfo) && desktopRepository.isActiveTask(taskInfo.taskId)) {
        if (!isFreeformTask && isActiveTask) {
            desktopRepository.removeTask(taskInfo.taskId)
        }
        if (isFreeformTask(taskInfo)) {
        if (isFreeformTask) {
            // TODO: b/420917959 - Remove this once LaunchParams respects activity options set for
            // [DesktopWallpaperActivity] launch which should always be in fullscreen.
            if (DesktopWallpaperActivity.isWallpaperTask(taskInfo)) {
@@ -154,16 +208,33 @@ class DesktopTaskChangeListener(
    }

    override fun onTaskMovingToBack(taskInfo: RunningTaskInfo) {
        logD("onTaskMovingToBack for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId)
        if (
            !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) &&
                DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue
        ) {
            logD(
                "onTaskMovingToBack for taskId=%d, displayId=%d - desktop not supported",
                taskInfo.taskId,
                taskInfo.displayId,
            )
            return
        }
        val desktopRepository: DesktopRepository =
            desktopUserRepositories.getProfile(taskInfo.userId)
        if (!desktopRepository.isActiveTask(taskInfo.taskId)) return
        val isFreeformTask = taskInfo.isFreeform
        val isActiveTask = desktopRepository.isActiveTask(taskInfo.taskId)
        logD(
            "onTaskMovingToBack for taskId=%d, displayId=%d userId=%s currentUserId=%d " +
                "parentTaskId=%b isFreeform=%b isActive=%b",
            taskInfo.taskId,
            taskInfo.displayId,
            taskInfo.userId,
            shellController.currentUserId,
            taskInfo.parentTaskId,
            isFreeformTask,
            isActiveTask,
        )
        if (!isActiveTask) return
        desktopRepository.updateTask(
            taskInfo.displayId,
            taskInfo.taskId,
@@ -173,16 +244,33 @@ class DesktopTaskChangeListener(
    }

    override fun onTaskClosing(taskInfo: RunningTaskInfo) {
        logD("onTaskClosing for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId)
        if (
            !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) &&
                DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue
        ) {
            logD(
                "onTaskClosing for taskId=%d, displayId=%d - desktop not supported",
                taskInfo.taskId,
                taskInfo.displayId,
            )
            return
        }
        val desktopRepository: DesktopRepository =
            desktopUserRepositories.getProfile(taskInfo.userId)
        if (!desktopRepository.isActiveTask(taskInfo.taskId)) return
        val isFreeformTask = taskInfo.isFreeform
        val isActiveTask = desktopRepository.isActiveTask(taskInfo.taskId)
        logD(
            "onTaskClosing for taskId=%d, displayId=%d userId=%s currentUserId=%d " +
                "parentTaskId=%b isFreeform=%b isActive=%b",
            taskInfo.taskId,
            taskInfo.displayId,
            taskInfo.userId,
            shellController.currentUserId,
            taskInfo.parentTaskId,
            isFreeformTask,
            isActiveTask,
        )
        if (!isActiveTask) return

        val isMinimized = desktopRepository.isMinimizedTask(taskInfo.taskId)
        // TODO: b/370038902 - Handle Activity#finishAndRemoveTask.
@@ -207,9 +295,6 @@ class DesktopTaskChangeListener(
        }
    }

    private fun isFreeformTask(taskInfo: RunningTaskInfo): Boolean =
        taskInfo.windowingMode == WINDOWING_MODE_FREEFORM

    private fun logD(msg: String, vararg arguments: Any?) {
        ProtoLog.d(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments)
    }
+4 −1
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import com.android.wm.shell.TestRunningTaskInfoBuilder
import com.android.wm.shell.desktopmode.DesktopTestHelpers.createFreeformTask
import com.android.wm.shell.desktopmode.DesktopTestHelpers.createFullscreenTask
import com.android.wm.shell.shared.desktopmode.FakeDesktopState
import com.android.wm.shell.sysui.ShellController
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -55,6 +56,7 @@ class DesktopTaskChangeListenerTest : ShellTestCase() {
    private lateinit var desktopTaskChangeListener: DesktopTaskChangeListener

    private val desktopUserRepositories = mock<DesktopUserRepositories>()
    private val shellController = mock<ShellController>()
    private val desktopRepository = mock<DesktopRepository>()
    private val desktopState =
        FakeDesktopState().apply {
@@ -64,7 +66,8 @@ class DesktopTaskChangeListenerTest : ShellTestCase() {

    @Before
    fun setUp() {
        desktopTaskChangeListener = DesktopTaskChangeListener(desktopUserRepositories, desktopState)
        desktopTaskChangeListener =
            DesktopTaskChangeListener(desktopUserRepositories, desktopState, shellController)

        whenever(desktopUserRepositories.current).thenReturn(desktopRepository)
        whenever(desktopUserRepositories.getProfile(anyInt())).thenReturn(desktopRepository)