4/n Add fallback to default task display area
... for the cases when a particular task display area target is not
specified, and/or the logic applies only to the default/fallback
task area on the display.
Bug: 152116619
Test: WM CTS and unit tests
Change-Id: I209629baada05b0615ea2874f39a2b30a95b7565
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index 10b335e..a446720 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -3553,9 +3553,8 @@
}
}
- void reparent(DisplayContent newParent, boolean onTop) {
- // Real parent of stack is within display object, so we have to delegate re-parenting there.
- newParent.moveStackToDisplay(this, onTop);
+ void reparent(TaskDisplayArea newParent, boolean onTop) {
+ reparent(newParent, onTop ? POSITION_TOP : POSITION_BOTTOM);
}
private void updateSurfaceBounds() {
diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
index 2c7ce91..8af8624 100644
--- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
@@ -412,7 +412,7 @@
final ActivityStack stack = (ActivityStack) task;
stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
if (mToDisplay.getDisplayId() != stack.getDisplayId()) {
- mToDisplay.moveStackToDisplay(stack, mOnTop);
+ stack.reparent(mToDisplay.getDefaultTaskDisplayArea(), mOnTop);
} else if (mOnTop) {
mToDisplay.mTaskContainers.positionStackAtTop(stack,
false /* includingParents */);
@@ -566,8 +566,8 @@
}
void moveRecentsStackToFront(String reason) {
- final ActivityStack recentsStack = mRootWindowContainer.getDefaultDisplay().getStack(
- WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_RECENTS);
+ final ActivityStack recentsStack = mRootWindowContainer.getDefaultTaskDisplayArea()
+ .getStack(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_RECENTS);
if (recentsStack != null) {
recentsStack.moveToFront(reason);
}
@@ -2613,7 +2613,7 @@
// from whatever is started from the recents activity, so move the home stack
// forward.
// TODO (b/115289124): Multi-display supports for recents.
- mRootWindowContainer.getDefaultDisplay().mTaskContainers.moveHomeStackToFront(
+ mRootWindowContainer.getDefaultTaskDisplayArea().moveHomeStackToFront(
"startActivityFromRecents");
}
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 7803c73..0b19687 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -4283,9 +4283,9 @@
long ident = Binder.clearCallingIdentity();
try {
synchronized (mGlobalLock) {
- final DisplayContent dc = mRootWindowContainer.getDefaultDisplay();
- final Task primary = dc.getRootSplitScreenPrimaryTask();
- final Task secondary = dc.getTask(t -> t.mCreatedByOrganizer && t.isRootTask()
+ final TaskDisplayArea tc = mRootWindowContainer.getDefaultTaskDisplayArea();
+ final Task primary = tc.getRootSplitScreenPrimaryTask();
+ final Task secondary = tc.getTask(t -> t.mCreatedByOrganizer && t.isRootTask()
&& t.inSplitScreenSecondaryWindowingMode());
if (primary == null || secondary == null) {
return;
@@ -4301,7 +4301,7 @@
if (otherRect == null) {
// Temporary estimation... again this is just for tests.
otherRect = new Rect(secondary.getBounds());
- if (dc.getBounds().width() > dc.getBounds().height()) {
+ if (tc.getBounds().width() > tc.getBounds().height()) {
otherRect.left = primaryRect.right + 6;
} else {
otherRect.top = primaryRect.bottom + 6;
diff --git a/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java b/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java
index 682a142..e8becfa 100644
--- a/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java
+++ b/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java
@@ -54,7 +54,7 @@
* - DisplayArea.Root
* - Magnification
* - DisplayArea.Tokens (Wallpapers are attached here)
- * - TaskContainers
+ * - TaskDisplayArea
* - DisplayArea.Tokens (windows above Tasks up to IME are attached here)
* - ImeContainers
* - DisplayArea.Tokens (windows above IME up to TYPE_ACCESSIBILITY_OVERLAY attached here)
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 55b7be779..85517a4 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -575,13 +575,6 @@
private RootWindowContainer mRootWindowContainer;
- /**
- * All of the stacks on this display. Order matters, topmost stack is in front of all other
- * stacks, bottommost behind. Accessed directly by ActivityManager package classes. Any calls
- * changing the list should also call {@link #onStackOrderChanged()}.
- */
- private ArrayList<OnStackOrderChangedListener> mStackOrderChangedCallbacks = new ArrayList<>();
-
/** Array of all UIDs that are present on the display. */
private IntArray mDisplayAccessUIDs = new IntArray();
@@ -2062,23 +2055,6 @@
return (mDisplay.getFlags() & FLAG_PRIVATE) != 0;
}
- ActivityStack getRootHomeTask() {
- return mTaskContainers.getRootHomeTask();
- }
-
- /** @return The primary split-screen task, and {@code null} otherwise. */
- @Nullable ActivityStack getRootSplitScreenPrimaryTask() {
- return mTaskContainers.getRootSplitScreenPrimaryTask();
- }
-
- ActivityStack getRootPinnedTask() {
- return mTaskContainers.getRootPinnedTask();
- }
-
- boolean hasPinnedTask() {
- return mTaskContainers.getRootPinnedTask() != null;
- }
-
/**
* Returns the topmost stack on the display that is compatible with the input windowing mode and
* activity type. Null is no compatible stack on the display.
@@ -2095,32 +2071,11 @@
return mTaskContainers.mChildren.get(index);
}
- int getIndexOf(ActivityStack stack) {
- return mTaskContainers.getIndexOf(stack);
- }
-
- void removeStack(ActivityStack stack) {
- mTaskContainers.removeChild(stack);
- }
-
- @VisibleForTesting
- WindowList<ActivityStack> getStacks() {
- return mTaskContainers.mChildren;
- }
-
@VisibleForTesting
ActivityStack getTopStack() {
return mTaskContainers.getTopStack();
}
- ArrayList<Task> getVisibleTasks() {
- return mTaskContainers.getVisibleTasks();
- }
-
- SurfaceControl getSplitScreenDividerAnchor() {
- return mTaskContainers.getSplitScreenDividerAnchor();
- }
-
/**
* The value is only valid in the scope {@link #onRequestedOverrideConfigurationChanged} of the
* changing hierarchy and the {@link #onConfigurationChanged} of its children.
@@ -2409,8 +2364,13 @@
out.set(mDisplayFrames.mStable);
}
- void moveStackToDisplay(ActivityStack stack, boolean onTop) {
- stack.reparent(mTaskContainers, onTop ? POSITION_TOP: POSITION_BOTTOM);
+ /**
+ * Get the default display area on the display dedicated to app windows. This one should be used
+ * only as a fallback location for activity launches when no target display area is specified,
+ * or for cases when multi-instance is not supported yet (like Split-screen, PiP or Recents).
+ */
+ TaskDisplayArea getDefaultTaskDisplayArea() {
+ return mTaskContainers;
}
@Override
@@ -2473,7 +2433,7 @@
*/
Task findTaskForResizePoint(int x, int y) {
final int delta = dipToPixel(RESIZE_HANDLE_WIDTH_IN_DP, mDisplayMetrics);
- return mTmpTaskForResizePointSearchResult.process(mTaskContainers, x, y, delta);
+ return mTmpTaskForResizePointSearchResult.process(getDefaultTaskDisplayArea(), x, y, delta);
}
void updateTouchExcludeRegion() {
@@ -2512,8 +2472,9 @@
mTouchExcludeRegion.op(mTmpRegion, Region.Op.UNION);
}
amendWindowTapExcludeRegion(mTouchExcludeRegion);
- // TODO(multi-display): Support docked stacks on secondary displays.
- if (mDisplayId == DEFAULT_DISPLAY && mTaskContainers.isSplitScreenModeActivated()) {
+ // TODO(multi-display): Support docked stacks on secondary displays & task containers.
+ if (mDisplayId == DEFAULT_DISPLAY
+ && getDefaultTaskDisplayArea().isSplitScreenModeActivated()) {
mDividerControllerLocked.getTouchRegion(mTmpRect);
mTmpRegion.set(mTmpRect);
mTouchExcludeRegion.op(mTmpRegion, Op.UNION);
@@ -2908,20 +2869,22 @@
pw.println();
// Dump stack references
- final ActivityStack homeStack = getRootHomeTask();
+ final ActivityStack homeStack = getDefaultTaskDisplayArea().getRootHomeTask();
if (homeStack != null) {
pw.println(prefix + "homeStack=" + homeStack.getName());
}
- final ActivityStack pinnedStack = getRootPinnedTask();
+ final ActivityStack pinnedStack = getDefaultTaskDisplayArea().getRootPinnedTask();
if (pinnedStack != null) {
pw.println(prefix + "pinnedStack=" + pinnedStack.getName());
}
- final ActivityStack splitScreenPrimaryStack = getRootSplitScreenPrimaryTask();
+ final ActivityStack splitScreenPrimaryStack = getDefaultTaskDisplayArea()
+ .getRootSplitScreenPrimaryTask();
if (splitScreenPrimaryStack != null) {
pw.println(prefix + "splitScreenPrimaryStack=" + splitScreenPrimaryStack.getName());
}
- final ActivityStack recentsStack =
- getStack(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_RECENTS);
+ // TODO: Support recents on non-default task containers
+ final ActivityStack recentsStack = getDefaultTaskDisplayArea().getStack(
+ WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_RECENTS);
if (recentsStack != null) {
pw.println(prefix + "recentsStack=" + recentsStack.getName());
}
@@ -2955,12 +2918,6 @@
return "Display " + mDisplayId + " name=\"" + mDisplayInfo.name + "\"";
}
- /** Returns true if the stack in the windowing mode is visible. */
- boolean isStackVisible(int windowingMode) {
- final ActivityStack stack = mTaskContainers.getTopStackInWindowingMode(windowingMode);
- return stack != null && stack.isVisible();
- }
-
/** Find the visible, touch-deliverable window under the given point */
WindowState getTouchableWinAtPointLocked(float xf, float yf) {
final int x = (int) xf;
@@ -4367,7 +4324,7 @@
// We skip IME windows so they're processed just above their target, except
// in split-screen mode where we process the IME containers above the docked divider.
return dc.mInputMethodTarget != null
- && !dc.mTaskContainers.isSplitScreenModeActivated();
+ && !dc.getDefaultTaskDisplayArea().isSplitScreenModeActivated();
}
/** Like {@link #forAllWindows}, but ignores {@link #skipImeWindowsDuringTraversal} */
@@ -5262,7 +5219,7 @@
// released (no more ActivityStack). But, we cannot release it at that moment or the
// related WindowContainer will also be removed. So, we set display as removed after
// reparenting stack finished.
- final DisplayContent toDisplay = mRootWindowContainer.getDefaultDisplay();
+ final TaskDisplayArea toTaskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea();
mRootWindowContainer.mStackSupervisor.beginDeferResume();
try {
int numStacks = getStackCount();
@@ -5276,10 +5233,10 @@
// If default display is in split-window mode, set windowing mode of the stack
// to split-screen secondary. Otherwise, set the windowing mode to undefined by
// default to let stack inherited the windowing mode from the new display.
- final int windowingMode = toDisplay.mTaskContainers.isSplitScreenModeActivated()
+ final int windowingMode = toTaskDisplayArea.isSplitScreenModeActivated()
? WINDOWING_MODE_SPLIT_SCREEN_SECONDARY
: WINDOWING_MODE_UNDEFINED;
- stack.reparent(toDisplay, true /* onTop */);
+ stack.reparent(toTaskDisplayArea, true /* onTop */);
stack.setWindowingMode(windowingMode);
lastReparentedStack = stack;
}
@@ -5392,34 +5349,6 @@
mSleeping = asleep;
}
- /**
- * Adds a listener to be notified whenever the stack order in the display changes. Currently
- * only used by the {@link RecentsAnimation} to determine whether to interrupt and cancel the
- * current animation when the system state changes.
- */
- void registerStackOrderChangedListener(OnStackOrderChangedListener listener) {
- if (!mStackOrderChangedCallbacks.contains(listener)) {
- mStackOrderChangedCallbacks.add(listener);
- }
- }
-
- /**
- * Removes a previously registered stack order change listener.
- */
- void unregisterStackOrderChangedListener(OnStackOrderChangedListener listener) {
- mStackOrderChangedCallbacks.remove(listener);
- }
-
- /**
- * Notifies of a stack order change
- * @param stack The stack which triggered the order change
- */
- void onStackOrderChanged(ActivityStack stack) {
- for (int i = mStackOrderChangedCallbacks.size() - 1; i >= 0; i--) {
- mStackOrderChangedCallbacks.get(i).onStackOrderChanged(stack);
- }
- }
-
void setDisplayToSingleTaskInstance() {
final int childCount = getStackCount();
if (childCount > 1) {
@@ -5448,22 +5377,6 @@
}
/**
- * Callback for when the order of the stacks in the display changes.
- */
- interface OnStackOrderChangedListener {
- void onStackOrderChanged(ActivityStack stack);
- }
-
- public void dumpStacks(PrintWriter pw) {
- for (int i = getStackCount() - 1; i >= 0; --i) {
- pw.print(getStackAt(i).getRootTaskId());
- if (i > 0) {
- pw.print(",");
- }
- }
- }
-
- /**
* Similar to {@link RootWindowContainer#isAnyNonToastWindowVisibleForUid(int)}, but
* used for pid.
*/
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index 221258e..264da9f 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -2653,8 +2653,8 @@
if (mStatusBarController.setBarShowingLw(true)) {
changes |= FINISH_LAYOUT_REDO_LAYOUT;
}
- } else if (topIsFullscreen
- && !mDisplayContent.isStackVisible(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY)) {
+ } else if (topIsFullscreen && !mDisplayContent.getDefaultTaskDisplayArea()
+ .isStackVisible(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY)) {
if (DEBUG_LAYOUT) Slog.v(TAG, "** HIDING status bar");
if (mStatusBarController.setBarShowingLw(false)) {
changes |= FINISH_LAYOUT_REDO_LAYOUT;
@@ -3462,10 +3462,10 @@
}
private Pair<Integer, WindowState> updateSystemBarsLw(WindowState win, int oldVis, int vis) {
- final boolean dockedStackVisible =
- mDisplayContent.isStackVisible(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
- final boolean freeformStackVisible =
- mDisplayContent.isStackVisible(WINDOWING_MODE_FREEFORM);
+ final boolean dockedStackVisible = mDisplayContent.getDefaultTaskDisplayArea()
+ .isStackVisible(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
+ final boolean freeformStackVisible = mDisplayContent.getDefaultTaskDisplayArea()
+ .isStackVisible(WINDOWING_MODE_FREEFORM);
final boolean resizing = mDisplayContent.getDockedDividerController().isResizing();
// We need to force system bars when the docked stack is visible, when the freeform stack
diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java
index af89a05..bef80f0 100644
--- a/services/core/java/com/android/server/wm/DisplayRotation.java
+++ b/services/core/java/com/android/server/wm/DisplayRotation.java
@@ -594,7 +594,8 @@
// In the presence of the PINNED stack or System Alert windows we unfortunately can not
// seamlessly rotate.
- if (mDisplayContent.hasPinnedTask() || mDisplayContent.hasAlertWindowSurfaces()) {
+ if (mDisplayContent.getDefaultTaskDisplayArea().hasPinnedTask()
+ || mDisplayContent.hasAlertWindowSurfaces()) {
return false;
}
diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java
index 007af24..e4e5716 100644
--- a/services/core/java/com/android/server/wm/InsetsPolicy.java
+++ b/services/core/java/com/android/server/wm/InsetsPolicy.java
@@ -295,10 +295,10 @@
}
private boolean forceShowsSystemBarsForWindowingMode() {
- final boolean isDockedStackVisible =
- mDisplayContent.isStackVisible(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
- final boolean isFreeformStackVisible =
- mDisplayContent.isStackVisible(WINDOWING_MODE_FREEFORM);
+ final boolean isDockedStackVisible = mDisplayContent.getDefaultTaskDisplayArea()
+ .isStackVisible(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
+ final boolean isFreeformStackVisible = mDisplayContent.getDefaultTaskDisplayArea()
+ .isStackVisible(WINDOWING_MODE_FREEFORM);
final boolean isResizing = mDisplayContent.getDockedDividerController().isResizing();
// We need to force system bars when the docked stack is visible, when the freeform stack
diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java
index a936e74..57a54d0 100644
--- a/services/core/java/com/android/server/wm/KeyguardController.java
+++ b/services/core/java/com/android/server/wm/KeyguardController.java
@@ -406,11 +406,12 @@
// show on top of the lock screen. In this can we want to dismiss the docked
// stack since it will be complicated/risky to try to put the activity on top
// of the lock screen in the right fullscreen configuration.
- final DisplayContent display = mRootWindowContainer.getDefaultDisplay();
- if (!display.mTaskContainers.isSplitScreenModeActivated()) {
+ final TaskDisplayArea taskDisplayArea = mRootWindowContainer
+ .getDefaultTaskDisplayArea();
+ if (!taskDisplayArea.isSplitScreenModeActivated()) {
return;
}
- display.mTaskContainers.onSplitScreenModeDismissed();
+ taskDisplayArea.onSplitScreenModeDismissed();
}
}
diff --git a/services/core/java/com/android/server/wm/PinnedStackController.java b/services/core/java/com/android/server/wm/PinnedStackController.java
index 66dbfd5..02a2741 100644
--- a/services/core/java/com/android/server/wm/PinnedStackController.java
+++ b/services/core/java/com/android/server/wm/PinnedStackController.java
@@ -286,7 +286,8 @@
}
try {
final Rect animatingBounds = new Rect();
- final ActivityStack pinnedStack = mDisplayContent.getRootPinnedTask();
+ final ActivityStack pinnedStack = mDisplayContent.getDefaultTaskDisplayArea()
+ .getRootPinnedTask();
if (pinnedStack != null) {
pinnedStack.getAnimationOrCurrentBounds(animatingBounds);
}
diff --git a/services/core/java/com/android/server/wm/RecentsAnimation.java b/services/core/java/com/android/server/wm/RecentsAnimation.java
index 08b0abf..a031fe8 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimation.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimation.java
@@ -52,14 +52,14 @@
* cleanup. See {@link com.android.server.wm.RecentsAnimationController}.
*/
class RecentsAnimation implements RecentsAnimationCallbacks,
- DisplayContent.OnStackOrderChangedListener {
+ TaskDisplayArea.OnStackOrderChangedListener {
private static final String TAG = RecentsAnimation.class.getSimpleName();
private final ActivityTaskManagerService mService;
private final ActivityStackSupervisor mStackSupervisor;
private final ActivityStartController mActivityStartController;
private final WindowManagerService mWindowManager;
- private final DisplayContent mDefaultDisplay;
+ private final TaskDisplayArea mDefaultTaskDisplayArea;
private final Intent mTargetIntent;
private final ComponentName mRecentsComponent;
private final @Nullable String mRecentsFeatureId;
@@ -84,7 +84,7 @@
int recentsUid, @Nullable WindowProcessController caller) {
mService = atm;
mStackSupervisor = stackSupervisor;
- mDefaultDisplay = mService.mRootWindowContainer.getDefaultDisplay();
+ mDefaultTaskDisplayArea = mService.mRootWindowContainer.getDefaultTaskDisplayArea();
mActivityStartController = activityStartController;
mWindowManager = wm;
mTargetIntent = targetIntent;
@@ -107,7 +107,7 @@
void preloadRecentsActivity() {
ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS, "Preload recents with %s",
mTargetIntent);
- ActivityStack targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED,
+ ActivityStack targetStack = mDefaultTaskDisplayArea.getStack(WINDOWING_MODE_UNDEFINED,
mTargetActivityType);
ActivityRecord targetActivity = getTargetActivity(targetStack);
if (targetActivity != null) {
@@ -128,7 +128,8 @@
// Create the activity record. Because the activity is invisible, this doesn't really
// start the client.
startRecentsActivityInBackground("preloadRecents");
- targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED, mTargetActivityType);
+ targetStack = mDefaultTaskDisplayArea.getStack(WINDOWING_MODE_UNDEFINED,
+ mTargetActivityType);
targetActivity = getTargetActivity(targetStack);
if (targetActivity == null) {
Slog.w(TAG, "Cannot start " + mTargetIntent);
@@ -176,12 +177,11 @@
}
// If the activity is associated with the recents stack, then try and get that first
- ActivityStack targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED,
+ ActivityStack targetStack = mDefaultTaskDisplayArea.getStack(WINDOWING_MODE_UNDEFINED,
mTargetActivityType);
ActivityRecord targetActivity = getTargetActivity(targetStack);
final boolean hasExistingActivity = targetActivity != null;
if (hasExistingActivity) {
- final TaskDisplayArea taskDisplayArea = targetActivity.getDisplayArea();
mRestoreTargetBehindStack = getStackAbove(targetStack);
if (mRestoreTargetBehindStack == null) {
notifyAnimationCancelBeforeStart(recentsAnimationRunner);
@@ -209,7 +209,7 @@
try {
if (hasExistingActivity) {
// Move the recents activity into place for the animation if it is not top most
- mDefaultDisplay.mTaskContainers.moveStackBehindBottomMostVisibleStack(targetStack);
+ mDefaultTaskDisplayArea.moveStackBehindBottomMostVisibleStack(targetStack);
ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS, "Moved stack=%s behind stack=%s",
targetStack, getStackAbove(targetStack));
@@ -225,10 +225,10 @@
startRecentsActivityInBackground("startRecentsActivity_noTargetActivity");
// Move the recents activity into place for the animation
- targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED,
+ targetStack = mDefaultTaskDisplayArea.getStack(WINDOWING_MODE_UNDEFINED,
mTargetActivityType);
targetActivity = getTargetActivity(targetStack);
- mDefaultDisplay.mTaskContainers.moveStackBehindBottomMostVisibleStack(targetStack);
+ mDefaultTaskDisplayArea.moveStackBehindBottomMostVisibleStack(targetStack);
ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS, "Moved stack=%s behind stack=%s",
targetStack, getStackAbove(targetStack));
@@ -251,7 +251,7 @@
mWindowManager.cancelRecentsAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION,
"startRecentsActivity");
mWindowManager.initializeRecentsAnimation(mTargetActivityType, recentsAnimationRunner,
- this, mDefaultDisplay.getDisplayId(),
+ this, mDefaultTaskDisplayArea.getDisplayId(),
mStackSupervisor.mRecentTasks.getRecentTaskIds(), targetActivity);
// If we updated the launch-behind state, update the visibility of the activities after
@@ -262,7 +262,7 @@
START_TASK_TO_FRONT, targetActivity);
// Register for stack order changes
- mDefaultDisplay.registerStackOrderChangedListener(this);
+ mDefaultTaskDisplayArea.registerStackOrderChangedListener(this);
} catch (Exception e) {
Slog.e(TAG, "Failed to start recents activity", e);
throw e;
@@ -280,7 +280,7 @@
mWindowManager.getRecentsAnimationController(), reorderMode);
// Unregister for stack order changes
- mDefaultDisplay.unregisterStackOrderChangedListener(this);
+ mDefaultTaskDisplayArea.unregisterStackOrderChangedListener(this);
final RecentsAnimationController controller =
mWindowManager.getRecentsAnimationController();
@@ -308,7 +308,7 @@
try {
mWindowManager.cleanupRecentsAnimation(reorderMode);
- final ActivityStack targetStack = mDefaultDisplay.getStack(
+ final ActivityStack targetStack = mDefaultTaskDisplayArea.getStack(
WINDOWING_MODE_UNDEFINED, mTargetActivityType);
// Prefer to use the original target activity instead of top activity because
// we may have moved another task to top (starting 3p launcher).
@@ -422,7 +422,7 @@
@Override
public void onStackOrderChanged(ActivityStack stack) {
ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS, "onStackOrderChanged(): stack=%s", stack);
- if (mDefaultDisplay.getIndexOf(stack) == -1 || !stack.shouldBeVisible(null)) {
+ if (mDefaultTaskDisplayArea.getIndexOf(stack) == -1 || !stack.shouldBeVisible(null)) {
// The stack is not visible, so ignore this change
return;
}
@@ -480,8 +480,8 @@
* @return The top stack that is not always-on-top.
*/
private ActivityStack getTopNonAlwaysOnTopStack() {
- for (int i = mDefaultDisplay.getStackCount() - 1; i >= 0; i--) {
- final ActivityStack s = mDefaultDisplay.getStackAt(i);
+ for (int i = mDefaultTaskDisplayArea.getStackCount() - 1; i >= 0; i--) {
+ final ActivityStack s = mDefaultTaskDisplayArea.getStackAt(i);
if (s.getWindowConfiguration().isAlwaysOnTop()) {
continue;
}
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java
index a30b70d..84229f0 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimationController.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java
@@ -340,9 +340,11 @@
// Make leashes for each of the visible/target tasks and add it to the recents animation to
// be started
- final ArrayList<Task> visibleTasks = mDisplayContent.getVisibleTasks();
- final ActivityStack targetStack = mDisplayContent.getStack(WINDOWING_MODE_UNDEFINED,
- targetActivityType);
+ // TODO(multi-display-area): Support Recents on multiple task display areas
+ final ArrayList<Task> visibleTasks = mDisplayContent.getDefaultTaskDisplayArea()
+ .getVisibleTasks();
+ final ActivityStack targetStack = mDisplayContent.getDefaultTaskDisplayArea()
+ .getStack(WINDOWING_MODE_UNDEFINED, targetActivityType);
if (targetStack != null) {
final PooledConsumer c = PooledLambda.obtainConsumer((t, outList) ->
{ if (!outList.contains(t)) outList.add(t); }, PooledLambda.__(Task.class),
@@ -385,7 +387,8 @@
}
// Save the minimized home height
- mMinimizedHomeBounds = mDisplayContent.getRootHomeTask().getBounds();
+ mMinimizedHomeBounds = mDisplayContent.getDefaultTaskDisplayArea().getRootHomeTask()
+ .getBounds();
mService.mWindowPlacerLocked.performSurfacePlacement();
diff --git a/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java b/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java
index 770c088..32de699 100644
--- a/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java
+++ b/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java
@@ -232,10 +232,11 @@
}
final ActivityTaskManagerService atmService = mTargetStack.mAtmService;
- DisplayContent display = mTargetStack.getDisplay();
- final boolean singleTaskInstanceDisplay = display.isSingleTaskInstance();
+ TaskDisplayArea taskDisplayArea = mTargetStack.getDisplayArea();
+ final boolean singleTaskInstanceDisplay =
+ taskDisplayArea.mDisplayContent.isSingleTaskInstance();
if (singleTaskInstanceDisplay) {
- display = atmService.mRootWindowContainer.getDefaultDisplay();
+ taskDisplayArea = atmService.mRootWindowContainer.getDefaultTaskDisplayArea();
}
final int windowingMode = mTargetStack.getWindowingMode();
@@ -246,7 +247,7 @@
final boolean alwaysCreateTask = DisplayContent.alwaysCreateStack(windowingMode,
activityType);
final Task task = alwaysCreateTask
- ? display.getBottomMostTask() : mTargetStack.getBottomMostTask();
+ ? taskDisplayArea.getBottomMostTask() : mTargetStack.getBottomMostTask();
Task targetTask = null;
if (task != null && r.taskAffinity.equals(task.affinity)) {
// If the activity currently at the bottom has the same task affinity as
@@ -257,7 +258,7 @@
}
if (targetTask == null) {
if (alwaysCreateTask) {
- targetTask = display.mTaskContainers.getOrCreateStack(windowingMode,
+ targetTask = taskDisplayArea.getOrCreateStack(windowingMode,
activityType, false /* onTop */);
} else {
targetTask = mTargetStack.reuseOrCreateTask(r.info, null /*intent*/,
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 2764b12..2eeda4d 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -1369,11 +1369,11 @@
}
calculateDefaultMinimalSizeOfResizeableTasks();
- final DisplayContent defaultDisplay = getDefaultDisplay();
-
- defaultDisplay.mTaskContainers.getOrCreateStack(WINDOWING_MODE_FULLSCREEN,
- ACTIVITY_TYPE_HOME, ON_TOP);
- positionChildAt(POSITION_TOP, defaultDisplay, false /* includingParents */);
+ final TaskDisplayArea defaultTaskDisplayArea = getDefaultTaskDisplayArea();
+ defaultTaskDisplayArea.getOrCreateStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME,
+ ON_TOP);
+ positionChildAt(POSITION_TOP, defaultTaskDisplayArea.mDisplayContent,
+ false /* includingParents */);
}
// TODO(multi-display): Look at all callpoints to make sure they make sense in multi-display.
@@ -1382,6 +1382,16 @@
}
/**
+ * Get the default display area on the device dedicated to app windows. This one should be used
+ * only as a fallback location for activity launches when no target display area is specified,
+ * or for cases when multi-instance is not supported yet (like Split-screen, Freeform, PiP or
+ * Recents).
+ */
+ TaskDisplayArea getDefaultTaskDisplayArea() {
+ return mDefaultDisplay.getDefaultTaskDisplayArea();
+ }
+
+ /**
* Get an existing instance of {@link DisplayContent} that has the given uniqueId. Unique ID is
* defined in {@link DisplayInfo#uniqueId}.
*
@@ -1436,12 +1446,8 @@
return displayContent;
}
- ActivityRecord getDefaultDisplayHomeActivity() {
- return getDefaultDisplayHomeActivityForUser(mCurrentUser);
- }
-
ActivityRecord getDefaultDisplayHomeActivityForUser(int userId) {
- return getDisplayContent(DEFAULT_DISPLAY).mTaskContainers.getHomeActivityForUser(userId);
+ return getDefaultTaskDisplayArea().getHomeActivityForUser(userId);
}
boolean startHomeOnAllDisplays(int userId, String reason) {
@@ -1972,8 +1978,8 @@
final int focusStackId = topFocusedStack != null
? topFocusedStack.getRootTaskId() : INVALID_TASK_ID;
// We dismiss the docked stack whenever we switch users.
- if (getDefaultDisplay().mTaskContainers.isSplitScreenModeActivated()) {
- getDefaultDisplay().mTaskContainers.onSplitScreenModeDismissed();
+ if (getDefaultTaskDisplayArea().isSplitScreenModeActivated()) {
+ getDefaultTaskDisplayArea().onSplitScreenModeDismissed();
}
// Also dismiss the pinned stack whenever we switch users. Removing the pinned stack will
// also cause all tasks to be moved to the fullscreen stack at a position that is
@@ -1995,7 +2001,7 @@
final int restoreStackId = mUserStackInFront.get(userId);
ActivityStack stack = getStack(restoreStackId);
if (stack == null) {
- stack = getDefaultDisplay().mTaskContainers.getOrCreateRootHomeTask();
+ stack = getDefaultTaskDisplayArea().getOrCreateRootHomeTask();
}
final boolean homeInFront = stack.isActivityTypeHome();
if (stack.isOnHomeDisplay()) {
@@ -2018,7 +2024,7 @@
void updateUserStack(int userId, ActivityStack stack) {
if (userId != mCurrentUser) {
if (stack == null) {
- stack = getDefaultDisplay().mTaskContainers.getOrCreateRootHomeTask();
+ stack = getDefaultTaskDisplayArea().getOrCreateRootHomeTask();
}
mUserStackInFront.put(userId, stack.getRootTaskId());
@@ -2061,7 +2067,7 @@
return;
}
- stack.reparent(displayContent.mDisplayContent, onTop);
+ stack.reparent(displayContent.getDefaultTaskDisplayArea(), onTop);
// TODO(multi-display): resize stacks properly if moved from split-screen.
}
@@ -2155,8 +2161,8 @@
// Looking up task on preferred display first
final DisplayContent preferredDisplay = getDisplayContent(preferredDisplayId);
if (preferredDisplay != null) {
- preferredDisplay.mTaskContainers.findTaskLocked(r, true /* isPreferredDisplay */,
- mTmpFindTaskResult);
+ preferredDisplay.getDefaultTaskDisplayArea().findTaskLocked(r,
+ true /* isPreferredDisplay */, mTmpFindTaskResult);
if (mTmpFindTaskResult.mIdealMatch) {
return mTmpFindTaskResult.mRecord;
}
@@ -2168,7 +2174,7 @@
continue;
}
- display.mTaskContainers.findTaskLocked(r, false /* isPreferredDisplay */,
+ display.getDefaultTaskDisplayArea().findTaskLocked(r, false /* isPreferredDisplay */,
mTmpFindTaskResult);
if (mTmpFindTaskResult.mIdealMatch) {
return mTmpFindTaskResult.mRecord;
@@ -2788,8 +2794,10 @@
}
final DisplayContent display = getDisplayContentOrCreate(displayId);
if (display != null) {
- stack = display.mTaskContainers.getOrCreateStack(r, options, candidateTask,
- activityType, onTop);
+ // Falling back to default task container
+ final TaskDisplayArea taskDisplayArea = display.getDefaultTaskDisplayArea();
+ stack = taskDisplayArea.getOrCreateStack(r, options, candidateTask, activityType,
+ onTop);
if (stack != null) {
return stack;
}
@@ -2835,7 +2843,7 @@
if (container == null
|| !canLaunchOnDisplay(r, container.mDisplayContent.mDisplayId)) {
- container = getDefaultDisplay().mTaskContainers;
+ container = getDefaultTaskDisplayArea();
if (windowingMode == WindowConfiguration.WINDOWING_MODE_UNDEFINED) {
windowingMode = container.resolveWindowingMode(r, options, candidateTask,
activityType);
@@ -2887,7 +2895,7 @@
// it to the target display.
if (candidateTask.isRootTask()) {
final ActivityStack stack = candidateTask.getStack();
- displayContent.moveStackToDisplay(stack, true /* onTop */);
+ stack.reparent(displayContent.getDefaultTaskDisplayArea(), true /* onTop */);
return stack;
}
}
@@ -2918,7 +2926,8 @@
final int activityType =
options != null && options.getLaunchActivityType() != ACTIVITY_TYPE_UNDEFINED
? options.getLaunchActivityType() : r.getActivityType();
- return displayContent.createStack(windowingMode, activityType, true /*onTop*/);
+ final TaskDisplayArea taskDisplayArea = displayContent.getDefaultTaskDisplayArea();
+ return taskDisplayArea.createStack(windowingMode, activityType, true /*onTop*/);
}
return null;
@@ -2989,7 +2998,8 @@
if (preferredDisplayArea == null) {
// Stack is currently detached because it is being removed. Use the previous display it
// was on.
- preferredDisplayArea = getDisplayContent(currentFocus.mPrevDisplayId).mTaskContainers;
+ preferredDisplayArea = getDisplayContent(currentFocus.mPrevDisplayId)
+ .getDefaultTaskDisplayArea();
}
final ActivityStack preferredFocusableStack = preferredDisplayArea.getNextFocusableStack(
currentFocus, ignoreCurrent);
@@ -3010,7 +3020,7 @@
// We've already checked this one
continue;
}
- final ActivityStack nextFocusableStack = display.mTaskContainers
+ final ActivityStack nextFocusableStack = display.getDefaultTaskDisplayArea()
.getNextFocusableStack(currentFocus, ignoreCurrent);
if (nextFocusableStack != null) {
return nextFocusableStack;
@@ -3020,31 +3030,6 @@
return null;
}
- /**
- * Get next valid stack for launching provided activity in the system. This will search across
- * displays and stacks in last-focused order for a focusable and visible stack, except those
- * that are on a currently focused display.
- *
- * @param r The activity that is being launched.
- * @param currentFocus The display that previously had focus and thus needs to be ignored when
- * searching for the next candidate.
- * @return Next valid {@link ActivityStack}, null if not found.
- */
- ActivityStack getNextValidLaunchStack(@NonNull ActivityRecord r, int currentFocus) {
- for (int i = getChildCount() - 1; i >= 0; --i) {
- final DisplayContent display = getChildAt(i);
- if (display.mDisplayId == currentFocus) {
- continue;
- }
- final ActivityStack stack = getValidLaunchStackOnDisplay(display.mDisplayId, r,
- null /* options */, null /* launchParams */);
- if (stack != null) {
- return stack;
- }
- }
- return null;
- }
-
boolean handleAppDied(WindowProcessController app) {
boolean hasVisibleActivities = false;
for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index 77ef011..13e4d8b 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -127,6 +127,12 @@
* the new stack becomes resumed after which it will be set to current focused stack.
*/
ActivityStack mLastFocusedStack;
+ /**
+ * All of the stacks on this display. Order matters, topmost stack is in front of all other
+ * stacks, bottommost behind. Accessed directly by ActivityManager package classes. Any calls
+ * changing the list should also call {@link #onStackOrderChanged()}.
+ */
+ private ArrayList<OnStackOrderChangedListener> mStackOrderChangedCallbacks = new ArrayList<>();
TaskDisplayArea(DisplayContent displayContent, WindowManagerService service) {
super(service, Type.ANY, "TaskContainers", FEATURE_TASK_CONTAINER);
@@ -336,9 +342,9 @@
// Since a stack could be repositioned while being one of the child, return
// current index if that's the same stack we are positioning and it is always on
// top.
- final boolean sameStack = mDisplayContent.getStacks().get(i) == stack;
+ final boolean sameStack = mChildren.get(i) == stack;
if ((sameStack && stack.isAlwaysOnTop())
- || (!sameStack && !mDisplayContent.getStacks().get(i).isAlwaysOnTop())) {
+ || (!sameStack && !mChildren.get(i).isAlwaysOnTop())) {
belowAlwaysOnTopPosition = i;
break;
}
@@ -352,7 +358,7 @@
if (stack.isAlwaysOnTop()) {
if (hasPinnedTask()) {
// Always-on-top stacks go below the pinned stack.
- maxPosition = mDisplayContent.getStacks().indexOf(mRootPinnedTask) - 1;
+ maxPosition = mChildren.indexOf(mRootPinnedTask) - 1;
}
// Always-on-top stacks need to be above all other stacks.
minPosition = belowAlwaysOnTopPosition
@@ -375,7 +381,7 @@
targetPosition = Math.min(targetPosition, maxPosition);
targetPosition = Math.max(targetPosition, minPosition);
- int prevPosition = mDisplayContent.getStacks().indexOf(stack);
+ int prevPosition = mChildren.indexOf(stack);
// The positions we calculated above (maxPosition, minPosition) do not take into
// consideration the following edge cases.
// 1) We need to adjust the position depending on the value "adding".
@@ -471,7 +477,7 @@
@Override
int getOrientation(int candidate) {
- if (mDisplayContent.isStackVisible(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY)) {
+ if (isStackVisible(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY)) {
// Apps and their containers are not allowed to specify an orientation while using
// root tasks...except for the home stack if it is not resizable and currently
// visible (top of) its root task.
@@ -637,7 +643,7 @@
mPreferredTopFocusableStack = null;
}
mDisplayContent.releaseSelfIfNeeded();
- mDisplayContent.onStackOrderChanged(stack);
+ onStackOrderChanged(stack);
}
void positionStackAt(int position, ActivityStack child, boolean includingParents) {
@@ -716,7 +722,7 @@
}
}
- mDisplayContent.onStackOrderChanged(stack);
+ onStackOrderChanged(stack);
}
ActivityStack getStack(int rootTaskId) {
@@ -765,11 +771,11 @@
} else if (stack.getParent() != launchRootTask) {
stack.reparent(launchRootTask, position);
}
- } else if (stack.getDisplay() != mDisplayContent || !stack.isRootTask()) {
+ } else if (stack.getDisplayArea() != this || !stack.isRootTask()) {
if (stack.getParent() == null) {
addStack(stack, position);
} else {
- stack.reparent(mDisplayContent, onTop);
+ stack.reparent(this, onTop);
}
}
// Update windowing mode if necessary, e.g. moving a pinned task to fullscreen.
@@ -832,7 +838,7 @@
// Create stack on default display instead since this display can only contain 1 stack.
// TODO: Kinda a hack, but better that having the decision at each call point. Hoping
// this goes away once ActivityView is no longer using virtual displays.
- return mRootWindowContainer.getDefaultDisplay().mTaskContainers.createStack(
+ return mRootWindowContainer.getDefaultTaskDisplayArea().createStack(
windowingMode, activityType, onTop, info, intent, createdByOrganizer);
}
@@ -1551,6 +1557,16 @@
return (index < wc.mChildren.size()) ? (ActivityStack) wc.mChildren.get(index) : null;
}
+ /** Returns true if the stack in the windowing mode is visible. */
+ boolean isStackVisible(int windowingMode) {
+ final ActivityStack stack = getTopStackInWindowingMode(windowingMode);
+ return stack != null && stack.isVisible();
+ }
+
+ void removeStack(ActivityStack stack) {
+ removeChild(stack);
+ }
+
int getDisplayId() {
return mDisplayContent.getDisplayId();
}
@@ -1558,4 +1574,39 @@
boolean isRemoved() {
return mDisplayContent.isRemoved();
}
+
+ /**
+ * Adds a listener to be notified whenever the stack order in the display changes. Currently
+ * only used by the {@link RecentsAnimation} to determine whether to interrupt and cancel the
+ * current animation when the system state changes.
+ */
+ void registerStackOrderChangedListener(OnStackOrderChangedListener listener) {
+ if (!mStackOrderChangedCallbacks.contains(listener)) {
+ mStackOrderChangedCallbacks.add(listener);
+ }
+ }
+
+ /**
+ * Removes a previously registered stack order change listener.
+ */
+ void unregisterStackOrderChangedListener(OnStackOrderChangedListener listener) {
+ mStackOrderChangedCallbacks.remove(listener);
+ }
+
+ /**
+ * Notifies of a stack order change
+ * @param stack The stack which triggered the order change
+ */
+ void onStackOrderChanged(ActivityStack stack) {
+ for (int i = mStackOrderChangedCallbacks.size() - 1; i >= 0; i--) {
+ mStackOrderChangedCallbacks.get(i).onStackOrderChanged(stack);
+ }
+ }
+
+ /**
+ * Callback for when the order of the stacks in the display changes.
+ */
+ interface OnStackOrderChangedListener {
+ void onStackOrderChanged(ActivityStack stack);
+ }
}
diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java
index b641e4c..9ffd8d2 100644
--- a/services/core/java/com/android/server/wm/TaskOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java
@@ -277,7 +277,7 @@
return null;
}
- final Task task = display.mTaskContainers.createStack(windowingMode,
+ final Task task = display.getDefaultTaskDisplayArea().createStack(windowingMode,
ACTIVITY_TYPE_UNDEFINED, false /* onTop */, null /* info */, new Intent(),
true /* createdByOrganizer */);
RunningTaskInfo out = task.getTaskInfo();
diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java
index e43f4b4..b9b6c08 100644
--- a/services/core/java/com/android/server/wm/WallpaperController.java
+++ b/services/core/java/com/android/server/wm/WallpaperController.java
@@ -510,7 +510,7 @@
private void findWallpaperTarget() {
mFindResults.reset();
- if (mDisplayContent.isStackVisible(WINDOWING_MODE_FREEFORM)) {
+ if (mDisplayContent.getDefaultTaskDisplayArea().isStackVisible(WINDOWING_MODE_FREEFORM)) {
// In freeform mode we set the wallpaper as its own target, so we don't need an
// additional window to make it visible.
mFindResults.setUseTopWallpaperAsTarget(true);
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index dfaa0ec..687af64 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -7318,8 +7318,9 @@
@Override
public boolean isStackVisibleLw(int windowingMode) {
- final DisplayContent dc = getDefaultDisplayContentLocked();
- return dc.isStackVisible(windowingMode);
+ // TODO(multi-display-area): Support multiple task display areas & displays
+ final TaskDisplayArea tc = mRoot.getDefaultTaskDisplayArea();
+ return tc.isStackVisible(windowingMode);
}
@Override
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index a332b69..3e2e9be 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -234,7 +234,7 @@
if (task.getParent() != newParent) {
if (newParent == null) {
// Re-parent task to display as a root task.
- dc.moveStackToDisplay(as, hop.getToTop());
+ as.reparent(dc.getDefaultTaskDisplayArea(), hop.getToTop());
} else if (newParent.inMultiWindowMode() && !task.isResizeable()
&& task.isLeafTask()) {
Slog.w(TAG, "Can't support task that doesn't support multi-window mode in"
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index b87d181..8e7585a 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -1516,7 +1516,8 @@
// Some system windows (e.g. "Power off" dialog) don't have a task, but we would still
// associate them with some stack to enable dimming.
final DisplayContent dc = getDisplayContent();
- return mAttrs.type >= FIRST_SYSTEM_WINDOW && dc != null ? dc.getRootHomeTask() : null;
+ return mAttrs.type >= FIRST_SYSTEM_WINDOW
+ && dc != null ? dc.getDefaultTaskDisplayArea().getRootHomeTask() : null;
}
/**
diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java
index 3c2b6ec..7457a1d 100644
--- a/services/core/java/com/android/server/wm/WindowToken.java
+++ b/services/core/java/com/android/server/wm/WindowToken.java
@@ -397,7 +397,8 @@
void assignLayer(SurfaceControl.Transaction t, int layer) {
if (windowType == TYPE_DOCK_DIVIDER) {
// See {@link DisplayContent#mSplitScreenDividerAnchor}
- super.assignRelativeLayer(t, mDisplayContent.getSplitScreenDividerAnchor(), 1);
+ super.assignRelativeLayer(t,
+ mDisplayContent.getDefaultTaskDisplayArea().getSplitScreenDividerAnchor(), 1);
} else if (mRoundedCornerOverlay) {
super.assignLayer(t, WindowManagerPolicy.COLOR_FADE_LAYER + 1);
} else {