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

Commit 842c71c6 authored by Jorge Gil's avatar Jorge Gil
Browse files

[36/N] Desks: Activate desk of launching task if inactive

Activates the desk of the launching / moving-to-front task instead of
activating the default desk is none are active. This ensures that
unminimizing a task from an inactive desk reactivates that desk.

This change also moved the order in which desks transitions are
processed, moving it to FreeformTasksTransitionObserver to guarantee
desk-level activation changes happen before DesktopTaskChangeListener
attempts to move freeform tasks into the current active desk.

Flag: com.android.window.flags.enable_multiple_desktops_backend
Bug: 391485148
Bug: 393978427
Bug: 390692038
Test: open a couple of freeform apps in desk#1, minimize one, then:
 1) Create and active desk#2 via adb commands
 2) Unminimize the task from the taskbar
 3) Verify desk#1 was reactivated with the unminimized task
 4) Dump DesktopRepository state and check tasks are under desk#1 and
    desk#1 is the active desk.

Change-Id: I3de82638c551857882ee48f9353cb3ec13b970f1
parent 4839d295
Loading
Loading
Loading
Loading
+14 −9
Original line number Diff line number Diff line
@@ -450,7 +450,8 @@ public abstract class WMShellModule {
            Optional<DesktopImmersiveController> desktopImmersiveController,
            WindowDecorViewModel windowDecorViewModel,
            Optional<TaskChangeListener> taskChangeListener,
            FocusTransitionObserver focusTransitionObserver) {
            FocusTransitionObserver focusTransitionObserver,
            Optional<DesksTransitionObserver> desksTransitionObserver) {
        return new FreeformTaskTransitionObserver(
                context,
                shellInit,
@@ -458,7 +459,8 @@ public abstract class WMShellModule {
                desktopImmersiveController,
                windowDecorViewModel,
                taskChangeListener,
                focusTransitionObserver);
                focusTransitionObserver,
                desksTransitionObserver);
    }

    @WMSingleton
@@ -771,7 +773,7 @@ public abstract class WMShellModule {
            Optional<BubbleController> bubbleController,
            OverviewToDesktopTransitionObserver overviewToDesktopTransitionObserver,
            DesksOrganizer desksOrganizer,
            DesksTransitionObserver desksTransitionObserver,
            Optional<DesksTransitionObserver> desksTransitionObserver,
            UserProfileContexts userProfileContexts,
            DesktopModeCompatPolicy desktopModeCompatPolicy,
            DragToDisplayTransitionHandler dragToDisplayTransitionHandler,
@@ -812,7 +814,7 @@ public abstract class WMShellModule {
                bubbleController,
                overviewToDesktopTransitionObserver,
                desksOrganizer,
                desksTransitionObserver,
                desksTransitionObserver.get(),
                userProfileContexts,
                desktopModeCompatPolicy,
                dragToDisplayTransitionHandler,
@@ -1205,7 +1207,6 @@ public abstract class WMShellModule {
            Optional<DesktopMixedTransitionHandler> desktopMixedTransitionHandler,
            Optional<BackAnimationController> backAnimationController,
            DesktopWallpaperActivityTokenProvider desktopWallpaperActivityTokenProvider,
            @NonNull DesksTransitionObserver desksTransitionObserver,
            ShellInit shellInit) {
        return desktopUserRepositories.flatMap(
                repository ->
@@ -1218,17 +1219,21 @@ public abstract class WMShellModule {
                                        desktopMixedTransitionHandler.get(),
                                        backAnimationController.get(),
                                        desktopWallpaperActivityTokenProvider,
                                        desksTransitionObserver,
                                        shellInit)));
    }

    @WMSingleton
    @Provides
    static DesksTransitionObserver provideDesksTransitionObserver(
            @NonNull @DynamicOverride DesktopUserRepositories desktopUserRepositories,
    static Optional<DesksTransitionObserver> provideDesksTransitionObserver(
            Context context,
            @DynamicOverride DesktopUserRepositories desktopUserRepositories,
            @NonNull DesksOrganizer desksOrganizer
    ) {
        return new DesksTransitionObserver(desktopUserRepositories, desksOrganizer);
        if (DesktopModeStatus.canEnterDesktopMode(context)) {
            return Optional.of(
                    new DesksTransitionObserver(desktopUserRepositories, desksOrganizer));
        }
        return Optional.empty();
    }

    @WMSingleton
+4 −0
Original line number Diff line number Diff line
@@ -235,6 +235,10 @@ class DesktopRepository(
    /** Returns the default desk in the given display. */
    private fun getDefaultDesk(displayId: Int): Desk? = desktopData.getDefaultDesk(displayId)

    /** Returns whether the given desk is active in its display. */
    fun isDeskActive(deskId: Int): Boolean =
        desktopData.getAllActiveDesks().any { desk -> desk.deskId == deskId }

    /** Sets the given desk as the active one in the given display. */
    fun setActiveDesk(displayId: Int, deskId: Int) {
        logD("setActiveDesk for displayId=%d and deskId=%d", displayId, deskId)
+17 −10
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ import android.view.DragEvent
import android.view.MotionEvent
import android.view.SurfaceControl
import android.view.SurfaceControl.Transaction
import android.view.WindowManager
import android.view.WindowManager.TRANSIT_CHANGE
import android.view.WindowManager.TRANSIT_CLOSE
import android.view.WindowManager.TRANSIT_NONE
@@ -1012,6 +1013,13 @@ class DesktopTasksController(
        val deskId =
            launchingTaskId?.let { taskId -> taskRepository.getDeskIdForTask(taskId) }
                ?: getDefaultDeskId(displayId)
        logV(
            "startLaunchTransition type=%s launchingTaskId=%d deskId=%d displayId=%d",
            WindowManager.transitTypeToString(transitionType),
            launchingTaskId,
            deskId,
            displayId,
        )
        // TODO: b/397619806 - Consolidate sharable logic with [handleFreeformTaskLaunch].
        var launchTransaction = wct
        val taskIdToMinimize =
@@ -1030,21 +1038,20 @@ class DesktopTasksController(
            )
        var activationRunOnTransitStart: RunOnTransitStart? = null
        val shouldActivateDesk =
            (DesktopExperienceFlags.ENABLE_DISPLAY_WINDOWING_MODE_SWITCHING.isTrue ||
                DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue) &&
            when {
                DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue ->
                    !taskRepository.isDeskActive(deskId)
                DesktopExperienceFlags.ENABLE_DISPLAY_WINDOWING_MODE_SWITCHING.isTrue -> {
                    !isDesktopModeShowing(displayId)
                }
                else -> false
            }
        if (shouldActivateDesk) {
            val deskIdToActivate =
                checkNotNull(
                    launchingTaskId?.let { taskRepository.getDeskIdForTask(it) }
                        ?: getDefaultDeskId(displayId)
                )
            val activateDeskWct = WindowContainerTransaction()
            // TODO: b/391485148 - pass in the launching task here to apply task-limit policy,
            //  but make sure to not do it twice since it is also done at the start of this
            //  function.
            activationRunOnTransitStart =
                addDeskActivationChanges(deskIdToActivate, activateDeskWct)
            activationRunOnTransitStart = addDeskActivationChanges(deskId, activateDeskWct)
            // Desk activation must be handled before app launch-related transactions.
            activateDeskWct.merge(launchTransaction, /* transfer= */ true)
            launchTransaction = activateDeskWct
+0 −3
Original line number Diff line number Diff line
@@ -37,7 +37,6 @@ import com.android.wm.shell.ShellTaskOrganizer
import com.android.wm.shell.back.BackAnimationController
import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.isExitDesktopModeTransition
import com.android.wm.shell.desktopmode.desktopwallpaperactivity.DesktopWallpaperActivityTokenProvider
import com.android.wm.shell.desktopmode.multidesks.DesksTransitionObserver
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
import com.android.wm.shell.shared.TransitionUtil
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
@@ -59,7 +58,6 @@ class DesktopTasksTransitionObserver(
    private val desktopMixedTransitionHandler: DesktopMixedTransitionHandler,
    private val backAnimationController: BackAnimationController,
    private val desktopWallpaperActivityTokenProvider: DesktopWallpaperActivityTokenProvider,
    private val desksTransitionObserver: DesksTransitionObserver,
    shellInit: ShellInit,
) : Transitions.TransitionObserver {

@@ -89,7 +87,6 @@ class DesktopTasksTransitionObserver(
        finishTransaction: SurfaceControl.Transaction,
    ) {
        // TODO: b/332682201 Update repository state
        desksTransitionObserver.onTransitionReady(transition, info)
        if (
            DesktopModeFlags.INCLUDE_TOP_TRANSPARENT_FULLSCREEN_TASK_IN_DESKTOP_HEURISTIC
                .isTrue() && DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue()
+9 −1
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;

import com.android.wm.shell.desktopmode.DesktopImmersiveController;
import com.android.wm.shell.desktopmode.multidesks.DesksTransitionObserver;
import com.android.wm.shell.sysui.ShellInit;
import com.android.wm.shell.transition.FocusTransitionObserver;
import com.android.wm.shell.transition.Transitions;
@@ -52,6 +53,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs
    private final WindowDecorViewModel mWindowDecorViewModel;
    private final Optional<TaskChangeListener> mTaskChangeListener;
    private final FocusTransitionObserver mFocusTransitionObserver;
    private final Optional<DesksTransitionObserver> mDesksTransitionObserver;

    private final Map<IBinder, List<ActivityManager.RunningTaskInfo>> mTransitionToTaskInfo =
            new HashMap<>();
@@ -63,12 +65,14 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs
            Optional<DesktopImmersiveController> desktopImmersiveController,
            WindowDecorViewModel windowDecorViewModel,
            Optional<TaskChangeListener> taskChangeListener,
            FocusTransitionObserver focusTransitionObserver) {
            FocusTransitionObserver focusTransitionObserver,
            Optional<DesksTransitionObserver> desksTransitionObserver) {
        mTransitions = transitions;
        mDesktopImmersiveController = desktopImmersiveController;
        mWindowDecorViewModel = windowDecorViewModel;
        mTaskChangeListener = taskChangeListener;
        mFocusTransitionObserver = focusTransitionObserver;
        mDesksTransitionObserver = desksTransitionObserver;
        if (FreeformComponents.requiresFreeformComponents(context)) {
            shellInit.addInitCallback(this::onInit, this);
        }
@@ -85,6 +89,10 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs
            @NonNull TransitionInfo info,
            @NonNull SurfaceControl.Transaction startT,
            @NonNull SurfaceControl.Transaction finishT) {
        // Update desk state first, otherwise [TaskChangeListener] may update desktop task state
        // under an outdated active desk if a desk switch and a task update happen in the same
        // transition, such as when unminimizing a task from an inactive desk.
        mDesksTransitionObserver.ifPresent(o -> o.onTransitionReady(transition, info));
        if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue()) {
            // TODO(b/367268953): Remove when DesktopTaskListener is introduced and the repository
            //  is updated from there **before** the |mWindowDecorViewModel| methods are invoked.
Loading