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

Commit 6529dee6 authored by Jorge Gil's avatar Jorge Gil
Browse files

Expand logging in DesktopTaskChangeListener

To help debug b/416032057.

Flag: EXEMPT adding logs
Bug: 416032057
Test: m
Change-Id: I8793d02aea5fbe91cf9add1c24e91864df266580
parent 24a35225
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -982,11 +982,12 @@ public abstract class WMShellModule {
    @Provides
    @Provides
    static Optional<TaskChangeListener> provideDesktopTaskChangeListener(
    static Optional<TaskChangeListener> provideDesktopTaskChangeListener(
            @DynamicOverride DesktopUserRepositories desktopUserRepositories,
            @DynamicOverride DesktopUserRepositories desktopUserRepositories,
            DesktopState desktopState) {
            DesktopState desktopState,
            ShellController shellController) {
        if (ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS.isTrue()
        if (ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS.isTrue()
                && desktopState.canEnterDesktopMode()) {
                && desktopState.canEnterDesktopMode()) {
            return Optional.of(new DesktopTaskChangeListener(
            return Optional.of(new DesktopTaskChangeListener(
                    desktopUserRepositories, desktopState));
                    desktopUserRepositories, desktopState, shellController));
        }
        }
        return Optional.empty();
        return Optional.empty();
    }
    }
+104 −19
Original line number Original line Diff line number Diff line
@@ -17,25 +17,38 @@
package com.android.wm.shell.desktopmode
package com.android.wm.shell.desktopmode


import android.app.ActivityManager.RunningTaskInfo
import android.app.ActivityManager.RunningTaskInfo
import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
import android.window.DesktopExperienceFlags
import android.window.DesktopExperienceFlags
import android.window.DesktopModeFlags
import android.window.DesktopModeFlags
import com.android.internal.protolog.ProtoLog
import com.android.internal.protolog.ProtoLog
import com.android.wm.shell.freeform.TaskChangeListener
import com.android.wm.shell.freeform.TaskChangeListener
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.desktopmode.DesktopState
import com.android.wm.shell.shared.desktopmode.DesktopState
import com.android.wm.shell.sysui.ShellController


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


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


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


    override fun onTaskMovingToFront(taskInfo: RunningTaskInfo) {
    override fun onTaskMovingToFront(taskInfo: RunningTaskInfo) {
        logD("onTaskMovingToFront for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId)
        if (
        if (
            !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) &&
            !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) &&
                DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue
                DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue
        ) {
        ) {
            logD(
                "onTaskMovingToFront for taskId=%d, displayId=%d - desktop not supported",
                taskInfo.taskId,
                taskInfo.displayId,
            )
            return
            return
        }
        }
        val desktopRepository: DesktopRepository =
        val desktopRepository: DesktopRepository =
            desktopUserRepositories.getProfile(taskInfo.userId)
            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,
        // 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.
        // 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)
            desktopRepository.removeTask(taskInfo.taskId)
        }
        }
        if (isFreeformTask(taskInfo)) {
        if (isFreeformTask) {
            // TODO: b/420917959 - Remove this once LaunchParams respects activity options set for
            // TODO: b/420917959 - Remove this once LaunchParams respects activity options set for
            // [DesktopWallpaperActivity] launch which should always be in fullscreen.
            // [DesktopWallpaperActivity] launch which should always be in fullscreen.
            if (DesktopWallpaperActivity.isWallpaperTask(taskInfo)) {
            if (DesktopWallpaperActivity.isWallpaperTask(taskInfo)) {
@@ -154,16 +208,33 @@ class DesktopTaskChangeListener(
    }
    }


    override fun onTaskMovingToBack(taskInfo: RunningTaskInfo) {
    override fun onTaskMovingToBack(taskInfo: RunningTaskInfo) {
        logD("onTaskMovingToBack for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId)
        if (
        if (
            !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) &&
            !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) &&
                DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue
                DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue
        ) {
        ) {
            logD(
                "onTaskMovingToBack for taskId=%d, displayId=%d - desktop not supported",
                taskInfo.taskId,
                taskInfo.displayId,
            )
            return
            return
        }
        }
        val desktopRepository: DesktopRepository =
        val desktopRepository: DesktopRepository =
            desktopUserRepositories.getProfile(taskInfo.userId)
            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(
        desktopRepository.updateTask(
            taskInfo.displayId,
            taskInfo.displayId,
            taskInfo.taskId,
            taskInfo.taskId,
@@ -173,16 +244,33 @@ class DesktopTaskChangeListener(
    }
    }


    override fun onTaskClosing(taskInfo: RunningTaskInfo) {
    override fun onTaskClosing(taskInfo: RunningTaskInfo) {
        logD("onTaskClosing for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId)
        if (
        if (
            !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) &&
            !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) &&
                DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue
                DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue
        ) {
        ) {
            logD(
                "onTaskClosing for taskId=%d, displayId=%d - desktop not supported",
                taskInfo.taskId,
                taskInfo.displayId,
            )
            return
            return
        }
        }
        val desktopRepository: DesktopRepository =
        val desktopRepository: DesktopRepository =
            desktopUserRepositories.getProfile(taskInfo.userId)
            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)
        val isMinimized = desktopRepository.isMinimizedTask(taskInfo.taskId)
        // TODO: b/370038902 - Handle Activity#finishAndRemoveTask.
        // 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?) {
    private fun logD(msg: String, vararg arguments: Any?) {
        ProtoLog.d(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments)
        ProtoLog.d(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments)
    }
    }
+4 −1
Original line number Original line 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.createFreeformTask
import com.android.wm.shell.desktopmode.DesktopTestHelpers.createFullscreenTask
import com.android.wm.shell.desktopmode.DesktopTestHelpers.createFullscreenTask
import com.android.wm.shell.shared.desktopmode.FakeDesktopState
import com.android.wm.shell.shared.desktopmode.FakeDesktopState
import com.android.wm.shell.sysui.ShellController
import org.junit.Before
import org.junit.Before
import org.junit.Test
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runner.RunWith
@@ -55,6 +56,7 @@ class DesktopTaskChangeListenerTest : ShellTestCase() {
    private lateinit var desktopTaskChangeListener: DesktopTaskChangeListener
    private lateinit var desktopTaskChangeListener: DesktopTaskChangeListener


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


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


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