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

Commit 62a7efe0 authored by Vania Desmonda's avatar Vania Desmonda
Browse files

Launch split screen task as a Desktop task if Desktop mode is showing.

Fixes: 373549333
Flag: com.android.window.flags.enable_desktop_windowing_mode
Test: manual test and atest StageCoordinatorTests
Change-Id: I17541eacbaa98767cacfdab0885e4e6c73be566a
parent 41abb3de
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -302,7 +302,8 @@ public class SplitScreenController implements SplitDragPolicy.Starter,
                mTaskOrganizer, mDisplayController, mDisplayImeController,
                mTaskOrganizer, mDisplayController, mDisplayImeController,
                mDisplayInsetsController, mTransitions, mTransactionPool, mIconProvider,
                mDisplayInsetsController, mTransitions, mTransactionPool, mIconProvider,
                mMainExecutor, mMainHandler, mBgExecutor, mRecentTasksOptional,
                mMainExecutor, mMainHandler, mBgExecutor, mRecentTasksOptional,
                mLaunchAdjacentController, mWindowDecorViewModel, mSplitState);
                mLaunchAdjacentController, mWindowDecorViewModel, mSplitState,
                mDesktopTasksController);
    }
    }


    @Override
    @Override
+17 −11
Original line number Original line Diff line number Diff line
@@ -142,6 +142,7 @@ import com.android.wm.shell.common.split.SplitLayout;
import com.android.wm.shell.common.split.SplitScreenUtils;
import com.android.wm.shell.common.split.SplitScreenUtils;
import com.android.wm.shell.common.split.SplitState;
import com.android.wm.shell.common.split.SplitState;
import com.android.wm.shell.common.split.SplitWindowManager;
import com.android.wm.shell.common.split.SplitWindowManager;
import com.android.wm.shell.desktopmode.DesktopTasksController;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
import com.android.wm.shell.recents.RecentTasksController;
import com.android.wm.shell.recents.RecentTasksController;
import com.android.wm.shell.shared.TransactionPool;
import com.android.wm.shell.shared.TransactionPool;
@@ -222,6 +223,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
    private final Optional<RecentTasksController> mRecentTasks;
    private final Optional<RecentTasksController> mRecentTasks;
    private final LaunchAdjacentController mLaunchAdjacentController;
    private final LaunchAdjacentController mLaunchAdjacentController;
    private final Optional<WindowDecorViewModel> mWindowDecorViewModel;
    private final Optional<WindowDecorViewModel> mWindowDecorViewModel;
    private final Optional<DesktopTasksController> mDesktopTasksController;
    /** Singleton source of truth for the current state of split screen on this device. */
    /** Singleton source of truth for the current state of split screen on this device. */
    private final SplitState mSplitState;
    private final SplitState mSplitState;


@@ -358,7 +360,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            ShellExecutor bgExecutor,
            ShellExecutor bgExecutor,
            Optional<RecentTasksController> recentTasks,
            Optional<RecentTasksController> recentTasks,
            LaunchAdjacentController launchAdjacentController,
            LaunchAdjacentController launchAdjacentController,
            Optional<WindowDecorViewModel> windowDecorViewModel, SplitState splitState) {
            Optional<WindowDecorViewModel> windowDecorViewModel, SplitState splitState,
            Optional<DesktopTasksController> desktopTasksController) {
        mContext = context;
        mContext = context;
        mDisplayId = displayId;
        mDisplayId = displayId;
        mSyncQueue = syncQueue;
        mSyncQueue = syncQueue;
@@ -371,6 +374,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        mLaunchAdjacentController = launchAdjacentController;
        mLaunchAdjacentController = launchAdjacentController;
        mWindowDecorViewModel = windowDecorViewModel;
        mWindowDecorViewModel = windowDecorViewModel;
        mSplitState = splitState;
        mSplitState = splitState;
        mDesktopTasksController = desktopTasksController;


        taskOrganizer.createRootTask(displayId, WINDOWING_MODE_FULLSCREEN, this /* listener */);
        taskOrganizer.createRootTask(displayId, WINDOWING_MODE_FULLSCREEN, this /* listener */);


@@ -443,7 +447,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            ShellExecutor bgExecutor,
            ShellExecutor bgExecutor,
            Optional<RecentTasksController> recentTasks,
            Optional<RecentTasksController> recentTasks,
            LaunchAdjacentController launchAdjacentController,
            LaunchAdjacentController launchAdjacentController,
            Optional<WindowDecorViewModel> windowDecorViewModel, SplitState splitState) {
            Optional<WindowDecorViewModel> windowDecorViewModel, SplitState splitState,
            Optional<DesktopTasksController> desktopTasksController) {
        mContext = context;
        mContext = context;
        mDisplayId = displayId;
        mDisplayId = displayId;
        mSyncQueue = syncQueue;
        mSyncQueue = syncQueue;
@@ -465,6 +470,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        mLaunchAdjacentController = launchAdjacentController;
        mLaunchAdjacentController = launchAdjacentController;
        mWindowDecorViewModel = windowDecorViewModel;
        mWindowDecorViewModel = windowDecorViewModel;
        mSplitState = splitState;
        mSplitState = splitState;
        mDesktopTasksController = desktopTasksController;


        mDisplayController.addDisplayWindowListener(this);
        mDisplayController.addDisplayWindowListener(this);
        transitions.addHandler(this);
        transitions.addHandler(this);
@@ -2768,11 +2774,17 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        final @WindowManager.TransitionType int type = request.getType();
        final @WindowManager.TransitionType int type = request.getType();
        final boolean isOpening = isOpeningType(type);
        final boolean isOpening = isOpeningType(type);
        final boolean inFullscreen = triggerTask.getWindowingMode() == WINDOWING_MODE_FULLSCREEN;
        final boolean inFullscreen = triggerTask.getWindowingMode() == WINDOWING_MODE_FULLSCREEN;
        final boolean inDesktopMode = DesktopModeStatus.canEnterDesktopMode(mContext)
        final boolean inDesktopMode = mDesktopTasksController.isPresent()
                && triggerTask.getWindowingMode() == WINDOWING_MODE_FREEFORM;
                && mDesktopTasksController.get().isDesktopModeShowing(mDisplayId);
        final boolean isLaunchingDesktopTask = isOpening && DesktopModeStatus.canEnterDesktopMode(
                mContext) && triggerTask.getWindowingMode() == WINDOWING_MODE_FREEFORM;
        final StageTaskListener stage = getStageOfTask(triggerTask);
        final StageTaskListener stage = getStageOfTask(triggerTask);


        if (isOpening && inFullscreen) {
        if (inDesktopMode || isLaunchingDesktopTask) {
            // Don't handle request when desktop mode is showing (since they don't coexist), or
            // when launching a desktop task (defer to DesktopTasksController)
            return null;
        } else if (isOpening && inFullscreen) {
            // One task is opening into fullscreen mode, remove the corresponding split record.
            // One task is opening into fullscreen mode, remove the corresponding split record.
            mRecentTasks.ifPresent(recentTasks -> recentTasks.removeSplitPair(triggerTask.taskId));
            mRecentTasks.ifPresent(recentTasks -> recentTasks.removeSplitPair(triggerTask.taskId));
            logExit(EXIT_REASON_FULLSCREEN_REQUEST);
            logExit(EXIT_REASON_FULLSCREEN_REQUEST);
@@ -2824,12 +2836,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
                    mSplitTransitions.setDismissTransition(transition, stageType,
                    mSplitTransitions.setDismissTransition(transition, stageType,
                            EXIT_REASON_FULLSCREEN_REQUEST);
                            EXIT_REASON_FULLSCREEN_REQUEST);
                }
                }
            } else if (isOpening && inDesktopMode) {
                // If the app being opened is in Desktop mode, set it to full screen and dismiss
                // split screen stage.
                prepareExitSplitScreen(STAGE_TYPE_UNDEFINED, out);
                out.setWindowingMode(triggerTask.token, WINDOWING_MODE_UNDEFINED)
                        .setBounds(triggerTask.token, null);
            } else if (isOpening && inFullscreen) {
            } else if (isOpening && inFullscreen) {
                final int activityType = triggerTask.getActivityType();
                final int activityType = triggerTask.getActivityType();
                if (activityType == ACTIVITY_TYPE_HOME || activityType == ACTIVITY_TYPE_RECENTS) {
                if (activityType == ACTIVITY_TYPE_HOME || activityType == ACTIVITY_TYPE_RECENTS) {
+1 −1
Original line number Original line Diff line number Diff line
@@ -59,7 +59,7 @@ public class TvStageCoordinator extends StageCoordinator
        super(context, displayId, syncQueue, taskOrganizer, displayController, displayImeController,
        super(context, displayId, syncQueue, taskOrganizer, displayController, displayImeController,
                displayInsetsController, transitions, transactionPool, iconProvider,
                displayInsetsController, transitions, transactionPool, iconProvider,
                mainExecutor, mainHandler, bgExecutor, recentTasks, launchAdjacentController,
                mainExecutor, mainHandler, bgExecutor, recentTasks, launchAdjacentController,
                Optional.empty(), splitState);
                Optional.empty(), splitState, Optional.empty());


        mTvSplitMenuController = new TvSplitMenuController(context, this,
        mTvSplitMenuController = new TvSplitMenuController(context, this,
                systemWindows, mainHandler);
                systemWindows, mainHandler);
+5 −2
Original line number Original line Diff line number Diff line
@@ -36,6 +36,7 @@ import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.split.SplitLayout;
import com.android.wm.shell.common.split.SplitLayout;
import com.android.wm.shell.common.split.SplitState;
import com.android.wm.shell.common.split.SplitState;
import com.android.wm.shell.desktopmode.DesktopTasksController;
import com.android.wm.shell.recents.RecentTasksController;
import com.android.wm.shell.recents.RecentTasksController;
import com.android.wm.shell.shared.TransactionPool;
import com.android.wm.shell.shared.TransactionPool;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.transition.Transitions;
@@ -81,11 +82,13 @@ public class SplitTestUtils {
                ShellExecutor mainExecutor, Handler mainHandler, ShellExecutor bgExecutor,
                ShellExecutor mainExecutor, Handler mainHandler, ShellExecutor bgExecutor,
                Optional<RecentTasksController> recentTasks,
                Optional<RecentTasksController> recentTasks,
                LaunchAdjacentController launchAdjacentController,
                LaunchAdjacentController launchAdjacentController,
                Optional<WindowDecorViewModel> windowDecorViewModel, SplitState splitState) {
                Optional<WindowDecorViewModel> windowDecorViewModel, SplitState splitState,
                Optional<DesktopTasksController> desktopTasksController) {
            super(context, displayId, syncQueue, taskOrganizer, mainStage,
            super(context, displayId, syncQueue, taskOrganizer, mainStage,
                    sideStage, displayController, imeController, insetsController, splitLayout,
                    sideStage, displayController, imeController, insetsController, splitLayout,
                    transitions, transactionPool, mainExecutor, mainHandler, bgExecutor,
                    transitions, transactionPool, mainExecutor, mainHandler, bgExecutor,
                    recentTasks, launchAdjacentController, windowDecorViewModel, splitState);
                    recentTasks, launchAdjacentController, windowDecorViewModel, splitState,
                    desktopTasksController);


            // Prepare root task for testing.
            // Prepare root task for testing.
            mRootTask = new TestRunningTaskInfoBuilder().build();
            mRootTask = new TestRunningTaskInfoBuilder().build();
+1 −1
Original line number Original line Diff line number Diff line
@@ -149,7 +149,7 @@ public class SplitTransitionTests extends ShellTestCase {
                mSyncQueue, mTaskOrganizer, mMainStage, mSideStage, mDisplayController,
                mSyncQueue, mTaskOrganizer, mMainStage, mSideStage, mDisplayController,
                mDisplayImeController, mDisplayInsetsController, mSplitLayout, mTransitions,
                mDisplayImeController, mDisplayInsetsController, mSplitLayout, mTransitions,
                mTransactionPool, mMainExecutor, mMainHandler, mBgExecutor, Optional.empty(),
                mTransactionPool, mMainExecutor, mMainHandler, mBgExecutor, Optional.empty(),
                mLaunchAdjacentController, Optional.empty(), mSplitState);
                mLaunchAdjacentController, Optional.empty(), mSplitState, Optional.empty());
        mStageCoordinator.setMixedHandler(mMixedHandler);
        mStageCoordinator.setMixedHandler(mMixedHandler);
        mSplitScreenTransitions = mStageCoordinator.getSplitTransitions();
        mSplitScreenTransitions = mStageCoordinator.getSplitTransitions();
        doAnswer((Answer<IBinder>) invocation -> mock(IBinder.class))
        doAnswer((Answer<IBinder>) invocation -> mock(IBinder.class))
Loading