Turn off launch adjacent behavior when on desktop
When user is on the desktop, and a new window of an app is created using launch adjacent, it should open as another window. And not in split screen. Use LaunchAdjacentController to coordinate between desktop and split screen. When on desktop, desktop controller disables launch adjacent. When not on desktop, launch adjacent is enabled. Split controller registers its container with the launch adjacent controller so it can be restored as needed. Test: atest DesktopTasksController Test: open chrome in fullscreen, from menu choose new window, observe that the window opens in split screen Test: open chrome in freeform, from menu choose new window, observe that a new freeform window is created Bug: 279585872 Change-Id: If5199a8e5b59b313828061a3164f9880e033a9b3
This commit is contained in:
@@ -25,6 +25,7 @@ import com.android.wm.shell.ShellTaskOrganizer;
|
||||
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.SystemWindows;
|
||||
@@ -86,13 +87,14 @@ public class TvWMShellModule {
|
||||
TransactionPool transactionPool,
|
||||
IconProvider iconProvider,
|
||||
Optional<RecentTasksController> recentTasks,
|
||||
LaunchAdjacentController launchAdjacentController,
|
||||
@ShellMainThread ShellExecutor mainExecutor,
|
||||
Handler mainHandler,
|
||||
SystemWindows systemWindows) {
|
||||
return new TvSplitScreenController(context, shellInit, shellCommandHandler, shellController,
|
||||
shellTaskOrganizer, syncQueue, rootTDAOrganizer, displayController,
|
||||
displayImeController, displayInsetsController, dragAndDropController, transitions,
|
||||
transactionPool, iconProvider, recentTasks, mainExecutor, mainHandler,
|
||||
systemWindows);
|
||||
transactionPool, iconProvider, recentTasks, launchAdjacentController, mainExecutor,
|
||||
mainHandler, systemWindows);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ import com.android.wm.shell.common.DisplayInsetsController;
|
||||
import com.android.wm.shell.common.DisplayLayout;
|
||||
import com.android.wm.shell.common.DockStateReader;
|
||||
import com.android.wm.shell.common.FloatingContentCoordinator;
|
||||
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.SystemWindows;
|
||||
@@ -70,6 +71,8 @@ import com.android.wm.shell.draganddrop.DragAndDropController;
|
||||
import com.android.wm.shell.freeform.FreeformComponents;
|
||||
import com.android.wm.shell.fullscreen.FullscreenTaskListener;
|
||||
import com.android.wm.shell.hidedisplaycutout.HideDisplayCutoutController;
|
||||
import com.android.wm.shell.keyguard.KeyguardTransitionHandler;
|
||||
import com.android.wm.shell.keyguard.KeyguardTransitions;
|
||||
import com.android.wm.shell.onehanded.OneHanded;
|
||||
import com.android.wm.shell.onehanded.OneHandedController;
|
||||
import com.android.wm.shell.pip.Pip;
|
||||
@@ -77,8 +80,6 @@ import com.android.wm.shell.pip.PipMediaController;
|
||||
import com.android.wm.shell.pip.PipSurfaceTransactionHelper;
|
||||
import com.android.wm.shell.pip.PipUiEventLogger;
|
||||
import com.android.wm.shell.pip.phone.PipTouchHandler;
|
||||
import com.android.wm.shell.keyguard.KeyguardTransitionHandler;
|
||||
import com.android.wm.shell.keyguard.KeyguardTransitions;
|
||||
import com.android.wm.shell.recents.RecentTasks;
|
||||
import com.android.wm.shell.recents.RecentTasksController;
|
||||
import com.android.wm.shell.recents.RecentsTransitionHandler;
|
||||
@@ -275,6 +276,13 @@ public abstract class WMShellBaseModule {
|
||||
return new WindowManagerShellWrapper(mainExecutor);
|
||||
}
|
||||
|
||||
@WMSingleton
|
||||
@Provides
|
||||
static LaunchAdjacentController provideLaunchAdjacentController(
|
||||
SyncTransactionQueue syncQueue) {
|
||||
return new LaunchAdjacentController(syncQueue);
|
||||
}
|
||||
|
||||
//
|
||||
// Back animation
|
||||
//
|
||||
|
||||
@@ -41,6 +41,7 @@ import com.android.wm.shell.common.DisplayImeController;
|
||||
import com.android.wm.shell.common.DisplayInsetsController;
|
||||
import com.android.wm.shell.common.DisplayLayout;
|
||||
import com.android.wm.shell.common.FloatingContentCoordinator;
|
||||
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.SystemWindows;
|
||||
@@ -334,11 +335,12 @@ public abstract class WMShellModule {
|
||||
TransactionPool transactionPool,
|
||||
IconProvider iconProvider,
|
||||
Optional<RecentTasksController> recentTasks,
|
||||
LaunchAdjacentController launchAdjacentController,
|
||||
@ShellMainThread ShellExecutor mainExecutor) {
|
||||
return new SplitScreenController(context, shellInit, shellCommandHandler, shellController,
|
||||
shellTaskOrganizer, syncQueue, rootTaskDisplayAreaOrganizer, displayController,
|
||||
displayImeController, displayInsetsController, dragAndDropController, transitions,
|
||||
transactionPool, iconProvider, recentTasks, mainExecutor);
|
||||
transactionPool, iconProvider, recentTasks, launchAdjacentController, mainExecutor);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -689,12 +691,13 @@ public abstract class WMShellModule {
|
||||
EnterDesktopTaskTransitionHandler enterDesktopTransitionHandler,
|
||||
ExitDesktopTaskTransitionHandler exitDesktopTransitionHandler,
|
||||
@DynamicOverride DesktopModeTaskRepository desktopModeTaskRepository,
|
||||
LaunchAdjacentController launchAdjacentController,
|
||||
@ShellMainThread ShellExecutor mainExecutor
|
||||
) {
|
||||
return new DesktopTasksController(context, shellInit, shellCommandHandler, shellController,
|
||||
displayController, shellTaskOrganizer, syncQueue, rootTaskDisplayAreaOrganizer,
|
||||
transitions, enterDesktopTransitionHandler, exitDesktopTransitionHandler,
|
||||
desktopModeTaskRepository, mainExecutor);
|
||||
desktopModeTaskRepository, launchAdjacentController, mainExecutor);
|
||||
}
|
||||
|
||||
@WMSingleton
|
||||
|
||||
@@ -46,6 +46,7 @@ import com.android.wm.shell.ShellTaskOrganizer
|
||||
import com.android.wm.shell.common.DisplayController
|
||||
import com.android.wm.shell.common.ExecutorUtils
|
||||
import com.android.wm.shell.common.ExternalInterfaceBinder
|
||||
import com.android.wm.shell.common.LaunchAdjacentController
|
||||
import com.android.wm.shell.common.RemoteCallable
|
||||
import com.android.wm.shell.common.ShellExecutor
|
||||
import com.android.wm.shell.common.SingleInstanceRemoteListener
|
||||
@@ -78,6 +79,7 @@ class DesktopTasksController(
|
||||
private val enterDesktopTaskTransitionHandler: EnterDesktopTaskTransitionHandler,
|
||||
private val exitDesktopTaskTransitionHandler: ExitDesktopTaskTransitionHandler,
|
||||
private val desktopModeTaskRepository: DesktopModeTaskRepository,
|
||||
private val launchAdjacentController: LaunchAdjacentController,
|
||||
@ShellMainThread private val mainExecutor: ShellExecutor
|
||||
) : RemoteCallable<DesktopTasksController>, Transitions.TransitionHandler {
|
||||
|
||||
@@ -88,6 +90,11 @@ class DesktopTasksController(
|
||||
visualIndicator?.releaseVisualIndicator(t)
|
||||
visualIndicator = null
|
||||
}
|
||||
private val taskVisibilityListener = object : VisibleTasksListener {
|
||||
override fun onVisibilityChanged(displayId: Int, hasVisibleFreeformTasks: Boolean) {
|
||||
launchAdjacentController.launchAdjacentEnabled = !hasVisibleFreeformTasks
|
||||
}
|
||||
}
|
||||
|
||||
init {
|
||||
desktopMode = DesktopModeImpl()
|
||||
@@ -105,6 +112,7 @@ class DesktopTasksController(
|
||||
this
|
||||
)
|
||||
transitions.addHandler(this)
|
||||
desktopModeTaskRepository.addVisibleTasksListener(taskVisibilityListener, mainExecutor)
|
||||
}
|
||||
|
||||
/** Show all tasks, that are part of the desktop, on top of launcher */
|
||||
|
||||
@@ -76,6 +76,7 @@ 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.ExternalInterfaceBinder;
|
||||
import com.android.wm.shell.common.LaunchAdjacentController;
|
||||
import com.android.wm.shell.common.RemoteCallable;
|
||||
import com.android.wm.shell.common.ShellExecutor;
|
||||
import com.android.wm.shell.common.SingleInstanceRemoteListener;
|
||||
@@ -170,6 +171,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
private final TransactionPool mTransactionPool;
|
||||
private final IconProvider mIconProvider;
|
||||
private final Optional<RecentTasksController> mRecentTasksOptional;
|
||||
private final LaunchAdjacentController mLaunchAdjacentController;
|
||||
private final SplitScreenShellCommandHandler mSplitScreenShellCommandHandler;
|
||||
private final String[] mAppsSupportMultiInstances;
|
||||
|
||||
@@ -196,6 +198,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
TransactionPool transactionPool,
|
||||
IconProvider iconProvider,
|
||||
Optional<RecentTasksController> recentTasks,
|
||||
LaunchAdjacentController launchAdjacentController,
|
||||
ShellExecutor mainExecutor) {
|
||||
mShellCommandHandler = shellCommandHandler;
|
||||
mShellController = shellController;
|
||||
@@ -212,6 +215,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
mTransactionPool = transactionPool;
|
||||
mIconProvider = iconProvider;
|
||||
mRecentTasksOptional = recentTasks;
|
||||
mLaunchAdjacentController = launchAdjacentController;
|
||||
mSplitScreenShellCommandHandler = new SplitScreenShellCommandHandler(this);
|
||||
// TODO(b/238217847): Temporarily add this check here until we can remove the dynamic
|
||||
// override for this controller from the base module
|
||||
@@ -241,6 +245,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
TransactionPool transactionPool,
|
||||
IconProvider iconProvider,
|
||||
RecentTasksController recentTasks,
|
||||
LaunchAdjacentController launchAdjacentController,
|
||||
ShellExecutor mainExecutor,
|
||||
StageCoordinator stageCoordinator) {
|
||||
mShellCommandHandler = shellCommandHandler;
|
||||
@@ -258,6 +263,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
mTransactionPool = transactionPool;
|
||||
mIconProvider = iconProvider;
|
||||
mRecentTasksOptional = Optional.of(recentTasks);
|
||||
mLaunchAdjacentController = launchAdjacentController;
|
||||
mStageCoordinator = stageCoordinator;
|
||||
mSplitScreenShellCommandHandler = new SplitScreenShellCommandHandler(this);
|
||||
shellInit.addInitCallback(this::onInit, this);
|
||||
@@ -296,7 +302,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
return new StageCoordinator(mContext, DEFAULT_DISPLAY, mSyncQueue,
|
||||
mTaskOrganizer, mDisplayController, mDisplayImeController,
|
||||
mDisplayInsetsController, mTransitions, mTransactionPool,
|
||||
mIconProvider, mMainExecutor, mRecentTasksOptional);
|
||||
mIconProvider, mMainExecutor, mRecentTasksOptional, mLaunchAdjacentController);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -123,6 +123,7 @@ 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.DisplayLayout;
|
||||
import com.android.wm.shell.common.LaunchAdjacentController;
|
||||
import com.android.wm.shell.common.ScreenshotUtils;
|
||||
import com.android.wm.shell.common.ShellExecutor;
|
||||
import com.android.wm.shell.common.SyncTransactionQueue;
|
||||
@@ -196,6 +197,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
// if user is opening another task(s).
|
||||
private final ArrayList<Integer> mPausingTasks = new ArrayList<>();
|
||||
private final Optional<RecentTasksController> mRecentTasks;
|
||||
private final LaunchAdjacentController mLaunchAdjacentController;
|
||||
|
||||
private final Rect mTempRect1 = new Rect();
|
||||
private final Rect mTempRect2 = new Rect();
|
||||
@@ -273,7 +275,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
DisplayInsetsController displayInsetsController, Transitions transitions,
|
||||
TransactionPool transactionPool,
|
||||
IconProvider iconProvider, ShellExecutor mainExecutor,
|
||||
Optional<RecentTasksController> recentTasks) {
|
||||
Optional<RecentTasksController> recentTasks,
|
||||
LaunchAdjacentController launchAdjacentController) {
|
||||
mContext = context;
|
||||
mDisplayId = displayId;
|
||||
mSyncQueue = syncQueue;
|
||||
@@ -281,6 +284,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
mLogger = new SplitscreenEventLogger();
|
||||
mMainExecutor = mainExecutor;
|
||||
mRecentTasks = recentTasks;
|
||||
mLaunchAdjacentController = launchAdjacentController;
|
||||
|
||||
taskOrganizer.createRootTask(displayId, WINDOWING_MODE_FULLSCREEN, this /* listener */);
|
||||
|
||||
@@ -327,7 +331,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
DisplayInsetsController displayInsetsController, SplitLayout splitLayout,
|
||||
Transitions transitions, TransactionPool transactionPool,
|
||||
ShellExecutor mainExecutor,
|
||||
Optional<RecentTasksController> recentTasks) {
|
||||
Optional<RecentTasksController> recentTasks,
|
||||
LaunchAdjacentController launchAdjacentController) {
|
||||
mContext = context;
|
||||
mDisplayId = displayId;
|
||||
mSyncQueue = syncQueue;
|
||||
@@ -344,6 +349,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
mLogger = new SplitscreenEventLogger();
|
||||
mMainExecutor = mainExecutor;
|
||||
mRecentTasks = recentTasks;
|
||||
mLaunchAdjacentController = launchAdjacentController;
|
||||
mDisplayController.addDisplayWindowListener(this);
|
||||
mDisplayLayout = new DisplayLayout();
|
||||
transitions.addHandler(this);
|
||||
@@ -1743,7 +1749,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
wct.reparent(mSideStage.mRootTaskInfo.token, mRootTaskInfo.token, true);
|
||||
// Make the stages adjacent to each other so they occlude what's behind them.
|
||||
wct.setAdjacentRoots(mMainStage.mRootTaskInfo.token, mSideStage.mRootTaskInfo.token);
|
||||
wct.setLaunchAdjacentFlagRoot(mSideStage.mRootTaskInfo.token);
|
||||
setRootForceTranslucent(true, wct);
|
||||
mSplitLayout.getInvisibleBounds(mTempRect1);
|
||||
wct.setBounds(mSideStage.mRootTaskInfo.token, mTempRect1);
|
||||
@@ -1751,6 +1756,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
mSyncQueue.runInSync(t -> {
|
||||
t.setPosition(mSideStage.mRootLeash, mTempRect1.left, mTempRect1.top);
|
||||
});
|
||||
mLaunchAdjacentController.setLaunchAdjacentRoot(mSideStage.mRootTaskInfo.token);
|
||||
}
|
||||
|
||||
/** Callback when split roots have child task appeared under it, this is a little different from
|
||||
@@ -1780,9 +1786,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
|
||||
private void onRootTaskVanished() {
|
||||
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
||||
if (mRootTaskInfo != null) {
|
||||
wct.clearLaunchAdjacentFlagRoot(mRootTaskInfo.token);
|
||||
}
|
||||
mLaunchAdjacentController.clearLaunchAdjacentRoot();
|
||||
applyExitSplitScreen(null /* childrenToTop */, wct, EXIT_REASON_ROOT_TASK_VANISHED);
|
||||
mDisplayInsetsController.removeInsetsChangedListener(mDisplayId, mSplitLayout);
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ import com.android.wm.shell.ShellTaskOrganizer;
|
||||
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.SystemWindows;
|
||||
@@ -58,6 +59,7 @@ public class TvSplitScreenController extends SplitScreenController {
|
||||
private final TransactionPool mTransactionPool;
|
||||
private final IconProvider mIconProvider;
|
||||
private final Optional<RecentTasksController> mRecentTasksOptional;
|
||||
private final LaunchAdjacentController mLaunchAdjacentController;
|
||||
|
||||
private final Handler mMainHandler;
|
||||
private final SystemWindows mSystemWindows;
|
||||
@@ -77,13 +79,14 @@ public class TvSplitScreenController extends SplitScreenController {
|
||||
TransactionPool transactionPool,
|
||||
IconProvider iconProvider,
|
||||
Optional<RecentTasksController> recentTasks,
|
||||
LaunchAdjacentController launchAdjacentController,
|
||||
ShellExecutor mainExecutor,
|
||||
Handler mainHandler,
|
||||
SystemWindows systemWindows) {
|
||||
super(context, shellInit, shellCommandHandler, shellController, shellTaskOrganizer,
|
||||
syncQueue, rootTDAOrganizer, displayController, displayImeController,
|
||||
displayInsetsController, dragAndDropController, transitions, transactionPool,
|
||||
iconProvider, recentTasks, mainExecutor);
|
||||
iconProvider, recentTasks, launchAdjacentController, mainExecutor);
|
||||
|
||||
mTaskOrganizer = shellTaskOrganizer;
|
||||
mSyncQueue = syncQueue;
|
||||
@@ -96,6 +99,7 @@ public class TvSplitScreenController extends SplitScreenController {
|
||||
mTransactionPool = transactionPool;
|
||||
mIconProvider = iconProvider;
|
||||
mRecentTasksOptional = recentTasks;
|
||||
mLaunchAdjacentController = launchAdjacentController;
|
||||
|
||||
mMainHandler = mainHandler;
|
||||
mSystemWindows = systemWindows;
|
||||
@@ -111,7 +115,7 @@ public class TvSplitScreenController extends SplitScreenController {
|
||||
mTaskOrganizer, mDisplayController, mDisplayImeController,
|
||||
mDisplayInsetsController, mTransitions, mTransactionPool,
|
||||
mIconProvider, mMainExecutor, mMainHandler,
|
||||
mRecentTasksOptional, mSystemWindows);
|
||||
mRecentTasksOptional, mLaunchAdjacentController, mSystemWindows);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ import com.android.wm.shell.ShellTaskOrganizer;
|
||||
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.SystemWindows;
|
||||
@@ -51,10 +52,11 @@ public class TvStageCoordinator extends StageCoordinator
|
||||
IconProvider iconProvider, ShellExecutor mainExecutor,
|
||||
Handler mainHandler,
|
||||
Optional<RecentTasksController> recentTasks,
|
||||
LaunchAdjacentController launchAdjacentController,
|
||||
SystemWindows systemWindows) {
|
||||
super(context, displayId, syncQueue, taskOrganizer, displayController, displayImeController,
|
||||
displayInsetsController, transitions, transactionPool, iconProvider,
|
||||
mainExecutor, recentTasks);
|
||||
mainExecutor, recentTasks, launchAdjacentController);
|
||||
|
||||
mTvSplitMenuController = new TvSplitMenuController(context, this,
|
||||
systemWindows, mainHandler);
|
||||
|
||||
@@ -46,6 +46,7 @@ import com.android.wm.shell.ShellTestCase
|
||||
import com.android.wm.shell.TestRunningTaskInfoBuilder
|
||||
import com.android.wm.shell.TestShellExecutor
|
||||
import com.android.wm.shell.common.DisplayController
|
||||
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.desktopmode.DesktopTestHelpers.Companion.createFreeformTask
|
||||
@@ -88,12 +89,14 @@ class DesktopTasksControllerTest : ShellTestCase() {
|
||||
@Mock lateinit var transitions: Transitions
|
||||
@Mock lateinit var exitDesktopTransitionHandler: ExitDesktopTaskTransitionHandler
|
||||
@Mock lateinit var enterDesktopTransitionHandler: EnterDesktopTaskTransitionHandler
|
||||
@Mock lateinit var launchAdjacentController: LaunchAdjacentController
|
||||
|
||||
private lateinit var mockitoSession: StaticMockitoSession
|
||||
private lateinit var controller: DesktopTasksController
|
||||
private lateinit var shellInit: ShellInit
|
||||
private lateinit var desktopModeTaskRepository: DesktopModeTaskRepository
|
||||
|
||||
private val shellExecutor = TestShellExecutor()
|
||||
// Mock running tasks are registered here so we can get the list from mock shell task organizer
|
||||
private val runningTasks = mutableListOf<RunningTaskInfo>()
|
||||
|
||||
@@ -127,7 +130,8 @@ class DesktopTasksControllerTest : ShellTestCase() {
|
||||
enterDesktopTransitionHandler,
|
||||
exitDesktopTransitionHandler,
|
||||
desktopModeTaskRepository,
|
||||
TestShellExecutor()
|
||||
launchAdjacentController,
|
||||
shellExecutor
|
||||
)
|
||||
}
|
||||
|
||||
@@ -351,7 +355,7 @@ class DesktopTasksControllerTest : ShellTestCase() {
|
||||
@Test
|
||||
fun moveTaskToFront_postsWctWithReorderOp() {
|
||||
val task1 = setUpFreeformTask()
|
||||
val task2 = setUpFreeformTask()
|
||||
setUpFreeformTask()
|
||||
|
||||
controller.moveTaskToFront(task1)
|
||||
|
||||
@@ -614,6 +618,27 @@ class DesktopTasksControllerTest : ShellTestCase() {
|
||||
assertThat(desktopModeTaskRepository.isStashed(SECOND_DISPLAY)).isTrue()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun desktopTasksVisibilityChange_visible_setLaunchAdjacentDisabled() {
|
||||
val task = setUpFreeformTask()
|
||||
clearInvocations(launchAdjacentController)
|
||||
|
||||
markTaskVisible(task)
|
||||
shellExecutor.flushAll()
|
||||
verify(launchAdjacentController).launchAdjacentEnabled = false
|
||||
}
|
||||
|
||||
@Test
|
||||
fun desktopTasksVisibilityChange_invisible_setLaunchAdjacentEnabled() {
|
||||
val task = setUpFreeformTask()
|
||||
markTaskVisible(task)
|
||||
clearInvocations(launchAdjacentController)
|
||||
|
||||
markTaskHidden(task)
|
||||
shellExecutor.flushAll()
|
||||
verify(launchAdjacentController).launchAdjacentEnabled = true
|
||||
}
|
||||
|
||||
private fun setUpFreeformTask(displayId: Int = DEFAULT_DISPLAY): RunningTaskInfo {
|
||||
val task = createFreeformTask(displayId)
|
||||
whenever(shellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task)
|
||||
|
||||
@@ -61,6 +61,7 @@ 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.DisplayLayout;
|
||||
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.TransactionPool;
|
||||
@@ -102,6 +103,7 @@ public class SplitScreenControllerTests extends ShellTestCase {
|
||||
@Mock IconProvider mIconProvider;
|
||||
@Mock StageCoordinator mStageCoordinator;
|
||||
@Mock RecentTasksController mRecentTasks;
|
||||
@Mock LaunchAdjacentController mLaunchAdjacentController;
|
||||
@Captor ArgumentCaptor<Intent> mIntentCaptor;
|
||||
|
||||
private ShellController mShellController;
|
||||
@@ -117,7 +119,8 @@ public class SplitScreenControllerTests extends ShellTestCase {
|
||||
mShellCommandHandler, mShellController, mTaskOrganizer, mSyncQueue,
|
||||
mRootTDAOrganizer, mDisplayController, mDisplayImeController,
|
||||
mDisplayInsetsController, mDragAndDropController, mTransitions, mTransactionPool,
|
||||
mIconProvider, mRecentTasks, mMainExecutor, mStageCoordinator));
|
||||
mIconProvider, mRecentTasks, mLaunchAdjacentController, mMainExecutor,
|
||||
mStageCoordinator));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -31,6 +31,7 @@ import com.android.wm.shell.TestRunningTaskInfoBuilder;
|
||||
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.TransactionPool;
|
||||
@@ -75,11 +76,12 @@ public class SplitTestUtils {
|
||||
DisplayController displayController, DisplayImeController imeController,
|
||||
DisplayInsetsController insetsController, SplitLayout splitLayout,
|
||||
Transitions transitions, TransactionPool transactionPool,
|
||||
ShellExecutor mainExecutor,
|
||||
Optional<RecentTasksController> recentTasks) {
|
||||
ShellExecutor mainExecutor, Optional<RecentTasksController> recentTasks,
|
||||
LaunchAdjacentController launchAdjacentController) {
|
||||
super(context, displayId, syncQueue, taskOrganizer, mainStage,
|
||||
sideStage, displayController, imeController, insetsController, splitLayout,
|
||||
transitions, transactionPool, mainExecutor, recentTasks);
|
||||
transitions, transactionPool, mainExecutor, recentTasks,
|
||||
launchAdjacentController);
|
||||
|
||||
// Prepare root task for testing.
|
||||
mRootTask = new TestRunningTaskInfoBuilder().build();
|
||||
|
||||
@@ -70,6 +70,7 @@ import com.android.wm.shell.TransitionInfoBuilder;
|
||||
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.TransactionPool;
|
||||
@@ -101,6 +102,7 @@ public class SplitTransitionTests extends ShellTestCase {
|
||||
@Mock private SurfaceSession mSurfaceSession;
|
||||
@Mock private IconProvider mIconProvider;
|
||||
@Mock private ShellExecutor mMainExecutor;
|
||||
@Mock private LaunchAdjacentController mLaunchAdjacentController;
|
||||
private SplitLayout mSplitLayout;
|
||||
private MainStage mMainStage;
|
||||
private SideStage mSideStage;
|
||||
@@ -130,7 +132,8 @@ public class SplitTransitionTests extends ShellTestCase {
|
||||
mStageCoordinator = new SplitTestUtils.TestStageCoordinator(mContext, DEFAULT_DISPLAY,
|
||||
mSyncQueue, mTaskOrganizer, mMainStage, mSideStage, mDisplayController,
|
||||
mDisplayImeController, mDisplayInsetsController, mSplitLayout, mTransitions,
|
||||
mTransactionPool, mMainExecutor, Optional.empty());
|
||||
mTransactionPool, mMainExecutor, Optional.empty(),
|
||||
mLaunchAdjacentController);
|
||||
mSplitScreenTransitions = mStageCoordinator.getSplitTransitions();
|
||||
doAnswer((Answer<IBinder>) invocation -> mock(IBinder.class))
|
||||
.when(mTransitions).startTransition(anyInt(), any(), any());
|
||||
|
||||
@@ -65,6 +65,7 @@ import com.android.wm.shell.TestShellExecutor;
|
||||
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.TransactionPool;
|
||||
@@ -107,6 +108,8 @@ public class StageCoordinatorTests extends ShellTestCase {
|
||||
private DisplayInsetsController mDisplayInsetsController;
|
||||
@Mock
|
||||
private TransactionPool mTransactionPool;
|
||||
@Mock
|
||||
private LaunchAdjacentController mLaunchAdjacentController;
|
||||
|
||||
private final Rect mBounds1 = new Rect(10, 20, 30, 40);
|
||||
private final Rect mBounds2 = new Rect(5, 10, 15, 20);
|
||||
@@ -130,7 +133,7 @@ public class StageCoordinatorTests extends ShellTestCase {
|
||||
mStageCoordinator = spy(new StageCoordinator(mContext, DEFAULT_DISPLAY, mSyncQueue,
|
||||
mTaskOrganizer, mMainStage, mSideStage, mDisplayController, mDisplayImeController,
|
||||
mDisplayInsetsController, mSplitLayout, mTransitions, mTransactionPool,
|
||||
mMainExecutor, Optional.empty()));
|
||||
mMainExecutor, Optional.empty(), mLaunchAdjacentController));
|
||||
mDividerLeash = new SurfaceControl.Builder(mSurfaceSession).setName("fakeDivider").build();
|
||||
|
||||
when(mSplitLayout.getBounds1()).thenReturn(mBounds1);
|
||||
|
||||
Reference in New Issue
Block a user