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

Commit 3f1d33ac authored by Jorge Gil's avatar Jorge Gil
Browse files

Fix missing desktop-immersive exit with multi-desks

When multiple desks are enabled, task info updates are handled by
RootTaskDesksOrganizer instead of FreeformTaskListener, so the
controller was not getting a signal to exit desktop-immersive when the
app stops requesting it.

Flag: com.android.window.flags.enable_multiple_desktops_backend
Fix: 425563073
Test: using YT music, enter desktop and expand the player to have the
app request immersive, then enter desktop-immersive from the maximize
menu, make the app unrequest immersive and verify the app returns to its
original size and is drag-movable.

Change-Id: I5ae00635c4a9a1f149a4a2334f399e3362638da6
parent 6b8b441a
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -357,6 +357,9 @@ class DesktopTasksController(
        )
        dragAndDropController.addListener(this)
        shellController.addKeyguardChangeListener(this)
        desksOrganizer.addOnDesktopTaskInfoChangedListener { taskInfo ->
            onTaskInfoChanged(taskInfo)
        }
    }

    @VisibleForTesting
@@ -5859,6 +5862,11 @@ class DesktopTasksController(
                !requestingImmersive &&
                !RecentsTransitionStateListener.isRunning(recentsTransitionState)
        ) {
            logV(
                "onTaskInfoChanged taskId=%d stopped requesting immersive," +
                    " breaking out of desktop-immersive mode",
                taskInfo.taskId,
            )
            // Exit immersive if the app is no longer requesting it.
            desktopImmersiveController.moveTaskToNonImmersive(
                taskInfo,
+1 −1
Original line number Diff line number Diff line
@@ -95,7 +95,7 @@ interface DesksOrganizer {
    fun isDeskActiveAtEnd(change: TransitionInfo.Change, deskId: Int): Boolean

    /** Allows for other classes to respond to task changes this organizer receives. */
    fun setOnDesktopTaskInfoChangedListener(listener: (ActivityManager.RunningTaskInfo) -> Unit)
    fun addOnDesktopTaskInfoChangedListener(listener: (ActivityManager.RunningTaskInfo) -> Unit)

    /** Move a desk to the given display area. */
    fun moveDeskToDisplay(
+7 −4
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ class RootTaskDesksOrganizer(
    val deskMinimizationRootsByDeskId: MutableMap<Int, DeskMinimizationRoot> = mutableMapOf()
    private val removeDeskRootRequests = mutableSetOf<Int>()
    @VisibleForTesting val childLeashes = SparseArray<SurfaceControl>()
    private var onTaskInfoChangedListener: ((RunningTaskInfo) -> Unit)? = null
    private val onTaskInfoChangedListeners = mutableListOf<(RunningTaskInfo) -> Unit>()

    init {
        if (DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue) {
@@ -437,8 +437,9 @@ class RootTaskDesksOrganizer(
            change.taskInfo?.isVisibleRequested == true &&
            change.mode == TRANSIT_TO_FRONT

    override fun setOnDesktopTaskInfoChangedListener(listener: (RunningTaskInfo) -> Unit) {
        onTaskInfoChangedListener = listener
    override fun addOnDesktopTaskInfoChangedListener(listener: (RunningTaskInfo) -> Unit) {
        if (listener in onTaskInfoChangedListeners) return
        onTaskInfoChangedListeners += listener
    }

    override fun onTaskAppeared(taskInfo: RunningTaskInfo, leash: SurfaceControl) {
@@ -452,7 +453,9 @@ class RootTaskDesksOrganizer(
            taskInfo.taskId !in deskRootsByDeskId &&
                deskMinimizationRootsByDeskId.values.none { it.rootId == taskInfo.taskId }
        ) {
            onTaskInfoChangedListener?.invoke(taskInfo)
            onTaskInfoChangedListeners.forEach { onTaskInfoChangedListener ->
                onTaskInfoChangedListener(taskInfo)
            }
        }
        updateLaunchAdjacentController()
    }
+3 −1
Original line number Diff line number Diff line
@@ -156,7 +156,9 @@ public class FreeformTaskListener implements ShellTaskOrganizer.TaskListener,

        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Freeform Task Info Changed: #%d",
                taskInfo.taskId);
        if (!DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue()) {
            mDesktopTasksController.ifPresent(c -> c.onTaskInfoChanged(taskInfo));
        }
        mWindowDecorationViewModel.onTaskInfoChanged(taskInfo);
        state.mTaskInfo = taskInfo;
        if (mDesktopState.canEnterDesktopMode()) {
+1 −1
Original line number Diff line number Diff line
@@ -559,7 +559,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel,
                    });
        }
        mFocusTransitionObserver.setLocalFocusTransitionListener(this, mMainExecutor);
        mDesksOrganizer.setOnDesktopTaskInfoChangedListener((taskInfo) -> {
        mDesksOrganizer.addOnDesktopTaskInfoChangedListener((taskInfo) -> {
            onTaskInfoChanged(taskInfo);
            return Unit.INSTANCE;
        });
Loading