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

Commit 40fd29e4 authored by Orhan Uysal's avatar Orhan Uysal
Browse files

Reparent desktop task to TDA...

when it's being started as a fullscreen task. This prevents the launch
to happen inside the desk root.

Flag: com.android.window.flags.enable_multiple_desktops_backend
Bug: 419698805
Test: atest StageCoordinatorTest
Change-Id: I2775cfdd610f0803fcd75b8e21a1c52925f18dd3
parent d987f495
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -625,6 +625,7 @@ public abstract class WMShellModule {
            LaunchAdjacentController launchAdjacentController,
            Optional<WindowDecorViewModel> windowDecorViewModel,
            Optional<DesktopTasksController> desktopTasksController,
            Optional<DesktopUserRepositories> desktopUserRepositories,
            MultiInstanceHelper multiInstanceHelper,
            SplitState splitState,
            @ShellMainThread ShellExecutor mainExecutor,
@@ -652,6 +653,7 @@ public abstract class WMShellModule {
                launchAdjacentController,
                windowDecorViewModel,
                desktopTasksController,
                desktopUserRepositories,
                null /* stageCoordinator */,
                multiInstanceHelper,
                splitState,
+6 −1
Original line number Diff line number Diff line
@@ -98,6 +98,7 @@ import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.split.SplitScreenUtils;
import com.android.wm.shell.common.split.SplitState;
import com.android.wm.shell.desktopmode.DesktopTasksController;
import com.android.wm.shell.desktopmode.DesktopUserRepositories;
import com.android.wm.shell.draganddrop.DragAndDropController;
import com.android.wm.shell.draganddrop.SplitDragPolicy;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
@@ -206,6 +207,7 @@ public class SplitScreenController implements SplitDragPolicy.Starter,
    private final LaunchAdjacentController mLaunchAdjacentController;
    private final Optional<WindowDecorViewModel> mWindowDecorViewModel;
    private final Optional<DesktopTasksController> mDesktopTasksController;
    private final Optional<DesktopUserRepositories> mDesktopUserRepositories;
    private final MultiInstanceHelper mMultiInstanceHelpher;
    private final SplitState mSplitState;
    private final RootDisplayAreaOrganizer mRootDisplayAreaOrganizer;
@@ -239,6 +241,7 @@ public class SplitScreenController implements SplitDragPolicy.Starter,
            LaunchAdjacentController launchAdjacentController,
            Optional<WindowDecorViewModel> windowDecorViewModel,
            Optional<DesktopTasksController> desktopTasksController,
            Optional<DesktopUserRepositories> desktopUserRepositories,
            @Nullable StageCoordinator stageCoordinator,
            MultiInstanceHelper multiInstanceHelper,
            SplitState splitState,
@@ -268,6 +271,7 @@ public class SplitScreenController implements SplitDragPolicy.Starter,
        mLaunchAdjacentController = launchAdjacentController;
        mWindowDecorViewModel = windowDecorViewModel;
        mDesktopTasksController = desktopTasksController;
        mDesktopUserRepositories = desktopUserRepositories;
        mStageCoordinator = stageCoordinator;
        mMultiInstanceHelpher = multiInstanceHelper;
        mSplitState = splitState;
@@ -319,7 +323,8 @@ public class SplitScreenController implements SplitDragPolicy.Starter,
                mTaskOrganizer, mDisplayController, mDisplayImeController,
                mDisplayInsetsController, mTransitions, mTransactionPool, mIconProvider,
                mMainExecutor, mMainHandler, mRecentTasksOptional, mLaunchAdjacentController,
                mWindowDecorViewModel, mSplitState, mDesktopTasksController, mRootTDAOrganizer,
                mWindowDecorViewModel, mSplitState, mDesktopTasksController,
                mDesktopUserRepositories, mRootTDAOrganizer,
                mRootDisplayAreaOrganizer, mDesktopState, mActivityTaskManager, mMSDLPlayer);
    }

+24 −0
Original line number Diff line number Diff line
@@ -155,7 +155,9 @@ import com.android.wm.shell.common.split.SplitDecorManager;
import com.android.wm.shell.common.split.SplitLayout;
import com.android.wm.shell.common.split.SplitState;
import com.android.wm.shell.common.split.SplitWindowManager;
import com.android.wm.shell.desktopmode.DesktopRepository;
import com.android.wm.shell.desktopmode.DesktopTasksController;
import com.android.wm.shell.desktopmode.DesktopUserRepositories;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
import com.android.wm.shell.recents.RecentTasksController;
import com.android.wm.shell.shared.TransactionPool;
@@ -245,6 +247,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
    private final LaunchAdjacentController mLaunchAdjacentController;
    private final Optional<WindowDecorViewModel> mWindowDecorViewModel;
    private final Optional<DesktopTasksController> mDesktopTasksController;
    private final Optional<DesktopUserRepositories> mDesktopUserRepositories;
    /** Singleton source of truth for the current state of split screen on this device. */
    private final SplitState mSplitState;
    private final SplitStatusBarHider mStatusBarHider;
@@ -395,6 +398,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            LaunchAdjacentController launchAdjacentController,
            Optional<WindowDecorViewModel> windowDecorViewModel, SplitState splitState,
            Optional<DesktopTasksController> desktopTasksController,
            Optional<DesktopUserRepositories> desktopUserRepositories,
            RootTaskDisplayAreaOrganizer rootTDAOrganizer,
            RootDisplayAreaOrganizer rootDisplayAreaOrganizer, DesktopState desktopState,
            IActivityTaskManager activityTaskManager, MSDLPlayer msdlPlayer) {
@@ -411,6 +415,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        mWindowDecorViewModel = windowDecorViewModel;
        mSplitState = splitState;
        mDesktopTasksController = desktopTasksController;
        mDesktopUserRepositories = desktopUserRepositories;
        mRootTDAOrganizer = rootTDAOrganizer;
        mDesktopState = desktopState;
        mMSDLPlayer = msdlPlayer;
@@ -491,6 +496,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            LaunchAdjacentController launchAdjacentController,
            Optional<WindowDecorViewModel> windowDecorViewModel, SplitState splitState,
            Optional<DesktopTasksController> desktopTasksController,
            Optional<DesktopUserRepositories> desktopUserRepositories,
            RootTaskDisplayAreaOrganizer rootTDAOrganizer,
            RootDisplayAreaOrganizer rootDisplayAreaOrganizer, DesktopState desktopState,
            IActivityTaskManager activityTaskManager, MSDLPlayer msdlPlayer) {
@@ -517,6 +523,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        mWindowDecorViewModel = windowDecorViewModel;
        mSplitState = splitState;
        mDesktopTasksController = desktopTasksController;
        mDesktopUserRepositories = desktopUserRepositories;
        mRootTDAOrganizer = rootTDAOrganizer;
        mDesktopState = desktopState;
        mMSDLPlayer = msdlPlayer;
@@ -982,7 +989,18 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        RunningTaskInfo taskInfo = mTaskOrganizer.getRunningTaskInfo(taskId);
        if (enableFullScreenWindowOnRemovingSplitScreenStageBugfix() && taskInfo != null
                && taskInfo.getWindowingMode() == WINDOWING_MODE_FREEFORM) {
            RunningTaskInfo task = mTaskOrganizer.getRunningTaskInfo(taskId);
            prepareTasksForSplitScreen(new int[]{taskId}, wct, outOptions);
            if (DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue()) {
                // TODO: b/422176395 - Use options#setReparentLeafTaskToTda instead once it can work
                // with wct#startTask.
                DesktopRepository currentDesktopRepo = mDesktopUserRepositories.map(
                        DesktopUserRepositories::getCurrent).orElse(
                        null);
                if (currentDesktopRepo != null && currentDesktopRepo.isActiveTask(taskId)) {
                    wct.reparent(task.getToken(), null, true);
                }
            }
        }
        wct.startTask(taskId, outOptions[0]);
        mSplitTransitions.startFullscreenTransition(wct, remoteTransition);
@@ -2071,6 +2089,12 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            int targetWindowingMode) {
        ActivityOptions options = ActivityOptions.fromBundle(opts);
        options.setLaunchWindowingMode(targetWindowingMode);
        // We are trying to move to fullscreen, reparent the task to tda to prevent it from being
        // launched in a previously existing root task.
        if (DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue()
                && targetWindowingMode == WINDOWING_MODE_FULLSCREEN) {
            options.setReparentLeafTaskToTda(true);
        }
        opts.putAll(options.toBundle());
        addActivityOptions(opts, launchTarget);
    }
+2 −1
Original line number Diff line number Diff line
@@ -103,7 +103,8 @@ public class TvSplitScreenController extends SplitScreenController {
                syncQueue, rootTDAOrganizer, displayController, displayImeController,
                displayInsetsController, null, transitions, transactionPool,
                iconProvider, recentTasks, launchAdjacentController, Optional.empty(),
                Optional.empty(), null /* stageCoordinator */, multiInstanceHelper, splitState,
                Optional.empty(), Optional.empty(), null /* stageCoordinator */,
                multiInstanceHelper, splitState,
                mainExecutor, mainHandler, rootDisplayAreaOrganizer, desktopState,
                activityTaskManager, msdlPlayer);

+1 −1
Original line number Diff line number Diff line
@@ -67,7 +67,7 @@ public class TvStageCoordinator extends StageCoordinator
        super(context, displayId, syncQueue, taskOrganizer, displayController, displayImeController,
                displayInsetsController, transitions, transactionPool, iconProvider,
                mainExecutor, mainHandler, recentTasks, launchAdjacentController,
                Optional.empty(), splitState, Optional.empty(), rootTDAOrganizer,
                Optional.empty(), splitState, Optional.empty(), Optional.empty(), rootTDAOrganizer,
                rootDisplayAreaOrganizer, desktopState, activityTaskManager, msdlPlayer);

        mTvSplitMenuController = new TvSplitMenuController(context, this,
Loading