diff options
30 files changed, 333 insertions, 374 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 0e13e6c8772a..d1c8448f2a4a 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -31,7 +31,6 @@ import static android.app.ActivityOptions.ANIM_THUMBNAIL_ASPECT_SCALE_UP; import static android.app.ActivityOptions.ANIM_THUMBNAIL_SCALE_DOWN; import static android.app.ActivityOptions.ANIM_THUMBNAIL_SCALE_UP; import static android.app.ActivityOptions.ANIM_UNDEFINED; -import static android.app.ActivityTaskManager.INVALID_STACK_ID; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.OP_PICTURE_IN_PICTURE; @@ -1426,7 +1425,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return null; } ActivityRecord r = token.weakActivity.get(); - if (r == null || r.getActivityStack() == null) { + if (r == null || r.getRootTask() == null) { return null; } return r; @@ -2055,19 +2054,17 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } } - /** - * @return Stack value from current task, null if there is no task. - */ - ActivityStack getActivityStack() { - return task != null ? task.getStack() : null; + /** @return Root task of this activity, null if there is no task. */ + ActivityStack getRootTask() { + return task != null ? (ActivityStack) task.getRootTask() : null; } - int getStackId() { - return getActivityStack() != null ? getActivityStack().mStackId : INVALID_STACK_ID; + int getRootTaskId() { + return task != null ? task.getRootTaskId() : INVALID_TASK_ID; } DisplayContent getDisplay() { - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); return stack != null ? stack.getDisplay() : null; } @@ -2088,7 +2085,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mWmService.mWindowPlacerLocked.requestTraversal(); if (changed && task != null && !occludesParent) { - getActivityStack().convertActivityToTranslucent(this); + getRootTask().convertActivityToTranslucent(this); } // Always ensure visibility if this activity doesn't occlude parent, so the // {@link #returningOptions} of the activity under this one can be applied in @@ -2123,7 +2120,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } boolean isInStackLocked() { - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); return stack != null && stack.isInStackLocked(this) != null; } @@ -2226,7 +2223,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A boolean isCurrentAppLocked = mAtmService.getLockTaskModeState() != LOCK_TASK_MODE_NONE; final DisplayContent display = getDisplay(); - boolean hasPinnedStack = display != null && display.hasPinnedStack(); + boolean hasPinnedStack = display != null && display.hasPinnedTask(); // Don't return early if !isNotLocked, since we want to throw an exception if the activity // is in an incorrect state boolean isNotLockedOrOnKeyguard = !isKeyguardLocked && !isCurrentAppLocked; @@ -2325,7 +2322,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return false; } - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); if (stack == null) { Slog.w(TAG, "moveActivityStackToFront: invalid task or stack: activity=" + this + " task=" + task); @@ -2456,7 +2453,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return FINISH_RESULT_CANCELLED; } - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); final boolean mayAdjustTop = (isState(RESUMED) || stack.mResumedActivity == null) && stack.isFocusedStackOnDisplay(); final boolean shouldAdjustGlobalFocus = mayAdjustTop @@ -2497,7 +2494,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A final DisplayContent display = stack.getDisplay(); next = display.topRunningActivity(); if (next != null) { - display.positionStackAtTop(next.getActivityStack(), + display.positionStackAtTop(next.getRootTask(), false /* includingParents */, "finish-display-top"); } } @@ -2666,13 +2663,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mStackSupervisor.mStoppingActivities.remove(this); mStackSupervisor.mGoingToSleepActivities.remove(this); - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); final DisplayContent display = getDisplay(); // TODO(b/137329632): Exclude current activity when looking for the next one with // DisplayContent#topRunningActivity(). final ActivityRecord next = display.topRunningActivity(); final boolean isLastStackOverEmptyHome = - next == null && stack.isFocusedStackOnDisplay() && display.getHomeStack() != null; + next == null && stack.isFocusedStackOnDisplay() && display.getRootHomeTask() != null; if (isLastStackOverEmptyHome) { // Don't destroy activity immediately if this is the last activity on the display and // the display contains home stack. Although there is no next activity at the moment, @@ -2824,7 +2821,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A boolean safelyDestroy(String reason) { if (isDestroyable()) { if (DEBUG_SWITCH) { - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); Slog.v(TAG_SWITCH, "Safely destroying " + this + " in state " + getState() + " resumed=" + stack.mResumedActivity + " pausing=" + stack.mPausingActivity @@ -3612,7 +3609,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } final boolean isSleeping() { - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); return stack != null ? stack.shouldSleepActivities() : mAtmService.isSleepingLocked(); } @@ -3827,7 +3824,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Notify the pinned stack upon all windows drawn. If there was an animation in // progress then this signal will resume that animation. - final ActivityStack pinnedStack = mDisplayContent.getPinnedStack(); + final ActivityStack pinnedStack = mDisplayContent.getRootPinnedTask(); if (pinnedStack != null) { pinnedStack.onAllWindowsDrawn(); } @@ -4449,7 +4446,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return visibleIgnoringKeyguard; } - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); if (stack == null) { return false; } @@ -4471,7 +4468,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } boolean shouldBeVisible() { - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); if (stack == null) { return false; } @@ -4492,7 +4489,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // If this activity is paused, tell it to now show its window. if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Making visible and scheduling visibility: " + this); - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); try { if (stack.mTranslucentActivityWaiting != null) { updateOptionsLocked(returningOptions); @@ -4578,7 +4575,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (DEBUG_VISIBILITY) { Slog.v(TAG_VISIBILITY, "Resume visible activity, " + this); } - return getActivityStack().resumeTopActivityUncheckedLocked(activeActivity /* prev */, + return getRootTask().resumeTopActivityUncheckedLocked(activeActivity /* prev */, null /* options */); } else if (shouldPauseActivity(activeActivity)) { if (DEBUG_VISIBILITY) { @@ -4643,7 +4640,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A */ private boolean shouldBeResumed(ActivityRecord activeActivity) { return shouldMakeActive(activeActivity) && isFocusable() - && getActivityStack().getVisibility(activeActivity) == STACK_VISIBILITY_VISIBLE + && getRootTask().getVisibility(activeActivity) == STACK_VISIBILITY_VISIBLE && canResumeByCompat(); } @@ -4672,7 +4669,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // ActivityStack#ensureActivitiesVisible will bring the activity to a proper // active state. if (!isState(STARTED, RESUMED, PAUSED, STOPPED, STOPPING) - || getActivityStack().mTranslucentActivityWaiting != null) { + || getRootTask().mTranslucentActivityWaiting != null) { return false; } @@ -4769,7 +4766,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mStackSupervisor.reportResumedActivityLocked(this); resumeKeyDispatchingLocked(); - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); mStackSupervisor.mNoAnimActivities.clear(); // Mark the point when the activity is resuming @@ -4862,7 +4859,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A void stopIfPossible() { if (DEBUG_SWITCH) Slog.d(TAG_SWITCH, "Stopping: " + this); - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); if (isNoHistory()) { if (!finishing) { if (!stack.shouldSleepActivities()) { @@ -4919,7 +4916,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A void activityStopped(Bundle newIcicle, PersistableBundle newPersistentState, CharSequence description) { - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); final boolean isStopping = mState == STOPPING; if (!isStopping && mState != RESTARTING_PROCESS) { Slog.i(TAG, "Activity reported stop, but no longer stopping: " + this); @@ -4969,7 +4966,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mStackSupervisor.mStoppingActivities.add(this); } - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); // If we already have a few activities waiting to stop, then give up on things going idle // and start clearing them out. Or if r is the last of activity of the last task the stack // will be empty and must be cleared immediately. @@ -5005,7 +5002,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return false; } - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); if (stack == null) { return false; } @@ -5021,7 +5018,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A void finishLaunchTickingLocked() { launchTickTime = 0; - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); if (stack == null) { return; } @@ -5491,13 +5488,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A static ActivityRecord isInStackLocked(IBinder token) { final ActivityRecord r = ActivityRecord.forTokenLocked(token); - return (r != null) ? r.getActivityStack().isInStackLocked(r) : null; + return (r != null) ? r.getRootTask().isInStackLocked(r) : null; } static ActivityStack getStackLocked(IBinder token) { final ActivityRecord r = ActivityRecord.isInStackLocked(token); if (r != null) { - return r.getActivityStack(); + return r.getRootTask(); } return null; } @@ -5507,7 +5504,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A * {@link android.view.Display#INVALID_DISPLAY} if not attached. */ int getDisplayId() { - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); if (stack == null) { return INVALID_DISPLAY; } @@ -5519,7 +5516,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // This would be redundant. return false; } - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); if (isState(RESUMED) || stack == null || this == stack.mPausingActivity || !mHaveState || !stopped) { // We're not ready for this kind of thing. @@ -6715,7 +6712,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A void savePinnedStackBounds() { // Leaving PiP to fullscreen, save the snap fraction based on the pre-animation bounds // for the next re-entry into PiP (assuming the activity is not hidden or destroyed) - final ActivityStack pinnedStack = mDisplayContent.getPinnedStack(); + final ActivityStack pinnedStack = mDisplayContent.getRootPinnedTask(); if (pinnedStack == null) return; final Rect stackBounds; if (pinnedStack.lastAnimatingBoundsWasToFullscreen()) { @@ -6755,7 +6752,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A private void applyAspectRatio(Rect outBounds, Rect containingAppBounds, Rect containingBounds) { final float maxAspectRatio = info.maxAspectRatio; - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); final float minAspectRatio = info.minAspectRatio; if (task == null || stack == null || (inMultiWindowMode() && !shouldUseSizeCompatMode()) @@ -6861,7 +6858,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A */ boolean ensureActivityConfiguration(int globalChanges, boolean preserveWindow, boolean ignoreVisibility) { - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); if (stack.mConfigWillChange) { if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, "Skipping config check (will change): " + this); @@ -7406,7 +7403,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (!getTurnScreenOnFlag()) { return false; } - final ActivityStack stack = getActivityStack(); + final ActivityStack stack = getRootTask(); return stack != null && stack.checkKeyguardVisibility(this, true /* shouldBeVisible */, true /* isTop */); } diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 60e0f51ef0a0..942be8409db2 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -277,9 +277,6 @@ class ActivityStack extends Task implements BoundsAnimationTarget { int mCurrentUser; - /** Unique identifier */ - final int mStackId; - /** For comparison with DisplayContent bounds. */ private Rect mTmpRect = new Rect(); private Rect mTmpRect2 = new Rect(); @@ -633,7 +630,6 @@ class ActivityStack extends Task implements BoundsAnimationTarget { _realActivitySuspended, userSetupComplete, minWidth, minHeight, info, _voiceSession, _voiceInteractor, stack); - mStackId = mTaskId; mDockedStackMinimizeThickness = mWmService.mContext.getResources().getDimensionPixelSize( com.android.internal.R.dimen.docked_stack_minimize_thickness); EventLogTags.writeWmStackCreated(id); @@ -732,11 +728,11 @@ class ActivityStack extends Task implements BoundsAnimationTarget { setBounds(newBounds); newBounds.set(newBounds); } else if (overrideWindowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY) { - Rect dockedBounds = display.getSplitScreenPrimaryStack().getBounds(); + Rect dockedBounds = display.getRootSplitScreenPrimaryTask().getBounds(); final boolean isMinimizedDock = display.mDisplayContent.getDockedDividerController().isMinimizedDock(); if (isMinimizedDock) { - Task topTask = display.getSplitScreenPrimaryStack().getTopMostTask(); + Task topTask = display.getRootSplitScreenPrimaryTask().getTopMostTask(); if (topTask != null) { dockedBounds = topTask.getBounds(); } @@ -830,7 +826,7 @@ class ActivityStack extends Task implements BoundsAnimationTarget { final int currentOverrideMode = getRequestedOverrideWindowingMode(); final DisplayContent display = getDisplay(); final Task topTask = getTopMostTask(); - final ActivityStack splitScreenStack = display.getSplitScreenPrimaryStack(); + final ActivityStack splitScreenStack = display.getRootSplitScreenPrimaryTask(); int windowingMode = preferredWindowingMode; if (preferredWindowingMode == WINDOWING_MODE_UNDEFINED && isTransientWindowingMode(currentMode)) { @@ -851,7 +847,7 @@ class ActivityStack extends Task implements BoundsAnimationTarget { windowingMode = mRestoreOverrideWindowingMode; } - final boolean alreadyInSplitScreenMode = display.hasSplitScreenPrimaryStack(); + final boolean alreadyInSplitScreenMode = display.hasSplitScreenPrimaryTask(); // Don't send non-resizeable notifications if the windowing mode changed was a side effect // of us entering split-screen mode. @@ -868,7 +864,7 @@ class ActivityStack extends Task implements BoundsAnimationTarget { // warning toast about it. mAtmService.getTaskChangeNotificationController() .notifyActivityDismissingDockedStack(); - final ActivityStack primarySplitStack = display.getSplitScreenPrimaryStack(); + final ActivityStack primarySplitStack = display.getRootSplitScreenPrimaryTask(); primarySplitStack.setWindowingModeInSurfaceTransaction(WINDOWING_MODE_UNDEFINED, false /* animate */, false /* showRecents */, false /* enteringSplitScreenMode */, true /* deferEnsuringVisibility */, @@ -1118,7 +1114,7 @@ class ActivityStack extends Task implements BoundsAnimationTarget { return null; } final Task task = r.getTask(); - final ActivityStack stack = r.getActivityStack(); + final ActivityStack stack = r.getRootTask(); if (stack != null && task.mChildren.contains(r) && mChildren.contains(task)) { if (stack != this) Slog.w(TAG, "Illegal state! task does not point to stack it is in."); @@ -1165,7 +1161,7 @@ class ActivityStack extends Task implements BoundsAnimationTarget { final ActivityStack topFullScreenStack = display.getTopStackInWindowingMode(WINDOWING_MODE_FULLSCREEN); if (topFullScreenStack != null) { - final ActivityStack primarySplitScreenStack = display.getSplitScreenPrimaryStack(); + final ActivityStack primarySplitScreenStack = display.getRootSplitScreenPrimaryTask(); if (display.getIndexOf(topFullScreenStack) > display.getIndexOf(primarySplitScreenStack)) { primarySplitScreenStack.moveToFront(reason + " splitScreenToTop"); @@ -1347,7 +1343,7 @@ class ActivityStack extends Task implements BoundsAnimationTarget { private boolean containsActivityFromStack(List<ActivityRecord> rs) { for (ActivityRecord r : rs) { - if (r.getActivityStack() == this) { + if (r.getRootTask() == this) { return true; } } @@ -1563,7 +1559,7 @@ class ActivityStack extends Task implements BoundsAnimationTarget { // focus). Also if there is an active pinned stack - we always want to notify it about // task stack changes, because its positioning may depend on it. if (mStackSupervisor.mAppVisibilitiesChangedSinceLastPause - || (getDisplay() != null && getDisplay().hasPinnedStack())) { + || (getDisplay() != null && getDisplay().hasPinnedTask())) { mAtmService.getTaskChangeNotificationController().notifyTaskStackChanged(); mStackSupervisor.mAppVisibilitiesChangedSinceLastPause = false; } @@ -1873,7 +1869,7 @@ class ActivityStack extends Task implements BoundsAnimationTarget { final DisplayContent displayContent = getDisplay(); if (displayContent == null) { throw new IllegalStateException("Stack is not attached to any display, stackId=" - + mStackId); + + getRootTaskId()); } final int flags = displayContent.mDisplay.getFlags(); @@ -2592,7 +2588,7 @@ class ActivityStack extends Task implements BoundsAnimationTarget { return false; } final ActivityStack targetStack = toFrontTask != null - ? toFrontTask.getStack() : toFrontActivity.getActivityStack(); + ? toFrontTask.getStack() : toFrontActivity.getRootTask(); if (targetStack != null && targetStack.isActivityTypeAssistant()) { // Ensure the task/activity being brought forward is not the assistant return false; @@ -3073,7 +3069,7 @@ class ActivityStack extends Task implements BoundsAnimationTarget { } ActivityRecord topActivity = getDisplay().topRunningActivity(); - ActivityStack topStack = topActivity.getActivityStack(); + ActivityStack topStack = topActivity.getRootTask(); if (topStack != null && topStack != this && topActivity.isState(RESUMED)) { // The new top activity is already resumed, so there's a good chance that nothing will // get resumed below. So, update visibility now in case the transition is closed @@ -3102,7 +3098,7 @@ class ActivityStack extends Task implements BoundsAnimationTarget { return; } - Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "stack.resize_" + mStackId); + Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "stack.resize_" + getRootTaskId()); mAtmService.deferWindowLayout(); try { // Update override configurations of all tasks in the stack. @@ -3219,7 +3215,7 @@ class ActivityStack extends Task implements BoundsAnimationTarget { boolean dump(FileDescriptor fd, PrintWriter pw, boolean dumpAll, boolean dumpClient, String dumpPackage, boolean needSep) { - pw.println(" Stack #" + mStackId + pw.println(" Stack #" + getRootTaskId() + ": type=" + activityTypeToString(getActivityType()) + " mode=" + windowingModeToString(getWindowingMode())); pw.println(" isSleeping=" + shouldSleepActivities()); @@ -4484,7 +4480,7 @@ class ActivityStack extends Task implements BoundsAnimationTarget { @Override void dump(PrintWriter pw, String prefix, boolean dumpAll) { - pw.println(prefix + "mStackId=" + mStackId); + pw.println(prefix + "mStackId=" + getRootTaskId()); pw.println(prefix + "mDeferRemoval=" + mDeferRemoval); pw.println(prefix + "mBounds=" + getRawBounds().toShortString()); if (mMinimizeAmount != 0f) { @@ -4515,14 +4511,6 @@ class ActivityStack extends Task implements BoundsAnimationTarget { mAnimatingActivityRegistry.dump(pw, "AnimatingApps:", prefix); } - String getName() { - return toShortString(); - } - - public String toShortString() { - return "Stack=" + mStackId; - } - /** * For docked workspace (or workspace that's side-by-side to the docked), provides * information which side of the screen was the dock anchored. @@ -4731,7 +4719,7 @@ class ActivityStack extends Task implements BoundsAnimationTarget { // activity early for the recents animation prior to the PiP animation starting, there // is no subsequent all-drawn signal. In this case, we can skip the pause when the home // stack is already visible and drawn. - final ActivityStack homeStack = mDisplayContent.getHomeStack(); + final ActivityStack homeStack = mDisplayContent.getRootHomeTask(); if (homeStack == null) { return true; } @@ -4863,7 +4851,7 @@ class ActivityStack extends Task implements BoundsAnimationTarget { @WindowTraceLogLevel int logLevel) { final long token = proto.start(fieldId); dumpDebugInnerStackOnly(proto, STACK, logLevel); - proto.write(com.android.server.am.ActivityStackProto.ID, mStackId); + proto.write(com.android.server.am.ActivityStackProto.ID, getRootTaskId()); forAllTasks((t) -> { t.dumpDebugInner(proto, com.android.server.am.ActivityStackProto.TASKS, logLevel); @@ -4891,7 +4879,7 @@ class ActivityStack extends Task implements BoundsAnimationTarget { final long token = proto.start(fieldId); super.dumpDebug(proto, WINDOW_CONTAINER, logLevel); - proto.write(StackProto.ID, mStackId); + proto.write(StackProto.ID, getRootTaskId()); forAllTasks((t) -> { t.dumpDebugInnerTaskOnly(proto, StackProto.TASKS, logLevel); }, true /* traverseTopToBottom */, this); diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java index f2ce7e86bc3b..2c0f3e65f198 100644 --- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java @@ -824,7 +824,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { false /* markFrozenIfConfigChanged */, true /* deferResume */); } - if (r.getActivityStack().checkKeyguardVisibility(r, true /* shouldBeVisible */, + if (r.getRootTask().checkKeyguardVisibility(r, true /* shouldBeVisible */, true /* isTop */) && r.allowMoveToFront()) { // We only set the visibility to true if the activity is not being launched in // background, and is allowed to be visible based on keyguard state. This avoids @@ -1582,7 +1582,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { } final ActivityStack stack = - mRootWindowContainer.getDefaultDisplay().getSplitScreenPrimaryStack(); + mRootWindowContainer.getDefaultDisplay().getRootSplitScreenPrimaryTask(); if (stack == null) { Slog.w(TAG, "resizeDockedStackLocked: docked stack not found"); return; @@ -1670,7 +1670,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { void resizePinnedStackLocked(Rect pinnedBounds, Rect tempPinnedTaskBounds) { // TODO(multi-display): The display containing the stack should be passed in. final ActivityStack stack = - mRootWindowContainer.getDefaultDisplay().getPinnedStack(); + mRootWindowContainer.getDefaultDisplay().getRootPinnedTask(); if (stack == null) { Slog.w(TAG, "resizePinnedStackLocked: pinned stack not found"); return; @@ -1891,13 +1891,13 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { // TODO: Look into changing users to this method to DisplayContent.resolveWindowingMode() ActivityStack getReparentTargetStack(Task task, ActivityStack stack, boolean toTop) { final ActivityStack prevStack = task.getStack(); - final int stackId = stack.mStackId; + final int rootTaskId = stack.mTaskId; final boolean inMultiWindowMode = stack.inMultiWindowMode(); // Check that we aren't reparenting to the same stack that the task is already in - if (prevStack != null && prevStack.mStackId == stackId) { + if (prevStack != null && prevStack.mTaskId == rootTaskId) { Slog.w(TAG, "Can not reparent to same stack, task=" + task - + " already in stackId=" + stackId); + + " already in stackId=" + rootTaskId); return prevStack; } @@ -1912,7 +1912,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { // multi-display. if (stack.getDisplayId() != DEFAULT_DISPLAY && !mService.mSupportsMultiDisplay) { throw new IllegalArgumentException("Device doesn't support multi-display, can not" - + " reparent task=" + task + " to stackId=" + stackId); + + " reparent task=" + task + " to stackId=" + rootTaskId); } // Ensure that we aren't trying to move into a freeform stack without freeform support @@ -1993,7 +1993,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { void activitySleptLocked(ActivityRecord r) { mGoingToSleepActivities.remove(r); - final ActivityStack s = r.getActivityStack(); + final ActivityStack s = r.getRootTask(); if (s != null) { s.checkReadyForSleep(); } else { @@ -2029,7 +2029,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { // A resumed activity cannot be stopping. remove from list mStoppingActivities.remove(r); - final ActivityStack stack = r.getActivityStack(); + final ActivityStack stack = r.getRootTask(); if (stack.getDisplay().allResumedActivitiesComplete()) { mRootWindowContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS); // Make sure activity & window visibility should be identical @@ -2082,7 +2082,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { if (DEBUG_STATES) Slog.v(TAG, "Stopping " + s + ": nowVisible=" + s.nowVisible + " animating=" + animating + " finishing=" + s.finishing); - final ActivityStack stack = s.getActivityStack(); + final ActivityStack stack = s.getRootTask(); final boolean shouldSleepOrShutDown = stack != null ? stack.shouldSleepOrShutDownActivities() : mService.isSleepingOrShuttingDownLocked(); @@ -2395,7 +2395,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { final boolean isSecondaryDisplayPreferred = (preferredDisplayId != DEFAULT_DISPLAY && preferredDisplayId != INVALID_DISPLAY); final boolean inSplitScreenMode = actualStack != null - && actualStack.getDisplay().hasSplitScreenPrimaryStack(); + && actualStack.getDisplay().hasSplitScreenPrimaryTask(); if (((!inSplitScreenMode && preferredWindowingMode != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) && !isSecondaryDisplayPreferred) || !task.isActivityTypeStandardOrUndefined()) { return; @@ -2444,7 +2444,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { // we need to move it to top of fullscreen stack, otherwise it will be covered. final ActivityStack dockedStack = - task.getStack().getDisplay().getSplitScreenPrimaryStack(); + task.getStack().getDisplay().getRootSplitScreenPrimaryTask(); if (dockedStack != null) { // Display a warning toast that we tried to put an app that doesn't support // split-screen in split-screen. @@ -2473,7 +2473,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { final ActivityRecord r = ActivityRecord.isInStackLocked(token); if (r != null) { r.finishRelaunching(); - if (r.getActivityStack().shouldSleepOrShutDownActivities()) { + if (r.getRootTask().shouldSleepOrShutDownActivities()) { r.setSleeping(true, true); } } diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 6587226b14d7..26812f462b3f 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -937,7 +937,7 @@ class ActivityStarter { } final ActivityStack resultStack = resultRecord == null - ? null : resultRecord.getActivityStack(); + ? null : resultRecord.getRootTask(); if (err != START_SUCCESS) { if (resultRecord != null) { @@ -1365,7 +1365,7 @@ class ActivityStarter { break; case WINDOWING_MODE_SPLIT_SCREEN_PRIMARY: final ActivityStack homeStack = - startedActivityStack.getDisplay().getHomeStack(); + startedActivityStack.getDisplay().getRootHomeTask(); if (homeStack != null && homeStack.shouldBeVisible(null /* starting */)) { mService.mWindowManager.showRecentApps(); } @@ -1425,7 +1425,7 @@ class ActivityStarter { * @return the stack where the successful started activity resides. */ private @Nullable ActivityStack handleStartResult(@NonNull ActivityRecord started, int result) { - final ActivityStack currentStack = started.getActivityStack(); + final ActivityStack currentStack = started.getRootTask(); ActivityStack startedActivityStack = currentStack != null ? currentStack : mTargetStack; if (ActivityManager.isStartResultSuccessful(result)) { @@ -1446,7 +1446,7 @@ class ActivityStarter { // If we are not able to proceed, disassociate the activity from the task. Leaving an // activity in an incomplete state can lead to issues, such as performing operations // without a window container. - final ActivityStack stack = mStartActivity.getActivityStack(); + final ActivityStack stack = mStartActivity.getRootTask(); if (stack != null) { mStartActivity.finishIfPossible("startActivity", true /* oomAdj */); } @@ -2231,7 +2231,7 @@ class ActivityStarter { return; } if (!mSourceRecord.finishing) { - mSourceStack = mSourceRecord.getActivityStack(); + mSourceStack = mSourceRecord.getRootTask(); return; } @@ -2314,7 +2314,7 @@ class ActivityStarter { * @return {@link ActivityRecord} brought to front. */ private void setTargetStackIfNeeded(ActivityRecord intentActivity) { - mTargetStack = intentActivity.getActivityStack(); + mTargetStack = intentActivity.getRootTask(); mTargetStack.mLastPausedActivity = null; // If the target task is not in the front, then we need to bring it to the front... // except... well, with SINGLE_TASK_LAUNCH it's not entirely clear. We'd like to have @@ -2371,7 +2371,7 @@ class ActivityStarter { } // Need to update mTargetStack because if task was moved out of it, the original stack may // be destroyed. - mTargetStack = intentActivity.getActivityStack(); + mTargetStack = intentActivity.getRootTask(); mSupervisor.handleNonResizableTaskIfNeeded(intentActivity.getTask(), WINDOWING_MODE_UNDEFINED, DEFAULT_DISPLAY, mTargetStack); } @@ -2422,10 +2422,11 @@ class ActivityStarter { return; } - final ActivityStack stack = task.getStack(); - if (stack != null && stack.inPinnedWindowingMode()) { - mService.animateResizePinnedStack(stack.mStackId, bounds, -1); + final Task rootTask = task.getRootTask(); + if (rootTask != null && rootTask.inPinnedWindowingMode()) { + mService.animateResizePinnedStack(rootTask.mTaskId, bounds, -1); } else { + // TODO: I don't believe it is possible to reach this else condition anymore... task.setBounds(bounds); } } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 8491bc2c4756..31b7c688d685 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -1612,7 +1612,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { if (mController != null) { // Find the first activity that is not finishing. final ActivityRecord next = - r.getActivityStack().topRunningActivity(token, INVALID_TASK_ID); + r.getRootTask().topRunningActivity(token, INVALID_TASK_ID); if (next != null) { // ask watcher if this is allowed boolean resumeOK = true; @@ -2037,7 +2037,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { synchronized (mGlobalLock) { ActivityRecord r = mRootWindowContainer.isInAnyStack(token); if (r != null) { - r.getActivityStack().notifyActivityDrawnLocked(r); + r.getRootTask().notifyActivityDrawnLocked(r); } } } @@ -2073,7 +2073,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { synchronized (mGlobalLock) { ActivityStack focusedStack = getTopDisplayFocusedStack(); if (focusedStack != null) { - return mRootWindowContainer.getStackInfo(focusedStack.mStackId); + return mRootWindowContainer.getStackInfo(focusedStack.mTaskId); } return null; } @@ -2175,7 +2175,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { synchronized (mGlobalLock) { final ActivityRecord srec = ActivityRecord.forTokenLocked(token); if (srec != null) { - return srec.getActivityStack().shouldUpRecreateTaskLocked(srec, destAffinity); + return srec.getRootTask().shouldUpRecreateTaskLocked(srec, destAffinity); } } return false; @@ -2188,7 +2188,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { synchronized (mGlobalLock) { final ActivityRecord r = ActivityRecord.forTokenLocked(token); if (r != null) { - return r.getActivityStack().navigateUpTo( + return r.getRootTask().navigateUpTo( r, destIntent, resultCode, resultData); } return false; @@ -2354,7 +2354,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { if (r == null) { return; } - ActivityStack stack = r.getActivityStack(); + ActivityStack stack = r.getRootTask(); if (stack != null && stack.isSingleTaskInstance()) { // Single-task stacks are used for activities which are presented in floating // windows above full screen activities. Instead of directly finishing the @@ -2582,7 +2582,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { r, resultWho, requestCode); // TODO: This should probably only loop over the task since you need to be in the // same task to return results. - r.getActivityStack().forAllActivities(c); + r.getRootTask().forAllActivities(c); c.recycle(); updateOomAdj(); @@ -3215,7 +3215,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { + ainfo.applicationInfo.uid + ", calling uid=" + callingUid); } - final ActivityStack stack = r.getActivityStack(); + final ActivityStack stack = r.getRootTask(); final Task task = stack.createTask( mStackSupervisor.getNextTaskIdForUser(r.mUserId), ainfo, intent, !ON_TOP); if (!mRecentTasks.addToBottom(task)) { @@ -3551,7 +3551,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { + token); } - final ActivityStack stack = r.getActivityStack(); + final ActivityStack stack = r.getRootTask(); if (stack == null) { throw new IllegalStateException("toggleFreeformWindowingMode: the activity " + "doesn't have a stack"); @@ -4080,7 +4080,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { try { synchronized (mGlobalLock) { final ActivityStack stack = - mRootWindowContainer.getDefaultDisplay().getSplitScreenPrimaryStack(); + mRootWindowContainer.getDefaultDisplay().getRootSplitScreenPrimaryTask(); if (stack == null) { Slog.w(TAG, "dismissSplitScreenMode: primary split-screen stack not found."); return; @@ -4121,7 +4121,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { try { synchronized (mGlobalLock) { final ActivityStack stack = - mRootWindowContainer.getDefaultDisplay().getPinnedStack(); + mRootWindowContainer.getDefaultDisplay().getRootPinnedTask(); if (stack == null) { Slog.w(TAG, "dismissPip: pinned stack not found."); return; @@ -4235,14 +4235,14 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } private boolean isInPictureInPictureMode(ActivityRecord r) { - if (r == null || r.getActivityStack() == null || !r.inPinnedWindowingMode() - || r.getActivityStack().isInStackLocked(r) == null) { + if (r == null || r.getRootTask() == null || !r.inPinnedWindowingMode() + || r.getRootTask().isInStackLocked(r) == null) { return false; } // If we are animating to fullscreen then we have already dispatched the PIP mode // changed, so we should reflect that check here as well. - final ActivityStack taskStack = r.getActivityStack(); + final ActivityStack taskStack = r.getRootTask(); return !taskStack.isAnimatingBoundsToFullscreen(); } @@ -4281,7 +4281,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { r.pictureInPictureArgs.getSourceRectHint()); mRootWindowContainer.moveActivityToPinnedStack( r, sourceBounds, aspectRatio, "enterPictureInPictureMode"); - final ActivityStack stack = r.getActivityStack(); + final ActivityStack stack = r.getRootTask(); stack.setPictureInPictureAspectRatio(aspectRatio); stack.setPictureInPictureActions(actions); MetricsLoggerWrapper.logPictureInPictureEnter(mContext, @@ -4326,7 +4326,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { // If the activity is already in picture-in-picture, update the pinned stack now // if it is not already expanding to fullscreen. Otherwise, the arguments will // be used the next time the activity enters PiP - final ActivityStack stack = r.getActivityStack(); + final ActivityStack stack = r.getRootTask(); if (!stack.isAnimatingBoundsToFullscreen()) { stack.setPictureInPictureAspectRatio( r.pictureInPictureArgs.getAspectRatio()); @@ -4923,7 +4923,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { Slog.i(TAG, "Moving " + r.shortComponentName + " from display " + r.getDisplayId() + " to main display for VR"); mRootWindowContainer.moveStackToDisplay( - r.getStackId(), DEFAULT_DISPLAY, true /* toTop */); + r.getRootTaskId(), DEFAULT_DISPLAY, true /* toTop */); } mH.post(() -> { if (!mVrController.onVrModeChanged(r)) { @@ -6752,7 +6752,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { int requestCode, int resultCode, Intent data) { synchronized (mGlobalLock) { final ActivityRecord r = ActivityRecord.isInStackLocked(activityToken); - if (r != null && r.getActivityStack() != null) { + if (r != null && r.getRootTask() != null) { r.sendResult(callingUid, resultWho, requestCode, resultCode, data); } } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index dbc99114c031..825f93cde52b 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -19,6 +19,7 @@ package com.android.server.wm; import static android.app.ActivityTaskManager.INVALID_STACK_ID; import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.app.WindowConfiguration.ROTATION_UNDEFINED; @@ -294,7 +295,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo /** The containers below are the only child containers {@link #mWindowContainers} can have. */ // Contains all window containers that are related to apps (Activities) - private final TaskStackContainers mTaskStackContainers = new TaskStackContainers(mWmService); + private final TaskContainers mTaskContainers = new TaskContainers(mWmService); // Contains all non-app window containers that should be displayed above the app containers // (e.g. Status bar) private final AboveAppWindowContainers mAboveAppWindowsContainers = @@ -1933,39 +1934,25 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo return (mDisplay.getFlags() & FLAG_PRIVATE) != 0; } - ActivityStack getHomeStack() { - return mTaskStackContainers.getHomeStack(); + ActivityStack getRootHomeTask() { + return mTaskContainers.getRootHomeTask(); } - ActivityStack getRecentsStack() { - return mTaskStackContainers.getRecentsStack(); + /** @return The primary split-screen task, and {@code null} otherwise. */ + ActivityStack getRootSplitScreenPrimaryTask() { + return mTaskContainers.getRootSplitScreenPrimaryTask(); } - /** - * @return The primary split-screen stack, and {@code null} otherwise. - */ - ActivityStack getSplitScreenPrimaryStack() { - return mTaskStackContainers.getSplitScreenPrimaryStack(); - } - - boolean hasSplitScreenPrimaryStack() { - return getSplitScreenPrimaryStack() != null; - } - - /** - * Like {@link #getSplitScreenPrimaryStack}, but also returns the stack if it's currently - * not visible. - */ - ActivityStack getSplitScreenPrimaryStackIgnoringVisibility() { - return mTaskStackContainers.getSplitScreenPrimaryStack(); + boolean hasSplitScreenPrimaryTask() { + return getRootSplitScreenPrimaryTask() != null; } - ActivityStack getPinnedStack() { - return mTaskStackContainers.getPinnedStack(); + ActivityStack getRootPinnedTask() { + return mTaskContainers.getRootPinnedTask(); } - boolean hasPinnedStack() { - return mTaskStackContainers.getPinnedStack() != null; + boolean hasPinnedTask() { + return mTaskContainers.getRootPinnedTask() != null; } /** @@ -1981,45 +1968,45 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo * activity type. Null is no compatible stack on the display. */ ActivityStack getStack(int windowingMode, int activityType) { - return mTaskStackContainers.getStack(windowingMode, activityType); + return mTaskContainers.getStack(windowingMode, activityType); } protected int getStackCount() { - return mTaskStackContainers.mChildren.size(); + return mTaskContainers.mChildren.size(); } protected ActivityStack getStackAt(int index) { - return mTaskStackContainers.mChildren.get(index); + return mTaskContainers.mChildren.get(index); } int getIndexOf(ActivityStack stack) { - return mTaskStackContainers.getIndexOf(stack); + return mTaskContainers.getIndexOf(stack); } void removeStack(ActivityStack stack) { - mTaskStackContainers.removeChild(stack); + mTaskContainers.removeChild(stack); } @VisibleForTesting WindowList<ActivityStack> getStacks() { - return mTaskStackContainers.mChildren; + return mTaskContainers.mChildren; } @VisibleForTesting ActivityStack getTopStack() { - return mTaskStackContainers.getTopStack(); + return mTaskContainers.getTopStack(); } ArrayList<Task> getVisibleTasks() { - return mTaskStackContainers.getVisibleTasks(); + return mTaskContainers.getVisibleTasks(); } SurfaceControl getSplitScreenDividerAnchor() { - return mTaskStackContainers.getSplitScreenDividerAnchor(); + return mTaskContainers.getSplitScreenDividerAnchor(); } void onStackWindowingModeChanged(ActivityStack stack) { - mTaskStackContainers.onStackWindowingModeChanged(stack); + mTaskContainers.onStackWindowingModeChanged(stack); } /** @@ -2052,7 +2039,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo // If there was no pinned stack, we still need to notify the controller of the display info // update as a result of the config change. - if (mPinnedStackControllerLocked != null && !hasPinnedStack()) { + if (mPinnedStackControllerLocked != null && !hasPinnedTask()) { mPinnedStackControllerLocked.onDisplayInfoChanged(getDisplayInfo()); } } @@ -2139,7 +2126,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } // Top system windows are not requesting an orientation. Start searching from apps. - return mTaskStackContainers.getOrientation(); + return mTaskContainers.getOrientation(); } void updateDisplayInfo() { @@ -2323,11 +2310,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo void setStackOnDisplay(ActivityStack stack, int position) { if (DEBUG_STACK) Slog.d(TAG_WM, "Set stack=" + stack + " on displayId=" + mDisplayId); - mTaskStackContainers.addChild(stack, position); + mTaskContainers.addChild(stack, position); } void moveStackToDisplay(ActivityStack stack, boolean onTop) { - stack.reparent(mTaskStackContainers, onTop ? POSITION_TOP: POSITION_BOTTOM); + stack.reparent(mTaskContainers, onTop ? POSITION_TOP: POSITION_BOTTOM); } @Override @@ -2364,7 +2351,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } void positionStackAt(int position, ActivityStack child, boolean includingParents) { - mTaskStackContainers.positionChildAt(position, child, includingParents); + mTaskContainers.positionChildAt(position, child, includingParents); layoutAndAssignWindowLayersIfNeeded(); } @@ -2395,7 +2382,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo */ Task findTaskForResizePoint(int x, int y) { final int delta = dipToPixel(RESIZE_HANDLE_WIDTH_IN_DP, mDisplayMetrics); - return mTmpTaskForResizePointSearchResult.process(mTaskStackContainers, x, y, delta); + return mTmpTaskForResizePointSearchResult.process(mTaskContainers, x, y, delta); } void updateTouchExcludeRegion() { @@ -2411,7 +2398,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo final PooledConsumer c = PooledLambda.obtainConsumer( DisplayContent::processTaskForTouchExcludeRegion, this, PooledLambda.__(Task.class), focusedTask, delta); - mTaskStackContainers.forAllTasks(c); + mTaskContainers.forAllTasks(c); c.recycle(); // If we removed the focused task above, add it back and only leave its @@ -2435,7 +2422,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } amendWindowTapExcludeRegion(mTouchExcludeRegion); // TODO(multi-display): Support docked stacks on secondary displays. - if (mDisplayId == DEFAULT_DISPLAY && getSplitScreenPrimaryStack() != null) { + if (mDisplayId == DEFAULT_DISPLAY && getRootSplitScreenPrimaryTask() != null) { mDividerControllerLocked.getTouchRegion(mTmpRect); mTmpRegion.set(mTmpRect); mTouchExcludeRegion.op(mTmpRegion, Op.UNION); @@ -2581,8 +2568,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo float dividerAnimationTarget) { boolean updated = false; - for (int i = mTaskStackContainers.getChildCount() - 1; i >= 0; --i) { - final ActivityStack stack = mTaskStackContainers.getChildAt(i); + for (int i = mTaskContainers.getChildCount() - 1; i >= 0; --i) { + final ActivityStack stack = mTaskContainers.getChildAt(i); if (stack == null || !stack.isAdjustedForIme()) { continue; } @@ -2610,8 +2597,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo boolean clearImeAdjustAnimation() { boolean changed = false; - for (int i = mTaskStackContainers.getChildCount() - 1; i >= 0; --i) { - final ActivityStack stack = mTaskStackContainers.getChildAt(i); + for (int i = mTaskContainers.getChildCount() - 1; i >= 0; --i) { + final ActivityStack stack = mTaskContainers.getChildAt(i); if (stack != null && stack.isAdjustedForIme()) { stack.resetAdjustedForIme(true /* adjustBoundsNow */); changed = true; @@ -2621,8 +2608,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } void beginImeAdjustAnimation() { - for (int i = mTaskStackContainers.getChildCount() - 1; i >= 0; --i) { - final ActivityStack stack = mTaskStackContainers.getChildAt(i); + for (int i = mTaskContainers.getChildCount() - 1; i >= 0; --i) { + final ActivityStack stack = mTaskContainers.getChildAt(i); if (stack.isVisible() && stack.isAdjustedForIme()) { stack.beginImeAdjustAnimation(); } @@ -2633,7 +2620,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo final WindowState imeWin = mInputMethodWindow; final boolean imeVisible = imeWin != null && imeWin.isVisibleLw() && imeWin.isDisplayedLw() && !mDividerControllerLocked.isImeHideRequested(); - final ActivityStack dockedStack = getSplitScreenPrimaryStack(); + final ActivityStack dockedStack = getRootSplitScreenPrimaryTask(); final boolean dockVisible = dockedStack != null; final Task topDockedTask = dockVisible ? dockedStack.getTask((t) -> true): null; final ActivityStack imeTargetStack = mWmService.getImeFocusStackLocked(); @@ -2659,8 +2646,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo // - If IME is not visible, divider is not moved and is normal width. if (imeVisible && dockVisible && (imeOnTop || imeOnBottom) && !dockMinimized) { - for (int i = mTaskStackContainers.getChildCount() - 1; i >= 0; --i) { - final ActivityStack stack = mTaskStackContainers.getChildAt(i); + for (int i = mTaskContainers.getChildCount() - 1; i >= 0; --i) { + final ActivityStack stack = mTaskContainers.getChildAt(i); final boolean isDockedOnBottom = stack.getDockSide() == DOCKED_BOTTOM; if (stack.isVisible() && (imeOnBottom || isDockedOnBottom) && stack.inSplitScreenWindowingMode()) { @@ -2672,8 +2659,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mDividerControllerLocked.setAdjustedForIme( imeOnBottom /*ime*/, true /*divider*/, true /*animate*/, imeWin, imeHeight); } else { - for (int i = mTaskStackContainers.getChildCount() - 1; i >= 0; --i) { - final ActivityStack stack = mTaskStackContainers.getChildAt(i); + for (int i = mTaskContainers.getChildCount() - 1; i >= 0; --i) { + final ActivityStack stack = mTaskContainers.getChildAt(i); stack.resetAdjustedForIme(!dockVisible); } mDividerControllerLocked.setAdjustedForIme( @@ -2683,8 +2670,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } void prepareFreezingTaskBounds() { - for (int stackNdx = mTaskStackContainers.getChildCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = mTaskStackContainers.getChildAt(stackNdx); + for (int stackNdx = mTaskContainers.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = mTaskContainers.getChildAt(stackNdx); stack.prepareFreezingTaskBounds(); } } @@ -2760,7 +2747,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo proto.write(SINGLE_TASK_INSTANCE, mSingleTaskInstance); final ActivityStack focusedStack = getFocusedStack(); if (focusedStack != null) { - proto.write(FOCUSED_STACK_ID, focusedStack.mStackId); + proto.write(FOCUSED_STACK_ID, focusedStack.getRootTaskId()); final ActivityRecord focusedActivity = focusedStack.getDisplay().getResumedActivity(); if (focusedActivity != null) { focusedActivity.writeIdentifierToProto(proto, RESUMED_ACTIVITY); @@ -2786,8 +2773,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo final long token = proto.start(fieldId); super.dumpDebug(proto, WINDOW_CONTAINER, logLevel); proto.write(ID, mDisplayId); - for (int stackNdx = mTaskStackContainers.getChildCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = mTaskStackContainers.getChildAt(stackNdx); + for (int stackNdx = mTaskContainers.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = mTaskContainers.getChildAt(stackNdx); stack.dumpDebugInnerStackOnly(proto, STACKS, logLevel); } mDividerControllerLocked.dumpDebug(proto, DOCKED_STACK_DIVIDER_CONTROLLER); @@ -2913,8 +2900,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo pw.println(); pw.println(prefix + "Application tokens in top down Z order:"); - for (int stackNdx = mTaskStackContainers.getChildCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = mTaskStackContainers.getChildAt(stackNdx); + for (int stackNdx = mTaskContainers.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = mTaskContainers.getChildAt(stackNdx); stack.dump(pw, prefix + " ", dumpAll); } @@ -2944,19 +2931,20 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo pw.println(); // Dump stack references - final ActivityStack homeStack = getHomeStack(); + final ActivityStack homeStack = getRootHomeTask(); if (homeStack != null) { pw.println(prefix + "homeStack=" + homeStack.getName()); } - final ActivityStack pinnedStack = getPinnedStack(); + final ActivityStack pinnedStack = getRootPinnedTask(); if (pinnedStack != null) { pw.println(prefix + "pinnedStack=" + pinnedStack.getName()); } - final ActivityStack splitScreenPrimaryStack = getSplitScreenPrimaryStack(); + final ActivityStack splitScreenPrimaryStack = getRootSplitScreenPrimaryTask(); if (splitScreenPrimaryStack != null) { pw.println(prefix + "splitScreenPrimaryStack=" + splitScreenPrimaryStack.getName()); } - final ActivityStack recentsStack = getRecentsStack(); + final ActivityStack recentsStack = + getStack(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_RECENTS); if (recentsStack != null) { pw.println(prefix + "recentsStack=" + recentsStack.getName()); } @@ -3994,7 +3982,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } // Initialize state of exiting applications. - mTaskStackContainers.setExitingTokensHasVisible(hasVisible); + mTaskContainers.setExitingTokensHasVisible(hasVisible); } void removeExistingTokensIfPossible() { @@ -4006,7 +3994,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } // Time to remove any exiting applications? - mTaskStackContainers.removeExistingAppTokensIfPossible(); + mTaskContainers.removeExistingAppTokensIfPossible(); } @Override @@ -4137,7 +4125,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo * Window container class that contains all containers on this display relating to Apps. * I.e Activities. */ - private final class TaskStackContainers extends DisplayChildWindowContainer<ActivityStack> { + private final class TaskContainers extends DisplayChildWindowContainer<ActivityStack> { /** * A control placed at the appropriate level for transitions to occur. */ @@ -4160,14 +4148,13 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo */ SurfaceControl mSplitScreenDividerAnchor = null; - // Cached reference to some special stacks we tend to get a lot so we don't need to loop + // Cached reference to some special tasks we tend to get a lot so we don't need to loop // through the list to find them. - private ActivityStack mHomeStack = null; - private ActivityStack mRecentsStack = null; - private ActivityStack mPinnedStack = null; - private ActivityStack mSplitScreenPrimaryStack = null; + private ActivityStack mRootHomeTask = null; + private ActivityStack mRootPinnedTask = null; + private ActivityStack mRootSplitScreenPrimaryTask = null; - TaskStackContainers(WindowManagerService service) { + TaskContainers(WindowManagerService service) { super(service); } @@ -4177,15 +4164,15 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo */ ActivityStack getStack(int windowingMode, int activityType) { if (activityType == ACTIVITY_TYPE_HOME) { - return mHomeStack; + return mRootHomeTask; } if (windowingMode == WINDOWING_MODE_PINNED) { - return mPinnedStack; + return mRootPinnedTask; } else if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { - return mSplitScreenPrimaryStack; + return mRootSplitScreenPrimaryTask; } - for (int i = mTaskStackContainers.getChildCount() - 1; i >= 0; --i) { - final ActivityStack stack = mTaskStackContainers.getChildAt(i); + for (int i = mTaskContainers.getChildCount() - 1; i >= 0; --i) { + final ActivityStack stack = mTaskContainers.getChildAt(i); if (activityType == ACTIVITY_TYPE_UNDEFINED && windowingMode == stack.getWindowingMode()) { // Passing in undefined type means we want to match the topmost stack with the @@ -4201,31 +4188,27 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo @VisibleForTesting ActivityStack getTopStack() { - return mTaskStackContainers.getChildCount() > 0 - ? mTaskStackContainers.getChildAt(mTaskStackContainers.getChildCount() - 1) : null; + return mTaskContainers.getChildCount() > 0 + ? mTaskContainers.getChildAt(mTaskContainers.getChildCount() - 1) : null; } int getIndexOf(ActivityStack stack) { - return mTaskStackContainers.mChildren.indexOf(stack); + return mTaskContainers.mChildren.indexOf(stack); } - ActivityStack getHomeStack() { - if (mHomeStack == null && mDisplayId == DEFAULT_DISPLAY) { + ActivityStack getRootHomeTask() { + if (mRootHomeTask == null && mDisplayId == DEFAULT_DISPLAY) { Slog.e(TAG_WM, "getHomeStack: Returning null from this=" + this); } - return mHomeStack; + return mRootHomeTask; } - ActivityStack getRecentsStack() { - return mRecentsStack; + ActivityStack getRootPinnedTask() { + return mRootPinnedTask; } - ActivityStack getPinnedStack() { - return mPinnedStack; - } - - ActivityStack getSplitScreenPrimaryStack() { - return mSplitScreenPrimaryStack; + ActivityStack getRootSplitScreenPrimaryTask() { + return mRootSplitScreenPrimaryTask; } ArrayList<Task> getVisibleTasks() { @@ -4241,7 +4224,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo void onStackWindowingModeChanged(ActivityStack stack) { removeStackReferenceIfNeeded(stack); addStackReferenceIfNeeded(stack); - if (stack == mPinnedStack && getTopStack() != stack) { + if (stack == mRootPinnedTask && getTopStack() != stack) { // Looks like this stack changed windowing mode to pinned. Move it to the top. positionChildAt(POSITION_TOP, stack, false /* includingParents */); } @@ -4249,46 +4232,36 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo private void addStackReferenceIfNeeded(ActivityStack stack) { if (stack.isActivityTypeHome()) { - if (mHomeStack != null) { - if (!stack.isDescendantOf(mHomeStack)) { + if (mRootHomeTask != null) { + if (!stack.isDescendantOf(mRootHomeTask)) { throw new IllegalArgumentException("addStackReferenceIfNeeded: home stack=" - + mHomeStack + " already exist on display=" + this + + mRootHomeTask + " already exist on display=" + this + " stack=" + stack); } } else { - mHomeStack = stack; - } - } else if (stack.isActivityTypeRecents()) { - if (mRecentsStack != null && mRecentsStack != stack) { - if (!stack.isDescendantOf(mRecentsStack)) { - throw new IllegalArgumentException( - "addStackReferenceIfNeeded: recents stack=" + mRecentsStack - + " already exist on display=" + this + " stack=" + stack); - } - } else { - mRecentsStack = stack; + mRootHomeTask = stack; } } final int windowingMode = stack.getWindowingMode(); if (windowingMode == WINDOWING_MODE_PINNED) { - if (mPinnedStack != null) { - if (!stack.isDescendantOf(mPinnedStack)) { + if (mRootPinnedTask != null) { + if (!stack.isDescendantOf(mRootPinnedTask)) { throw new IllegalArgumentException( - "addStackReferenceIfNeeded: pinned stack=" + mPinnedStack + "addStackReferenceIfNeeded: pinned stack=" + mRootPinnedTask + " already exist on display=" + this + " stack=" + stack); } } else { - mPinnedStack = stack; + mRootPinnedTask = stack; } } else if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { - if (mSplitScreenPrimaryStack != null) { - if (!stack.isDescendantOf(mSplitScreenPrimaryStack)) { + if (mRootSplitScreenPrimaryTask != null) { + if (!stack.isDescendantOf(mRootSplitScreenPrimaryTask)) { throw new IllegalArgumentException("addStackReferenceIfNeeded:" - + " split-screen-primary" + " stack=" + mSplitScreenPrimaryStack + + " split-screen-primary" + " stack=" + mRootSplitScreenPrimaryTask + " already exist on display=" + this + " stack=" + stack); } } else { - mSplitScreenPrimaryStack = stack; + mRootSplitScreenPrimaryTask = stack; mDisplayContent.onSplitScreenModeActivated(); mDividerControllerLocked.notifyDockedStackExistsChanged(true); } @@ -4296,14 +4269,12 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } void removeStackReferenceIfNeeded(ActivityStack stack) { - if (stack == mHomeStack) { - mHomeStack = null; - } else if (stack == mRecentsStack) { - mRecentsStack = null; - } else if (stack == mPinnedStack) { - mPinnedStack = null; - } else if (stack == mSplitScreenPrimaryStack) { - mSplitScreenPrimaryStack = null; + if (stack == mRootHomeTask) { + mRootHomeTask = null; + } else if (stack == mRootPinnedTask) { + mRootPinnedTask = null; + } else if (stack == mRootSplitScreenPrimaryTask) { + mRootSplitScreenPrimaryTask = null; mDisplayContent.onSplitScreenModeDismissed(); // Re-set the split-screen create mode whenever the split-screen stack is removed. mWmService.setDockedStackCreateStateLocked( @@ -4405,9 +4376,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo int minPosition = POSITION_BOTTOM; if (stack.isAlwaysOnTop()) { - if (hasPinnedStack()) { + if (hasPinnedTask()) { // Always-on-top stacks go below the pinned stack. - maxPosition = getStacks().indexOf(mPinnedStack) - 1; + maxPosition = getStacks().indexOf(mRootPinnedTask) - 1; } // Always-on-top stacks need to be above all other stacks. minPosition = belowAlwaysOnTopPosition != @@ -4532,11 +4503,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo // docked stack is visible...except for the home stack if the docked stack is // minimized and it actually set something and the bounds is different from the // display. - if (mHomeStack != null && mHomeStack.isVisible() + if (mRootHomeTask != null && mRootHomeTask.isVisible() && mDividerControllerLocked.isMinimizedDock() && !(mDividerControllerLocked.isHomeStackResizable() - && mHomeStack.matchParentBounds())) { - final int orientation = mHomeStack.getOrientation(); + && mRootHomeTask.matchParentBounds())) { + final int orientation = mRootHomeTask.getOrientation(); if (orientation != SCREEN_ORIENTATION_UNSET) { return orientation; } @@ -4717,7 +4688,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo void assignChildLayers(SurfaceControl.Transaction t) { mImeWindowsContainers.setNeedsLayer(); mBelowAppWindowsContainers.assignLayer(t, 0); - mTaskStackContainers.assignLayer(t, 1); + mTaskContainers.assignLayer(t, 1); mAboveAppWindowsContainers.assignLayer(t, 2); final WindowState imeTarget = mInputMethodTarget; @@ -4756,7 +4727,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo // Above we have assigned layers to our children, now we ask them to assign // layers to their children. mBelowAppWindowsContainers.assignChildLayers(t); - mTaskStackContainers.assignChildLayers(t); + mTaskContainers.assignChildLayers(t); mAboveAppWindowsContainers.assignChildLayers(t); mImeWindowsContainers.assignRelativeLayer(t, getSurfaceControl(), Integer.MAX_VALUE); mImeWindowsContainers.assignChildLayers(t); @@ -4769,7 +4740,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo void addChildren() { addChild(mBelowAppWindowsContainers, null); - addChild(mTaskStackContainers, null); + addChild(mTaskContainers, null); addChild(mAboveAppWindowsContainers, null); addChild(mImeWindowsContainers, null); } @@ -4929,7 +4900,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo private boolean skipImeWindowsDuringTraversal(DisplayContent dc) { // 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.hasSplitScreenPrimaryStack(); + return dc.mInputMethodTarget != null && !dc.hasSplitScreenPrimaryTask(); } /** Like {@link #forAllWindows}, but ignores {@link #skipImeWindowsDuringTraversal} */ @@ -5080,7 +5051,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } void assignStackOrdering() { - mTaskStackContainers.assignStackOrdering(getPendingTransaction()); + mTaskContainers.assignStackOrdering(getPendingTransaction()); } /** @@ -5669,8 +5640,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo if (currentFocusedStack != prevFocusedStack) { mLastFocusedStack = prevFocusedStack; EventLogTags.writeWmFocusedStack(mRootWindowContainer.mCurrentUser, mDisplayId, - currentFocusedStack == null ? -1 : currentFocusedStack.getStackId(), - mLastFocusedStack == null ? -1 : mLastFocusedStack.getStackId(), + currentFocusedStack == null ? -1 : currentFocusedStack.getRootTaskId(), + mLastFocusedStack == null ? -1 : mLastFocusedStack.getRootTaskId(), updateLastFocusedStackReason); } } @@ -5678,10 +5649,10 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo onStackOrderChanged(stack); } - ActivityStack getStack(int stackId) { + ActivityStack getStack(int rootTaskId) { for (int i = getStackCount() - 1; i >= 0; --i) { final ActivityStack stack = getStackAt(i); - if (stack.mStackId == stackId) { + if (stack.getRootTaskId() == rootTaskId) { return stack; } } @@ -6041,7 +6012,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } finally { final ActivityStack topFullscreenStack = getTopStackInWindowingMode(WINDOWING_MODE_FULLSCREEN); - final ActivityStack homeStack = getHomeStack(); + final ActivityStack homeStack = getRootHomeTask(); if (topFullscreenStack != null && homeStack != null && !isTopStack(homeStack)) { // Whenever split-screen is dismissed we want the home stack directly behind the // current top fullscreen stack so it shows up when the top stack is finished. @@ -6059,7 +6030,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mAtmService.deferWindowLayout(); try { // Adjust the windowing mode of any affected by split-screen to split-screen secondary. - final ActivityStack splitScreenPrimaryStack = getSplitScreenPrimaryStack(); + final ActivityStack splitScreenPrimaryStack = getRootSplitScreenPrimaryTask(); for (int i = getStackCount() - 1; i >= 0; --i) { final ActivityStack otherStack = getStackAt(i); if (otherStack == splitScreenPrimaryStack @@ -6188,7 +6159,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } } - final boolean inSplitScreenMode = hasSplitScreenPrimaryStack(); + final boolean inSplitScreenMode = hasSplitScreenPrimaryTask(); if (!inSplitScreenMode && windowingMode == WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY) { // Switch to the display's windowing mode if we are not in split-screen mode and we are @@ -6434,7 +6405,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo // 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.hasSplitScreenPrimaryStack() + final int windowingMode = toDisplay.hasSplitScreenPrimaryTask() ? WINDOWING_MODE_SPLIT_SCREEN_SECONDARY : WINDOWING_MODE_UNDEFINED; stack.reparent(toDisplay, true /* onTop */); @@ -6603,7 +6574,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } void moveHomeStackToFront(String reason) { - final ActivityStack homeStack = getHomeStack(); + final ActivityStack homeStack = getRootHomeTask(); if (homeStack != null) { homeStack.moveToFront(reason); } @@ -6629,7 +6600,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo @Nullable ActivityRecord getHomeActivityForUser(int userId) { - final ActivityStack homeStack = getHomeStack(); + final ActivityStack homeStack = getRootHomeTask(); if (homeStack == null) { return null; } @@ -6718,7 +6689,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo public void dumpStacks(PrintWriter pw) { for (int i = getStackCount() - 1; i >= 0; --i) { - pw.print(getStackAt(i).mStackId); + pw.print(getStackAt(i).getRootTaskId()); if (i > 0) { pw.print(","); } diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java index b59c4e38214b..f90f22423a2d 100644 --- a/services/core/java/com/android/server/wm/DisplayRotation.java +++ b/services/core/java/com/android/server/wm/DisplayRotation.java @@ -582,7 +582,7 @@ public class DisplayRotation { // In the presence of the PINNED stack or System Alert windows we unfortunately can not // seamlessly rotate. - if (mDisplayContent.hasPinnedStack() || mDisplayContent.hasAlertWindowSurfaces()) { + if (mDisplayContent.hasPinnedTask() || mDisplayContent.hasAlertWindowSurfaces()) { return false; } diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index 6b5859d418ec..872379efa389 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -255,7 +255,7 @@ public class DockedStackDividerController { } boolean isHomeStackResizable() { - final ActivityStack homeStack = mDisplayContent.getHomeStack(); + final ActivityStack homeStack = mDisplayContent.getRootHomeTask(); if (homeStack == null) { return false; } @@ -371,7 +371,7 @@ public class DockedStackDividerController { if (mWindow == null) { return; } - ActivityStack stack = mDisplayContent.getSplitScreenPrimaryStackIgnoringVisibility(); + ActivityStack stack = mDisplayContent.getRootSplitScreenPrimaryTask(); // If the stack is invisible, we policy force hide it in WindowAnimator.shouldForceHide final boolean visible = stack != null; @@ -415,7 +415,7 @@ public class DockedStackDividerController { } void positionDockedStackedDivider(Rect frame) { - ActivityStack stack = mDisplayContent.getSplitScreenPrimaryStackIgnoringVisibility(); + ActivityStack stack = mDisplayContent.getRootSplitScreenPrimaryTask(); if (stack == null) { // Unfortunately we might end up with still having a divider, even though the underlying // stack was already removed. This is because we are on AM thread and the removal of the @@ -524,7 +524,7 @@ public class DockedStackDividerController { // If a primary stack was just created, it will not have access to display content at // this point so pass it from here to get a valid dock side. final ActivityStack stack = - mDisplayContent.getSplitScreenPrimaryStackIgnoringVisibility(); + mDisplayContent.getRootSplitScreenPrimaryTask(); mOriginalDockedSide = stack.getDockSideForDisplay(mDisplayContent); return; } @@ -560,7 +560,7 @@ public class DockedStackDividerController { long animDuration = 0; if (animate) { final ActivityStack stack = - mDisplayContent.getSplitScreenPrimaryStackIgnoringVisibility(); + mDisplayContent.getRootSplitScreenPrimaryTask(); final long transitionDuration = isAnimationMaximizing() ? mDisplayContent.mAppTransition.getLastClipRevealTransitionDuration() : DEFAULT_APP_TRANSITION_DURATION; @@ -615,7 +615,7 @@ public class DockedStackDividerController { mDockedStackListeners.register(listener); notifyDockedDividerVisibilityChanged(wasVisible()); notifyDockedStackExistsChanged( - mDisplayContent.getSplitScreenPrimaryStackIgnoringVisibility() != null); + mDisplayContent.getRootSplitScreenPrimaryTask() != null); notifyDockedStackMinimizedChanged(mMinimizedDock, false /* animate */, isHomeStackResizable()); notifyAdjustedForImeChanged(mAdjustedForIme, 0 /* animDuration */); @@ -633,7 +633,7 @@ public class DockedStackDividerController { final ActivityStack stack = targetWindowingMode != WINDOWING_MODE_UNDEFINED ? mDisplayContent.getTopStackInWindowingMode(targetWindowingMode) : null; - final ActivityStack dockedStack = mDisplayContent.getSplitScreenPrimaryStack(); + final ActivityStack dockedStack = mDisplayContent.getRootSplitScreenPrimaryTask(); boolean visibleAndValid = visible && stack != null && dockedStack != null; // Ensure an old dim that was shown for the docked stack divider is removed so we don't end @@ -701,10 +701,10 @@ public class DockedStackDividerController { } void checkMinimizeChanged(boolean animate) { - if (mDisplayContent.getSplitScreenPrimaryStackIgnoringVisibility() == null) { + if (mDisplayContent.getRootSplitScreenPrimaryTask() == null) { return; } - final ActivityStack homeStack = mDisplayContent.getHomeStack(); + final ActivityStack homeStack = mDisplayContent.getRootHomeTask(); if (homeStack == null) { return; } @@ -873,7 +873,7 @@ public class DockedStackDividerController { } private boolean setMinimizedDockedStack(boolean minimized) { - final ActivityStack stack = mDisplayContent.getSplitScreenPrimaryStackIgnoringVisibility(); + final ActivityStack stack = mDisplayContent.getRootSplitScreenPrimaryTask(); notifyDockedStackMinimizedChanged(minimized, false /* animate */, isHomeStackResizable()); return stack != null && stack.setAdjustedForMinimizedDock(minimized ? 1f : 0f); } @@ -923,7 +923,7 @@ public class DockedStackDividerController { } private boolean animateForMinimizedDockedStack(long now) { - final ActivityStack stack = mDisplayContent.getSplitScreenPrimaryStackIgnoringVisibility(); + final ActivityStack stack = mDisplayContent.getRootSplitScreenPrimaryTask(); if (!mAnimationStarted) { mAnimationStarted = true; mAnimationStartTime = now; diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java index 7db30f6009b4..ad65e101fd15 100644 --- a/services/core/java/com/android/server/wm/KeyguardController.java +++ b/services/core/java/com/android/server/wm/KeyguardController.java @@ -407,7 +407,7 @@ class KeyguardController { // 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 ActivityStack stack = - mRootWindowContainer.getDefaultDisplay().getSplitScreenPrimaryStack(); + mRootWindowContainer.getDefaultDisplay().getRootSplitScreenPrimaryTask(); if (stack == null) { return; } diff --git a/services/core/java/com/android/server/wm/LaunchParamsController.java b/services/core/java/com/android/server/wm/LaunchParamsController.java index 03e13221c4a7..a9820ef1c081 100644 --- a/services/core/java/com/android/server/wm/LaunchParamsController.java +++ b/services/core/java/com/android/server/wm/LaunchParamsController.java @@ -138,7 +138,7 @@ class LaunchParamsController { try { if (mTmpParams.hasPreferredDisplay() && mTmpParams.mPreferredDisplayId != task.getStack().getDisplay().mDisplayId) { - mService.moveStackToDisplay(task.getStackId(), mTmpParams.mPreferredDisplayId); + mService.moveStackToDisplay(task.getRootTaskId(), mTmpParams.mPreferredDisplayId); } if (mTmpParams.hasWindowingMode() diff --git a/services/core/java/com/android/server/wm/PinnedStackController.java b/services/core/java/com/android/server/wm/PinnedStackController.java index b4f75e545729..1d5b5d1a46a4 100644 --- a/services/core/java/com/android/server/wm/PinnedStackController.java +++ b/services/core/java/com/android/server/wm/PinnedStackController.java @@ -125,7 +125,7 @@ class PinnedStackController { public void startAnimation(Rect destinationBounds, Rect sourceRectHint, int animationDuration) { synchronized (mService.mGlobalLock) { - final ActivityStack pinnedStack = mDisplayContent.getPinnedStack(); + final ActivityStack pinnedStack = mDisplayContent.getRootPinnedTask(); pinnedStack.animateResizePinnedStack(destinationBounds, sourceRectHint, animationDuration, true /* fromFullscreen */); } @@ -134,7 +134,7 @@ class PinnedStackController { @Override public void resetBoundsAnimation(Rect bounds) { synchronized (mService.mGlobalLock) { - if (mDisplayContent.hasPinnedStack()) { + if (mDisplayContent.hasPinnedTask()) { final ActivityStack pinnedStack = mDisplayContent.getTopStackInWindowingMode( WINDOWING_MODE_PINNED); if (pinnedStack != null) { @@ -383,7 +383,7 @@ class PinnedStackController { } try { final Rect animatingBounds = new Rect(); - final ActivityStack pinnedStack = mDisplayContent.getPinnedStack(); + final ActivityStack pinnedStack = mDisplayContent.getRootPinnedTask(); if (pinnedStack != null) { pinnedStack.getAnimationOrCurrentBounds(animatingBounds); } diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java index e1dfc177a881..292e8aaa0c04 100644 --- a/services/core/java/com/android/server/wm/RecentTasks.java +++ b/services/core/java/com/android/server/wm/RecentTasks.java @@ -1387,7 +1387,7 @@ class RecentTasks { // Trim tasks that are in stacks that are behind the home stack final DisplayContent display = stack.getDisplay(); - return display.getIndexOf(stack) < display.getIndexOf(display.getHomeStack()); + return display.getIndexOf(stack) < display.getIndexOf(display.getRootHomeTask()); } /** diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index 614809505dee..da9d074eb7bc 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -413,7 +413,7 @@ public class RecentsAnimationController implements DeathRecipient { // Save the minimized home height final ActivityStack dockedStack = - mDisplayContent.getSplitScreenPrimaryStackIgnoringVisibility(); + mDisplayContent.getRootSplitScreenPrimaryTask(); mDisplayContent.getDockedDividerController().getHomeStackBoundsInDockedMode( mDisplayContent.getConfiguration(), dockedStack == null ? DOCKED_INVALID : dockedStack.getDockSide(), diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 8202833783a9..d3da50060104 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -1656,7 +1656,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> // Only resume home activity if isn't finishing. if (r != null && !r.finishing) { r.moveFocusableActivityToTop(myReason); - return resumeFocusedStacksTopActivities(r.getActivityStack(), prev, null); + return resumeFocusedStacksTopActivities(r.getRootTask(), prev, null); } return startHomeOnDisplay(mCurrentUser, myReason, displayId); } @@ -1980,9 +1980,9 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } boolean switchUser(int userId, UserState uss) { - final int focusStackId = getTopDisplayFocusedStack().getStackId(); + final int focusStackId = getTopDisplayFocusedStack().getRootTaskId(); // We dismiss the docked stack whenever we switch users. - final ActivityStack dockedStack = getDefaultDisplay().getSplitScreenPrimaryStack(); + final ActivityStack dockedStack = getDefaultDisplay().getRootSplitScreenPrimaryTask(); if (dockedStack != null) { mStackSupervisor.moveTasksToFullscreenStackLocked( dockedStack, dockedStack.isFocusedStackOnDisplay()); @@ -1994,7 +1994,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> mUserStackInFront.put(mCurrentUser, focusStackId); final int restoreStackId = - mUserStackInFront.get(userId, getDefaultDisplay().getHomeStack().mStackId); + mUserStackInFront.get(userId, getDefaultDisplay().getRootHomeTask().getRootTaskId()); mCurrentUser = userId; mStackSupervisor.mStartingUsers.add(uss); @@ -2012,7 +2012,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> ActivityStack stack = getStack(restoreStackId); if (stack == null) { - stack = getDefaultDisplay().getHomeStack(); + stack = getDefaultDisplay().getRootHomeTask(); } final boolean homeInFront = stack.isActivityTypeHome(); if (stack.isOnHomeDisplay()) { @@ -2034,8 +2034,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent> */ void updateUserStack(int userId, ActivityStack stack) { if (userId != mCurrentUser) { - mUserStackInFront.put(userId, stack != null ? stack.getStackId() - : getDefaultDisplay().getHomeStack().mStackId); + mUserStackInFront.put(userId, stack != null ? stack.getRootTaskId() + : getDefaultDisplay().getRootHomeTask().getRootTaskId()); } } @@ -2108,12 +2108,12 @@ class RootWindowContainer extends WindowContainer<DisplayContent> String reason) { mService.deferWindowLayout(); - final DisplayContent display = r.getActivityStack().getDisplay(); + final DisplayContent display = r.getRootTask().getDisplay(); try { final Task task = r.getTask(); - final ActivityStack pinnedStack = display.getPinnedStack(); + final ActivityStack pinnedStack = display.getRootPinnedTask(); // This will change the pinned stack's windowing mode to its original mode, ensuring // we only have one stack that is in pinned mode. if (pinnedStack != null) { @@ -2124,13 +2124,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> final ActivityStack stack; if (singleActivity) { - stack = r.getActivityStack(); + stack = r.getRootTask(); } else { // In the case of multiple activities, we will create a new stack for it and then // move the PIP activity into the stack. // We will then perform a windowing mode change for both scenarios. stack = display.createStack( - r.getActivityStack().getRequestedOverrideWindowingMode(), + r.getRootTask().getRequestedOverrideWindowingMode(), r.getActivityType(), ON_TOP, r.info, r.intent); // There are multiple activities in the task and moving the top activity should // reveal/leave the other activities in their original task. @@ -2398,7 +2398,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> ActivityManager.StackInfo info = new ActivityManager.StackInfo(); stack.getBounds(info.bounds); info.displayId = display.mDisplayId; - info.stackId = stack.mStackId; + info.stackId = stack.mTaskId; info.stackToken = stack.mRemoteToken; info.userId = stack.mCurrentUser; info.visible = stack.shouldBeVisible(null); @@ -2853,7 +2853,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> stack = candidateTask.getStack(); } if (stack == null && r != null) { - stack = r.getActivityStack(); + stack = r.getRootTask(); } if (stack != null) { display = stack.getDisplay(); @@ -2868,7 +2868,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> return stack; } if (windowingMode == WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY - && display.getSplitScreenPrimaryStack() == stack + && display.getRootSplitScreenPrimaryTask() == stack && candidateTask == stack.getTopMostTask()) { // This is a special case when we try to launch an activity that is currently on // top of split-screen primary stack, but is targeting split-screen secondary. @@ -3244,7 +3244,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> if (resumedActivity == null || !resumedActivity.idle) { if (DEBUG_STATES) { Slog.d(TAG_STATES, "allResumedActivitiesIdle: stack=" - + stack.mStackId + " " + resumedActivity + " not idle"); + + stack.getRootTaskId() + " " + resumedActivity + " not idle"); } return false; } @@ -3599,7 +3599,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> // TODO(b/111541062): Update tests to look for resumed activities on all displays final ActivityStack focusedStack = getTopDisplayFocusedStack(); if (focusedStack != null) { - proto.write(FOCUSED_STACK_ID, focusedStack.mStackId); + proto.write(FOCUSED_STACK_ID, focusedStack.getRootTaskId()); final ActivityRecord focusedActivity = focusedStack.getDisplay().getResumedActivity(); if (focusedActivity != null) { focusedActivity.writeIdentifierToProto(proto, RESUMED_ACTIVITY); diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 9e6cb6884820..c52966b5b33d 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -526,7 +526,7 @@ class Task extends WindowContainer<WindowContainer> { ActivityStack stack) { super(atmService.mWindowManager); - EventLogTags.writeWmTaskCreated(_taskId, stack != null ? stack.mStackId : INVALID_STACK_ID); + EventLogTags.writeWmTaskCreated(_taskId, stack != null ? getRootTaskId() : INVALID_TASK_ID); mAtmService = atmService; mStackSupervisor = atmService.mStackSupervisor; mRootWindowContainer = mAtmService.mRootWindowContainer; @@ -1080,7 +1080,7 @@ class Task extends WindowContainer<WindowContainer> { // the display, so we should probably consolidate it there instead. if (getParent() == null && mDisplayContent != null) { - EventLogTags.writeWmStackRemoved(getStackId()); + EventLogTags.writeWmStackRemoved(getRootTaskId()); mDisplayContent = null; mWmService.mWindowPlacerLocked.requestTraversal(); } @@ -2344,17 +2344,27 @@ class Task extends WindowContainer<WindowContainer> { return dc != null ? dc.mDisplayId : INVALID_DISPLAY; } + // TODO: Migrate callers to getRootTask() ActivityStack getStack() { + return (ActivityStack) getRootTask(); + } + + /** @return Id of root task. */ + int getRootTaskId() { + return getRootTask().mTaskId; + } + + Task getRootTask() { final WindowContainer parent = getParent(); - return (ActivityStack) (parent instanceof ActivityStack ? parent : this); + if (parent == null) return this; + + final Task parentTask = parent.asTask(); + return parentTask == null ? this : parentTask.getRootTask(); } - /** - * @return Id of current stack, {@link ActivityTaskManager#INVALID_STACK_ID} if no stack is set. - */ - int getStackId() { - final ActivityStack stack = getStack(); - return stack != null ? stack.mStackId : INVALID_STACK_ID; + // TODO(task-merge): Figure out what's the right thing to do for places that used it. + boolean isRootTask() { + return getRootTask() == this; } int getDescendantTaskCount() { @@ -2736,7 +2746,7 @@ class Task extends WindowContainer<WindowContainer> { // No need to check if the mode is allowed if it's leaving dragResize if (dragResizing && !DragResizeMode.isModeAllowedForStack(getStack(), dragResizeMode)) { throw new IllegalArgumentException("Drag resize mode not allow for stack stackId=" - + getStack().mStackId + " dragResizeMode=" + dragResizeMode); + + getRootTaskId() + " dragResizeMode=" + dragResizeMode); } mDragResizing = dragResizing; mDragResizeMode = dragResizeMode; @@ -3010,11 +3020,6 @@ class Task extends WindowContainer<WindowContainer> { return mTaskDescription; } - // TODO(task-merge): Figure out what's the right thing to do for places that used it. - boolean isRootTask() { - return getParent() == null || getParent().asTask() == null; - } - @Override boolean fillsParent() { return matchParentBounds(); @@ -3167,7 +3172,7 @@ class Task extends WindowContainer<WindowContainer> { void fillTaskInfo(TaskInfo info) { getNumRunningActivities(mReuseActivitiesReport); info.userId = mUserId; - info.stackId = getStackId(); + info.stackId = getRootTaskId(); info.taskId = mTaskId; info.displayId = getDisplayId(); info.isRunning = getTopNonFinishingActivity() != null; @@ -3298,7 +3303,7 @@ class Task extends WindowContainer<WindowContainer> { if (mRootProcess != null) { pw.print(prefix); pw.print("mRootProcess="); pw.println(mRootProcess); } - pw.print(prefix); pw.print("taskId=" + mTaskId); pw.println(" stackId=" + getStackId()); + pw.print(prefix); pw.print("taskId=" + mTaskId); pw.println(" stackId=" + getRootTaskId()); pw.print(prefix + "hasBeenVisible=" + hasBeenVisible); pw.print(" mResizeMode=" + ActivityInfo.resizeModeToString(mResizeMode)); pw.print(" mSupportsPictureInPicture=" + mSupportsPictureInPicture); @@ -3315,7 +3320,7 @@ class Task extends WindowContainer<WindowContainer> { sb.append(" U="); sb.append(mUserId); sb.append(" StackId="); - sb.append(getStackId()); + sb.append(getRootTaskId()); sb.append(" sz="); sb.append(getChildCount()); sb.append('}'); @@ -3358,7 +3363,7 @@ class Task extends WindowContainer<WindowContainer> { forAllActivities((r) -> { r.dumpDebug(proto, ACTIVITIES); }); - proto.write(STACK_ID, getStackId()); + proto.write(STACK_ID, getRootTaskId()); if (mLastNonFullscreenBounds != null) { mLastNonFullscreenBounds.dumpDebug(proto, LAST_NON_FULLSCREEN_BOUNDS); } diff --git a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java index 688fe1290b18..2dde0bac74a8 100644 --- a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java +++ b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java @@ -350,7 +350,7 @@ class TaskChangeNotificationController { void notifyActivityPinned(ActivityRecord r) { mHandler.removeMessages(NOTIFY_ACTIVITY_PINNED_LISTENERS_MSG); final Message msg = mHandler.obtainMessage(NOTIFY_ACTIVITY_PINNED_LISTENERS_MSG, - r.getTask().mTaskId, r.getStackId(), r.packageName); + r.getTask().mTaskId, r.getRootTaskId(), r.packageName); msg.sendingUid = r.mUserId; forAllLocalListeners(mNotifyActivityPinned, msg); msg.sendToTarget(); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index cd5da08a4780..81a4c682e809 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -3163,7 +3163,7 @@ public class WindowManagerService extends IWindowManager.Stub // Notify whether the docked stack exists for the current user final DisplayContent displayContent = getDefaultDisplayContentLocked(); final ActivityStack stack = - displayContent.getSplitScreenPrimaryStackIgnoringVisibility(); + displayContent.getRootSplitScreenPrimaryTask(); displayContent.mDividerControllerLocked.notifyDockedStackExistsChanged( stack != null && stack.hasTaskForUser(newUserId)); @@ -6414,7 +6414,7 @@ public class WindowManagerService extends IWindowManager.Stub public int getDockedStackSide() { synchronized (mGlobalLock) { final ActivityStack dockedStack = getDefaultDisplayContentLocked() - .getSplitScreenPrimaryStackIgnoringVisibility(); + .getRootSplitScreenPrimaryTask(); return dockedStack == null ? DOCKED_INVALID : dockedStack.getDockSide(); } } diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index c755e60ec977..812942e06e39 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -618,15 +618,15 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio // Compare the z-order of ActivityStacks if both activities landed on same display. if (display == topDisplay - && mPreQTopResumedActivity.getActivityStack().compareTo( - activity.getActivityStack()) <= 0) { + && mPreQTopResumedActivity.getRootTask().compareTo( + activity.getRootTask()) <= 0) { canUpdate = true; } if (canUpdate) { // Make sure the previous top activity in the process no longer be resumed. if (mPreQTopResumedActivity != null && mPreQTopResumedActivity.isState(RESUMED)) { - final ActivityStack stack = mPreQTopResumedActivity.getActivityStack(); + final ActivityStack stack = mPreQTopResumedActivity.getRootTask(); if (stack != null) { stack.startPausingLocked(false /* userLeaving */, false /* uiSleeping */, activity); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 2965764e8961..73984fd49f73 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -16,7 +16,7 @@ package com.android.server.wm; -import static android.app.ActivityTaskManager.INVALID_STACK_ID; +import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.MODE_DEFAULT; import static android.app.AppOpsManager.OP_NONE; @@ -1055,7 +1055,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } } - final ActivityStack stack = getStack(); + final ActivityStack stack = getRootTask(); if (inPinnedWindowingMode() && stack != null && stack.lastAnimatingBoundsWasToFullscreen()) { // PIP edge case: When going from pinned to fullscreen, we apply a @@ -1469,17 +1469,15 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return mActivityRecord != null ? mActivityRecord.getTask() : null; } - ActivityStack getStack() { - Task task = getTask(); + ActivityStack getRootTask() { + final Task task = getTask(); if (task != null) { - if (task.getStack() != null) { - return task.getStack(); - } + return (ActivityStack) task.getRootTask(); } // 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.getHomeStack() : null; + return mAttrs.type >= FIRST_SYSTEM_WINDOW && dc != null ? dc.getRootHomeTask() : null; } /** @@ -2229,7 +2227,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return false; } - final ActivityStack stack = getStack(); + final ActivityStack stack = getRootTask(); if (stack != null && stack.shouldIgnoreInput()) { // Ignore when the stack shouldn't receive input event. // (i.e. the minimized stack in split screen mode.) @@ -2472,7 +2470,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP if (task != null) { task.getDimBounds(mTmpRect); } else { - getStack().getDimBounds(mTmpRect); + getRootTask().getDimBounds(mTmpRect); } } if (inFreeformWindowingMode()) { @@ -2653,7 +2651,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP // also reset drag resizing state, because the owner can't do it // anymore. final ActivityStack stack = - dc.getSplitScreenPrimaryStackIgnoringVisibility(); + dc.getRootSplitScreenPrimaryTask(); if (stack != null) { stack.resetDockedStackToMiddle(); } @@ -3563,12 +3561,12 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return mTmpRect; } - private int getStackId() { - final ActivityStack stack = getStack(); + private int getRootTaskId() { + final ActivityStack stack = getRootTask(); if (stack == null) { - return INVALID_STACK_ID; + return INVALID_TASK_ID; } - return stack.mStackId; + return stack.mTaskId; } private void dispatchResized(Rect frame, Rect contentInsets, @@ -3753,7 +3751,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP super.dumpDebug(proto, WINDOW_CONTAINER, logLevel); writeIdentifierToProto(proto, IDENTIFIER); proto.write(DISPLAY_ID, getDisplayId()); - proto.write(STACK_ID, getStackId()); + proto.write(STACK_ID, getRootTaskId()); mAttrs.dumpDebug(proto, ATTRIBUTES); mGivenContentInsets.dumpDebug(proto, GIVEN_CONTENT_INSETS); mWindowFrames.dumpDebug(proto, WINDOW_FRAMES); @@ -3795,10 +3793,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP @Override void dump(PrintWriter pw, String prefix, boolean dumpAll) { - final ActivityStack stack = getStack(); pw.print(prefix + "mDisplayId=" + getDisplayId()); - if (stack != null) { - pw.print(" stackId=" + stack.mStackId); + if (getRootTask() != null) { + pw.print(" rootTaskId=" + getRootTaskId()); } pw.println(" mSession=" + mSession + " mClient=" + mClient.asBinder()); @@ -5271,7 +5268,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP outPoint.offset(-parentBounds.left, -parentBounds.top); } - ActivityStack stack = getStack(); + ActivityStack stack = getRootTask(); // If we have stack outsets, that means the top-left // will be outset, and we need to inset ourselves diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 6189fbdbfb78..069ee4fea8ec 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -1013,7 +1013,7 @@ class WindowStateAnimator { mSurfaceController.deferTransactionUntil(mSurfaceController.mSurfaceControl, mWin.getFrameNumber()); } else { - final ActivityStack stack = mWin.getStack(); + final ActivityStack stack = mWin.getRootTask(); mTmpPos.x = 0; mTmpPos.y = 0; if (stack != null) { diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java index ed9cdf4caa94..4f84ee17b087 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java @@ -233,7 +233,7 @@ public class ActivityDisplayTests extends ActivityTestsBase { final ActivityStack pinnedStack = display.createStack( WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */); - assertEquals(pinnedStack, display.getPinnedStack()); + assertEquals(pinnedStack, display.getRootPinnedTask()); assertEquals(pinnedStack, display.getTopStack()); final ActivityStack anotherAlwaysOnTopStack = display.createStack( diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index c60ca48f0b3d..ebe4ab99663a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -136,7 +136,7 @@ public class ActivityRecordTests extends ActivityTestsBase { public void testStackCleanupOnTaskRemoval() { mStack.removeChild(mTask, null /*reason*/); // Stack should be gone on task removal. - assertNull(mService.mRootWindowContainer.getStack(mStack.mStackId)); + assertNull(mService.mRootWindowContainer.getStack(mStack.mTaskId)); } @Test @@ -1010,7 +1010,7 @@ public class ActivityRecordTests extends ActivityTestsBase { @Test public void testDestroyIfPossible_lastActivityAboveEmptyHomeStack() { // Empty the home stack. - final ActivityStack homeStack = mActivity.getDisplay().getHomeStack(); + final ActivityStack homeStack = mActivity.getDisplay().getRootHomeTask(); homeStack.forAllTasks((t) -> { homeStack.removeChild(t, "test"); }, true /* traverseTopToBottom */, homeStack); @@ -1036,7 +1036,7 @@ public class ActivityRecordTests extends ActivityTestsBase { @Test public void testCompleteFinishing_lastActivityAboveEmptyHomeStack() { // Empty the home stack. - final ActivityStack homeStack = mActivity.getDisplay().getHomeStack(); + final ActivityStack homeStack = mActivity.getDisplay().getRootHomeTask(); homeStack.forAllTasks((t) -> { homeStack.removeChild(t, "test"); }, true /* traverseTopToBottom */, homeStack); @@ -1136,7 +1136,7 @@ public class ActivityRecordTests extends ActivityTestsBase { @Test public void testRemoveFromHistory() { - final ActivityStack stack = mActivity.getActivityStack(); + final ActivityStack stack = mActivity.getRootTask(); final Task task = mActivity.getTask(); mActivity.removeFromHistory("test"); diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java index 9e54f4044e0a..f702d5d91f9e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java @@ -153,7 +153,7 @@ public class ActivityStarterTests extends ActivityTestsBase { assertThat((Object) task2.getStack()).isInstanceOf(ActivityStack.class); mStarter.updateBounds(task2, bounds); - verify(mService, times(1)).animateResizePinnedStack(eq(task2.getStack().mStackId), + verify(mService, times(1)).animateResizePinnedStack(eq(task2.getRootTaskId()), eq(bounds), anyInt()); // In the case of no animation, the stack and task bounds should be set immediately. @@ -446,13 +446,13 @@ public class ActivityStarterTests extends ActivityTestsBase { new ActivityBuilder(mService).setCreateTask(true).build(); final ActivityRecord splitSecondReusableActivity = new ActivityBuilder(mService).setCreateTask(true).build(); - splitPrimaryFocusActivity.getActivityStack() + splitPrimaryFocusActivity.getRootTask() .setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); - splitSecondReusableActivity.getActivityStack() + splitSecondReusableActivity.getRootTask() .setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY); // Set focus back to primary. - splitPrimaryFocusActivity.getActivityStack().moveToFront("testSplitScreenDeliverToTop"); + splitPrimaryFocusActivity.getRootTask().moveToFront("testSplitScreenDeliverToTop"); // Start activity and delivered new intent. starter.getIntent().setComponent(splitSecondReusableActivity.mActivityComponent); @@ -477,18 +477,18 @@ public class ActivityStarterTests extends ActivityTestsBase { new ActivityBuilder(mService).setCreateTask(true).build(); final ActivityRecord splitPrimaryFocusActivity = new ActivityBuilder(mService).setCreateTask(true).build(); - splitPrimaryFocusActivity.getActivityStack() + splitPrimaryFocusActivity.getRootTask() .setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); - splitSecondReusableActivity.getActivityStack() + splitSecondReusableActivity.getRootTask() .setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY); - splitSecondTopActivity.getActivityStack() + splitSecondTopActivity.getRootTask() .setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY); // Make it on top of split-screen-secondary. - splitSecondTopActivity.getActivityStack().moveToFront("testSplitScreenTaskToFront"); + splitSecondTopActivity.getRootTask().moveToFront("testSplitScreenTaskToFront"); // Let primary stack has focus. - splitPrimaryFocusActivity.getActivityStack().moveToFront("testSplitScreenTaskToFront"); + splitPrimaryFocusActivity.getRootTask().moveToFront("testSplitScreenTaskToFront"); // Start activity and delivered new intent. starter.getIntent().setComponent(splitSecondReusableActivity.mActivityComponent); @@ -732,13 +732,13 @@ public class ActivityStarterTests extends ActivityTestsBase { final ActivityRecord activity = new ActivityBuilder(mService) .setCreateTask(true).build(); new ActivityBuilder(mService) - .setStack(activity.getActivityStack()) + .setStack(activity.getRootTask()) .setCreateTask(true).build(); // Create a top finishing activity. final ActivityRecord finishingTopActivity = new ActivityBuilder(mService) .setCreateTask(true).build(); - finishingTopActivity.getActivityStack().moveToFront("finishingTopActivity"); + finishingTopActivity.getRootTask().moveToFront("finishingTopActivity"); assertEquals(finishingTopActivity, mRootWindowContainer.topRunningActivity()); finishingTopActivity.finishing = true; @@ -997,8 +997,8 @@ public class ActivityStarterTests extends ActivityTestsBase { assertThat(outActivity[0].inSplitScreenWindowingMode()).isFalse(); // Move activity to split-screen-primary stack and make sure it has the focus. - top.getActivityStack().setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); - top.getActivityStack().moveToFront("testWindowingModeOptionsLaunchAdjacent"); + top.getRootTask().setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); + top.getRootTask().moveToFront("testWindowingModeOptionsLaunchAdjacent"); // Activity must landed on split-screen-secondary when launch adjacent. starter.setActivityOptions(options.toBundle()) diff --git a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java index cf1f0a822232..8b3a6cf7e15e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java @@ -284,7 +284,7 @@ public class LaunchParamsControllerTests extends ActivityTestsBase { doNothing().when(mService).moveStackToDisplay(anyInt(), anyInt()); mController.layoutTask(task, null /* windowLayout */); - verify(mService, times(1)).moveStackToDisplay(eq(task.getStackId()), + verify(mService, times(1)).moveStackToDisplay(eq(task.getRootTaskId()), eq(params.mPreferredDisplayId)); } diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java index 79f808e4687a..b5e7dd58f7cc 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -303,7 +303,7 @@ public class RecentTasksTest extends ActivityTestsBase { // other task Task task1 = createTaskBuilder(".Task1") .setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK) - .setStack(mDisplay.getHomeStack()).build(); + .setStack(mDisplay.getRootHomeTask()).build(); Task task2 = createTaskBuilder(".Task1") .setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK) .setStack(mStack).build(); @@ -792,7 +792,7 @@ public class RecentTasksTest extends ActivityTestsBase { public void testBackStackTasks_expectNoTrim() { mRecentTasks.setParameters(-1 /* min */, 1 /* max */, -1 /* ms */); - final ActivityStack homeStack = mDisplay.getHomeStack(); + final ActivityStack homeStack = mDisplay.getRootHomeTask(); final ActivityStack aboveHomeStack = mDisplay.createStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); @@ -812,7 +812,7 @@ public class RecentTasksTest extends ActivityTestsBase { final ActivityStack behindHomeStack = mDisplay.createStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); - final ActivityStack homeStack = mDisplay.getHomeStack(); + final ActivityStack homeStack = mDisplay.getRootHomeTask(); final ActivityStack aboveHomeStack = mDisplay.createStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); @@ -832,7 +832,7 @@ public class RecentTasksTest extends ActivityTestsBase { public void testOtherDisplayTasks_expectNoTrim() { mRecentTasks.setParameters(-1 /* min */, 1 /* max */, -1 /* ms */); - final ActivityStack homeStack = mDisplay.getHomeStack(); + final ActivityStack homeStack = mDisplay.getRootHomeTask(); final DisplayContent otherDisplay = addNewDisplayContentAt(DisplayContent.POSITION_TOP); final ActivityStack otherDisplayStack = otherDisplay.createStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java index 7e42c62d5ee2..b78107e9024f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java @@ -97,7 +97,7 @@ public class RecentsAnimationTest extends ActivityTestsBase { .setStack(recentsStack) .build(); ActivityRecord topActivity = new ActivityBuilder(mService).setCreateTask(true).build(); - topActivity.getActivityStack().moveToFront("testRecentsActivityVisiblility"); + topActivity.getRootTask().moveToFront("testRecentsActivityVisiblility"); doCallRealMethod().when(mRootWindowContainer).ensureActivitiesVisible( any() /* starting */, anyInt() /* configChanges */, @@ -187,7 +187,7 @@ public class RecentsAnimationTest extends ActivityTestsBase { recentActivity.app = null; // Start an activity on top. - new ActivityBuilder(mService).setCreateTask(true).build().getActivityStack().moveToFront( + new ActivityBuilder(mService).setCreateTask(true).build().getRootTask().moveToFront( "testRestartRecentsActivity"); doCallRealMethod().when(mRootWindowContainer).ensureActivitiesVisible( @@ -209,7 +209,7 @@ public class RecentsAnimationTest extends ActivityTestsBase { public void testSetLaunchTaskBehindOfTargetActivity() { DisplayContent display = mRootWindowContainer.getDefaultDisplay(); display.mDisplayContent.mBoundsAnimationController = mock(BoundsAnimationController.class); - ActivityStack homeStack = display.getHomeStack(); + ActivityStack homeStack = display.getRootHomeTask(); // Assume the home activity support recents. ActivityRecord targetActivity = homeStack.getTopNonFinishingActivity(); if (targetActivity == null) { @@ -229,7 +229,7 @@ public class RecentsAnimationTest extends ActivityTestsBase { new ActivityBuilder(mService) .setCreateTask(true) .build() - .getActivityStack() + .getRootTask() .moveToFront("Activity start"); // Start the recents animation. diff --git a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java index ea8d0821dae3..79db927d38f6 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java @@ -131,7 +131,7 @@ public class RootActivityContainerTests extends ActivityTestsBase { 0f /*aspectRatio*/, "initialMove"); final DisplayContent display = mFullscreenStack.getDisplay(); - ActivityStack pinnedStack = display.getPinnedStack(); + ActivityStack pinnedStack = display.getRootPinnedTask(); // Ensure a task has moved over. ensureStackPlacement(pinnedStack, firstActivity); ensureStackPlacement(mFullscreenStack, secondActivity); @@ -141,7 +141,7 @@ public class RootActivityContainerTests extends ActivityTestsBase { 0f /*aspectRatio*/, "secondMove"); // Need to get stacks again as a new instance might have been created. - pinnedStack = display.getPinnedStack(); + pinnedStack = display.getRootPinnedTask(); mFullscreenStack = display.getStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD); // Ensure stacks have swapped tasks. ensureStackPlacement(pinnedStack, secondActivity); @@ -417,7 +417,7 @@ public class RootActivityContainerTests extends ActivityTestsBase { @Test public void testResumeFocusedStacksStartsHomeActivity_NoActivities() { mFullscreenStack.removeIfPossible(); - mService.mRootWindowContainer.getDisplayContent(DEFAULT_DISPLAY).getHomeStack() + mService.mRootWindowContainer.getDisplayContent(DEFAULT_DISPLAY).getRootHomeTask() .removeIfPossible(); mService.mRootWindowContainer.getDisplayContent(DEFAULT_DISPLAY) .createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP); @@ -440,7 +440,7 @@ public class RootActivityContainerTests extends ActivityTestsBase { @Test public void testResumeFocusedStacksStartsHomeActivity_ActivityOnSecondaryScreen() { mFullscreenStack.removeIfPossible(); - mService.mRootWindowContainer.getDisplayContent(DEFAULT_DISPLAY).getHomeStack() + mService.mRootWindowContainer.getDisplayContent(DEFAULT_DISPLAY).getRootHomeTask() .removeIfPossible(); mService.mRootWindowContainer.getDisplayContent(DEFAULT_DISPLAY) .createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP); @@ -638,7 +638,7 @@ public class RootActivityContainerTests extends ActivityTestsBase { final ActivityRecord resolverActivity = mRootWindowContainer.topRunningActivity(); assertEquals(info, resolverActivity.info); - assertEquals(ACTIVITY_TYPE_STANDARD, resolverActivity.getActivityStack().getActivityType()); + assertEquals(ACTIVITY_TYPE_STANDARD, resolverActivity.getRootTask().getActivityType()); } /** diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskStackContainersTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskContainersTests.java index 6ad9f740576c..f2283973720f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskStackContainersTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskContainersTests.java @@ -46,7 +46,7 @@ import org.junit.runner.RunWith; @SmallTest @Presubmit @RunWith(WindowTestRunner.class) -public class TaskStackContainersTests extends WindowTestsBase { +public class TaskContainersTests extends WindowTestsBase { private ActivityStack mPinnedStack; diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskPositionerTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskPositionerTests.java index 897057165971..7aaf3fbccb5e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskPositionerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskPositionerTests.java @@ -85,7 +85,7 @@ public class TaskPositionerTests extends WindowTestsBase { mPositioner.register(mDisplayContent, win); - win.getStack().setWindowingMode(WINDOWING_MODE_FREEFORM); + win.getRootTask().setWindowingMode(WINDOWING_MODE_FREEFORM); } @After diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java index 6d0b54fd2ccd..5cf9c44ee9e4 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -278,7 +278,7 @@ public class WindowStateTests extends WindowTestsBase { spyOn(stack); doReturn(true).when(controller).isMinimizedDock(); doReturn(true).when(controller).isHomeStackResizable(); - doReturn(stack).when(appWindow).getStack(); + doReturn(stack).when(appWindow).getRootTask(); // Make sure canBeImeTarget is false due to shouldIgnoreInput is true; assertFalse(appWindow.canBeImeTarget()); |