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

Commit a3707075 authored by Simon (Qiong) Sun's avatar Simon (Qiong) Sun Committed by Android (Google) Code Review
Browse files

Merge "Prepare StageCoordinator for 2x1 split-screen (1/n)" into main

parents 7dc58970 02c05bfe
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -342,3 +342,10 @@ flag {
        purpose: PURPOSE_BUGFIX
    }
}

flag {
     name: "enable_2x1_split"
     namespace: "multitasking"
     description: "Enables the 2x1 split implementation"
     bug: "439992109"
}
+19 −11
Original line number Diff line number Diff line
@@ -150,7 +150,6 @@ import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.bubbles.BubbleController;
import com.android.wm.shell.common.ComponentUtils;
import com.android.wm.shell.common.DisplayChangeController;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayImeController;
import com.android.wm.shell.common.DisplayInsetsController;
@@ -208,11 +207,7 @@ import java.util.function.Predicate;
 * visible
 * - Both stages are put under a single-top root task.
 */
public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        DisplayController.OnDisplaysChangedListener,
        DisplayChangeController.OnDisplayChangingListener, Transitions.TransitionHandler,
        ShellTaskOrganizer.TaskListener, StageTaskListener.StageListenerCallbacks,
        SplitMultiDisplayProvider {
public class StageCoordinator extends StageCoordinatorAbstract {

    private static final String TAG = StageCoordinator.class.getSimpleName();

@@ -278,8 +273,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
    private boolean mSkipEvictingMainStageChildren;
    private boolean mIsExiting;
    private boolean mIsRootTranslucent;
    @VisibleForTesting
    @StageType int mLastActiveStage;
    private @StageType int mLastActiveStage;
    private boolean mBreakOnNextWake;
    /** Used to get the Settings value for "Continue using apps on fold". */
    private FoldLockSettingsObserver mFoldLockSettingsObserver;
@@ -295,8 +289,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
    // because we will be posting and removing it from the handler.
    private final Runnable mReEnableLaunchAdjacentOnRoot = () -> setLaunchAdjacentDisabled(false);

    @VisibleForTesting
    SplitMultiDisplayHelper mSplitMultiDisplayHelper;
    private SplitMultiDisplayHelper mSplitMultiDisplayHelper;
    private final SplitTransitionModifier mSplitTransitionModifier;


@@ -4730,7 +4723,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
                isLeftRightSplit());
    }

    private void handleUnsupportedSplitStart() {
    void handleUnsupportedSplitStart() {
        mSplitUnsupportedToast.show();
        notifySplitAnimationStatus(false /*animationRunning*/);
    }
@@ -4743,6 +4736,21 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
                mSplitInvocationListener.onSplitAnimationInvoked(animationRunning));
    }

    @Override
    SplitMultiDisplayHelper getSplitMultiDisplayHelper() {
        return mSplitMultiDisplayHelper;
    }

    @Override
    void setSplitMultiDisplayHelper(SplitMultiDisplayHelper splitMultiDisplayHelper) {
        mSplitMultiDisplayHelper = splitMultiDisplayHelper;
    }

    @Override
    int getLastActiveStage() {
        return mLastActiveStage;
    }

    /**
     * Logs the exit of splitscreen to a specific stage. This must be called before the exit is
     * executed.
+103 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.wm.shell.splitscreen

import android.app.IActivityTaskManager
import android.content.Context
import android.os.Handler
import com.android.launcher3.icons.IconProvider
import com.android.wm.shell.RootDisplayAreaOrganizer
import com.android.wm.shell.RootTaskDisplayAreaOrganizer
import com.android.wm.shell.ShellTaskOrganizer
import com.android.wm.shell.bubbles.BubbleController
import com.android.wm.shell.common.DisplayController
import com.android.wm.shell.common.DisplayImeController
import com.android.wm.shell.common.DisplayInsetsController
import com.android.wm.shell.common.LaunchAdjacentController
import com.android.wm.shell.common.ShellExecutor
import com.android.wm.shell.common.SyncTransactionQueue
import com.android.wm.shell.common.split.SplitLayout
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.recents.RecentTasksController
import com.android.wm.shell.shared.TransactionPool
import com.android.wm.shell.shared.desktopmode.DesktopState
import com.android.wm.shell.transition.Transitions
import com.android.wm.shell.windowdecor.WindowDecorViewModel
import com.google.android.msdl.domain.MSDLPlayer
import java.util.Optional

class StageCoordinator2 : StageCoordinator {
    constructor(
        context: Context, displayId: Int,
        syncQueue: SyncTransactionQueue?,
        taskOrganizer: ShellTaskOrganizer?,
        displayController: DisplayController?,
        displayImeController: DisplayImeController?,
        displayInsetsController: DisplayInsetsController?,
        transitions: Transitions?,
        transactionPool: TransactionPool?,
        iconProvider: IconProvider?,
        mainExecutor: ShellExecutor?, mainHandler: Handler?,
        recentTasks: Optional<RecentTasksController?>?,
        launchAdjacentController: LaunchAdjacentController?,
        windowDecorViewModel: Optional<WindowDecorViewModel?>?,
        splitState: SplitState?,
        desktopTasksController: Optional<DesktopTasksController?>?,
        desktopUserRepositories: Optional<DesktopUserRepositories?>?,
        rootTDAOrganizer: RootTaskDisplayAreaOrganizer?,
        rootDisplayAreaOrganizer: RootDisplayAreaOrganizer?,
        desktopState: DesktopState?,
        activityTaskManager: IActivityTaskManager?,
        msdlPlayer: MSDLPlayer?,
        bubbleController: Optional<BubbleController?>?
    ) : super(
        context, displayId, syncQueue, taskOrganizer, displayController, displayImeController,
        displayInsetsController, transitions, transactionPool, iconProvider, mainExecutor,
        mainHandler, recentTasks, launchAdjacentController, windowDecorViewModel,
        splitState,
        desktopTasksController, desktopUserRepositories, rootTDAOrganizer,
        rootDisplayAreaOrganizer, desktopState, activityTaskManager, msdlPlayer,
        bubbleController
    )

    internal constructor(
        context: Context?, displayId: Int, syncQueue: SyncTransactionQueue?,
        taskOrganizer: ShellTaskOrganizer?, mainStage: StageTaskListener?,
        sideStage: StageTaskListener?,
        displayController: DisplayController?, displayImeController: DisplayImeController?,
        displayInsetsController: DisplayInsetsController?,
        splitLayout: SplitLayout?, transitions: Transitions?,
        transactionPool: TransactionPool?, mainExecutor: ShellExecutor?, mainHandler: Handler?,
        recentTasks: Optional<RecentTasksController?>?,
        launchAdjacentController: LaunchAdjacentController?,
        windowDecorViewModel: Optional<WindowDecorViewModel?>?, splitState: SplitState?,
        desktopTasksController: Optional<DesktopTasksController?>?,
        desktopUserRepositories: Optional<DesktopUserRepositories?>?,
        rootTDAOrganizer: RootTaskDisplayAreaOrganizer?,
        rootDisplayAreaOrganizer: RootDisplayAreaOrganizer?, desktopState: DesktopState?,
        activityTaskManager: IActivityTaskManager?, msdlPlayer: MSDLPlayer?,
        bubbleController: Optional<BubbleController?>?
    ) : super(
        context, displayId, syncQueue, taskOrganizer, mainStage, sideStage, displayController,
        displayImeController, displayInsetsController, splitLayout, transitions,
        transactionPool, mainExecutor, mainHandler, recentTasks, launchAdjacentController,
        windowDecorViewModel, splitState, desktopTasksController, desktopUserRepositories,
        rootTDAOrganizer, rootDisplayAreaOrganizer, desktopState, activityTaskManager,
        msdlPlayer, bubbleController
    )
}
+578 −0

File added.

Preview size limit exceeded, changes collapsed.

+1 −1
Original line number Diff line number Diff line
@@ -602,7 +602,7 @@ public class SplitTransitionTests extends ShellTestCase {
        for (int i = 0; i < wct.getHierarchyOps().size(); ++i) {
            WindowContainerTransaction.HierarchyOp op = wct.getHierarchyOps().get(i);
            if (op.getType() == HIERARCHY_OP_TYPE_REORDER
                    && op.getContainer() == mStageCoordinator.mSplitMultiDisplayHelper
                    && op.getContainer() == mStageCoordinator.getSplitMultiDisplayHelper()
                    .getDisplayRootTaskInfo(DEFAULT_DISPLAY).token.asBinder()) {
                return true;
            }
Loading