Merge changes If5199a8e,I2c0a63d9 into udc-qpr-dev
* changes: Turn off launch adjacent behavior when on desktop Dump DesktopModeTaskRepository data
This commit is contained in:
@@ -2152,7 +2152,7 @@ public class BubbleController implements ConfigurationChangeListener,
|
||||
pw.println(" suppressing: " + key);
|
||||
}
|
||||
|
||||
pw.print("mAppBubbleTaskIds: " + mAppBubbleTaskIds.values());
|
||||
pw.println("mAppBubbleTaskIds: " + mAppBubbleTaskIds.values());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -679,6 +681,7 @@ public abstract class WMShellModule {
|
||||
static DesktopTasksController provideDesktopTasksController(
|
||||
Context context,
|
||||
ShellInit shellInit,
|
||||
ShellCommandHandler shellCommandHandler,
|
||||
ShellController shellController,
|
||||
DisplayController displayController,
|
||||
ShellTaskOrganizer shellTaskOrganizer,
|
||||
@@ -688,12 +691,13 @@ public abstract class WMShellModule {
|
||||
EnterDesktopTaskTransitionHandler enterDesktopTransitionHandler,
|
||||
ExitDesktopTaskTransitionHandler exitDesktopTransitionHandler,
|
||||
@DynamicOverride DesktopModeTaskRepository desktopModeTaskRepository,
|
||||
LaunchAdjacentController launchAdjacentController,
|
||||
@ShellMainThread ShellExecutor mainExecutor
|
||||
) {
|
||||
return new DesktopTasksController(context, shellInit, shellController, displayController,
|
||||
shellTaskOrganizer, syncQueue, rootTaskDisplayAreaOrganizer, transitions,
|
||||
enterDesktopTransitionHandler, exitDesktopTransitionHandler,
|
||||
desktopModeTaskRepository, mainExecutor);
|
||||
return new DesktopTasksController(context, shellInit, shellCommandHandler, shellController,
|
||||
displayController, shellTaskOrganizer, syncQueue, rootTaskDisplayAreaOrganizer,
|
||||
transitions, enterDesktopTransitionHandler, exitDesktopTransitionHandler,
|
||||
desktopModeTaskRepository, launchAdjacentController, mainExecutor);
|
||||
}
|
||||
|
||||
@WMSingleton
|
||||
|
||||
@@ -25,6 +25,7 @@ import androidx.core.util.keyIterator
|
||||
import androidx.core.util.valueIterator
|
||||
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
|
||||
import com.android.wm.shell.util.KtProtoLog
|
||||
import java.io.PrintWriter
|
||||
import java.util.concurrent.Executor
|
||||
import java.util.function.Consumer
|
||||
|
||||
@@ -339,6 +340,25 @@ class DesktopModeTaskRepository {
|
||||
return displayData[displayId]?.stashed ?: false
|
||||
}
|
||||
|
||||
internal fun dump(pw: PrintWriter, prefix: String) {
|
||||
val innerPrefix = "$prefix "
|
||||
pw.println("${prefix}DesktopModeTaskRepository")
|
||||
dumpDisplayData(pw, innerPrefix)
|
||||
pw.println("${innerPrefix}freeformTasksInZOrder=${freeformTasksInZOrder.toDumpString()}")
|
||||
pw.println("${innerPrefix}activeTasksListeners=${activeTasksListeners.size}")
|
||||
pw.println("${innerPrefix}visibleTasksListeners=${visibleTasksListeners.size}")
|
||||
}
|
||||
|
||||
private fun dumpDisplayData(pw: PrintWriter, prefix: String) {
|
||||
val innerPrefix = "$prefix "
|
||||
displayData.forEach { displayId, data ->
|
||||
pw.println("${prefix}Display $displayId:")
|
||||
pw.println("${innerPrefix}activeTasks=${data.activeTasks.toDumpString()}")
|
||||
pw.println("${innerPrefix}visibleTasks=${data.visibleTasks.toDumpString()}")
|
||||
pw.println("${innerPrefix}stashed=${data.stashed}")
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines interface for classes that can listen to changes for active tasks in desktop mode.
|
||||
*/
|
||||
@@ -367,3 +387,7 @@ class DesktopModeTaskRepository {
|
||||
fun onStashedChanged(displayId: Int, stashed: Boolean) {}
|
||||
}
|
||||
}
|
||||
|
||||
private fun <T> Iterable<T>.toDumpString(): String {
|
||||
return joinToString(separator = ", ", prefix = "[", postfix = "]")
|
||||
}
|
||||
@@ -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
|
||||
@@ -54,11 +55,13 @@ import com.android.wm.shell.common.annotations.ExternalThread
|
||||
import com.android.wm.shell.common.annotations.ShellMainThread
|
||||
import com.android.wm.shell.desktopmode.DesktopModeTaskRepository.VisibleTasksListener
|
||||
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
|
||||
import com.android.wm.shell.sysui.ShellCommandHandler
|
||||
import com.android.wm.shell.sysui.ShellController
|
||||
import com.android.wm.shell.sysui.ShellInit
|
||||
import com.android.wm.shell.sysui.ShellSharedConstants
|
||||
import com.android.wm.shell.transition.Transitions
|
||||
import com.android.wm.shell.util.KtProtoLog
|
||||
import java.io.PrintWriter
|
||||
import java.util.concurrent.Executor
|
||||
import java.util.function.Consumer
|
||||
|
||||
@@ -66,6 +69,7 @@ import java.util.function.Consumer
|
||||
class DesktopTasksController(
|
||||
private val context: Context,
|
||||
shellInit: ShellInit,
|
||||
private val shellCommandHandler: ShellCommandHandler,
|
||||
private val shellController: ShellController,
|
||||
private val displayController: DisplayController,
|
||||
private val shellTaskOrganizer: ShellTaskOrganizer,
|
||||
@@ -75,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 {
|
||||
|
||||
@@ -85,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()
|
||||
@@ -95,12 +105,14 @@ class DesktopTasksController(
|
||||
|
||||
private fun onInit() {
|
||||
KtProtoLog.d(WM_SHELL_DESKTOP_MODE, "Initialize DesktopTasksController")
|
||||
shellCommandHandler.addDumpCallback(this::dump, this)
|
||||
shellController.addExternalInterface(
|
||||
ShellSharedConstants.KEY_EXTRA_SHELL_DESKTOP_MODE,
|
||||
{ createExternalInterface() },
|
||||
this
|
||||
)
|
||||
transitions.addHandler(this)
|
||||
desktopModeTaskRepository.addVisibleTasksListener(taskVisibilityListener, mainExecutor)
|
||||
}
|
||||
|
||||
/** Show all tasks, that are part of the desktop, on top of launcher */
|
||||
@@ -710,6 +722,12 @@ class DesktopTasksController(
|
||||
desktopModeTaskRepository.setTaskCornerListener(listener, callbackExecutor)
|
||||
}
|
||||
|
||||
private fun dump(pw: PrintWriter, prefix: String) {
|
||||
val innerPrefix = "$prefix "
|
||||
pw.println("${prefix}DesktopTasksController")
|
||||
desktopModeTaskRepository.dump(pw, innerPrefix)
|
||||
}
|
||||
|
||||
/** The interface for calls from outside the shell, within the host process. */
|
||||
@ExternalThread
|
||||
private inner class DesktopModeImpl : DesktopMode {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -124,6 +124,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;
|
||||
@@ -197,6 +198,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();
|
||||
@@ -274,7 +276,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;
|
||||
@@ -282,6 +285,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
mLogger = new SplitscreenEventLogger();
|
||||
mMainExecutor = mainExecutor;
|
||||
mRecentTasks = recentTasks;
|
||||
mLaunchAdjacentController = launchAdjacentController;
|
||||
|
||||
taskOrganizer.createRootTask(displayId, WINDOWING_MODE_FULLSCREEN, this /* listener */);
|
||||
|
||||
@@ -328,7 +332,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;
|
||||
@@ -345,6 +350,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);
|
||||
@@ -1744,7 +1750,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);
|
||||
@@ -1752,6 +1757,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
|
||||
@@ -1781,9 +1787,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,11 +46,13 @@ 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
|
||||
import com.android.wm.shell.desktopmode.DesktopTestHelpers.Companion.createFullscreenTask
|
||||
import com.android.wm.shell.desktopmode.DesktopTestHelpers.Companion.createHomeTask
|
||||
import com.android.wm.shell.sysui.ShellCommandHandler
|
||||
import com.android.wm.shell.sysui.ShellController
|
||||
import com.android.wm.shell.sysui.ShellInit
|
||||
import com.android.wm.shell.transition.Transitions
|
||||
@@ -78,6 +80,7 @@ import org.mockito.Mockito.`when` as whenever
|
||||
class DesktopTasksControllerTest : ShellTestCase() {
|
||||
|
||||
@Mock lateinit var testExecutor: ShellExecutor
|
||||
@Mock lateinit var shellCommandHandler: ShellCommandHandler
|
||||
@Mock lateinit var shellController: ShellController
|
||||
@Mock lateinit var displayController: DisplayController
|
||||
@Mock lateinit var shellTaskOrganizer: ShellTaskOrganizer
|
||||
@@ -86,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>()
|
||||
|
||||
@@ -115,6 +120,7 @@ class DesktopTasksControllerTest : ShellTestCase() {
|
||||
return DesktopTasksController(
|
||||
context,
|
||||
shellInit,
|
||||
shellCommandHandler,
|
||||
shellController,
|
||||
displayController,
|
||||
shellTaskOrganizer,
|
||||
@@ -124,7 +130,8 @@ class DesktopTasksControllerTest : ShellTestCase() {
|
||||
enterDesktopTransitionHandler,
|
||||
exitDesktopTransitionHandler,
|
||||
desktopModeTaskRepository,
|
||||
TestShellExecutor()
|
||||
launchAdjacentController,
|
||||
shellExecutor
|
||||
)
|
||||
}
|
||||
|
||||
@@ -348,7 +355,7 @@ class DesktopTasksControllerTest : ShellTestCase() {
|
||||
@Test
|
||||
fun moveTaskToFront_postsWctWithReorderOp() {
|
||||
val task1 = setUpFreeformTask()
|
||||
val task2 = setUpFreeformTask()
|
||||
setUpFreeformTask()
|
||||
|
||||
controller.moveTaskToFront(task1)
|
||||
|
||||
@@ -611,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