diff options
9 files changed, 353 insertions, 300 deletions
diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java index 8839cfc06cb3..6ed0555218af 100644 --- a/services/core/java/com/android/server/am/ActivityDisplay.java +++ b/services/core/java/com/android/server/am/ActivityDisplay.java @@ -16,6 +16,7 @@ package com.android.server.am; +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; @@ -45,13 +46,14 @@ import android.view.Display; import com.android.internal.annotations.VisibleForTesting; import com.android.server.wm.ConfigurationContainer; +import java.io.PrintWriter; import java.util.ArrayList; /** * Exactly one of these classes per Display in the system. Capable of holding zero or more * attached {@link ActivityStack}s. */ -class ActivityDisplay extends ConfigurationContainer { +class ActivityDisplay extends ConfigurationContainer<ActivityStack> { private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityDisplay" : TAG_AM; private static final String TAG_STACK = TAG + POSTFIX_STACK; @@ -65,7 +67,7 @@ class ActivityDisplay extends ConfigurationContainer { /** All of the stacks on this display. Order matters, topmost stack is in front of all other * stacks, bottommost behind. Accessed directly by ActivityManager package classes */ - final ArrayList<ActivityStack> mStacks = new ArrayList<>(); + private final ArrayList<ActivityStack> mStacks = new ArrayList<>(); /** Array of all UIDs that are present on the display. */ private IntArray mDisplayAccessUIDs = new IntArray(); @@ -77,6 +79,13 @@ class ActivityDisplay extends ConfigurationContainer { private boolean mSleeping; + // Cached reference to some special stacks 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; + ActivityDisplay(ActivityStackSupervisor supervisor, int displayId) { mSupervisor = supervisor; mDisplayId = displayId; @@ -95,6 +104,7 @@ class ActivityDisplay extends ConfigurationContainer { } if (DEBUG_STACK) Slog.v(TAG_STACK, "addChild: attaching " + stack + " to displayId=" + mDisplayId + " position=" + position); + addStackReferenceIfNeeded(stack); positionChildAt(stack, position); mSupervisor.mService.updateSleepIfNeededLocked(); } @@ -103,6 +113,7 @@ class ActivityDisplay extends ConfigurationContainer { if (DEBUG_STACK) Slog.v(TAG_STACK, "removeChild: detaching " + stack + " from displayId=" + mDisplayId); mStacks.remove(stack); + removeStackReferenceIfNeeded(stack); mSupervisor.mService.updateSleepIfNeededLocked(); } @@ -147,6 +158,16 @@ class ActivityDisplay extends ConfigurationContainer { * @see ConfigurationContainer#isCompatible(int, int) */ <T extends ActivityStack> T getStack(int windowingMode, int activityType) { + if (activityType == ACTIVITY_TYPE_HOME) { + return (T) mHomeStack; + } else if (activityType == ACTIVITY_TYPE_RECENTS) { + return (T) mRecentsStack; + } + if (windowingMode == WINDOWING_MODE_PINNED) { + return (T) mPinnedStack; + } else if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { + return (T) mSplitScreenPrimaryStack; + } for (int i = mStacks.size() - 1; i >= 0; --i) { final ActivityStack stack = mStacks.get(i); // TODO: Should undefined windowing and activity type be compatible with standard type? @@ -217,7 +238,7 @@ class ActivityDisplay extends ConfigurationContainer { } } - final boolean inSplitScreenMode = hasSplitScreenStack(); + final boolean inSplitScreenMode = hasSplitScreenPrimaryStack(); if (!inSplitScreenMode && windowingMode == WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY) { // Switch to fullscreen windowing mode if we are not in split-screen mode and we are @@ -275,7 +296,7 @@ class ActivityDisplay extends ConfigurationContainer { if (stack.getWindowingMode() != windowingMode) { continue; } - mSupervisor.removeStackLocked(stack.mStackId); + mSupervisor.removeStack(stack); } } } @@ -290,12 +311,63 @@ class ActivityDisplay extends ConfigurationContainer { for (int i = mStacks.size() - 1; i >= 0; --i) { final ActivityStack stack = mStacks.get(i); if (stack.getActivityType() == activityType) { - mSupervisor.removeStackLocked(stack.mStackId); + mSupervisor.removeStack(stack); } } } } + void onStackWindowingModeChanged(ActivityStack stack) { + removeStackReferenceIfNeeded(stack); + addStackReferenceIfNeeded(stack); + } + + private void addStackReferenceIfNeeded(ActivityStack stack) { + final int activityType = stack.getActivityType(); + final int windowingMode = stack.getWindowingMode(); + + if (activityType == ACTIVITY_TYPE_HOME) { + if (mHomeStack != null && mHomeStack != stack) { + throw new IllegalArgumentException("addStackReferenceIfNeeded: home stack=" + + mHomeStack + " already exist on display=" + this + " stack=" + stack); + } + mHomeStack = stack; + } else if (activityType == ACTIVITY_TYPE_RECENTS) { + if (mRecentsStack != null && mRecentsStack != stack) { + throw new IllegalArgumentException("addStackReferenceIfNeeded: recents stack=" + + mRecentsStack + " already exist on display=" + this + " stack=" + stack); + } + mRecentsStack = stack; + } + if (windowingMode == WINDOWING_MODE_PINNED) { + if (mPinnedStack != null && mPinnedStack != stack) { + throw new IllegalArgumentException("addStackReferenceIfNeeded: pinned stack=" + + mPinnedStack + " already exist on display=" + this + + " stack=" + stack); + } + mPinnedStack = stack; + } else if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { + if (mSplitScreenPrimaryStack != null && mSplitScreenPrimaryStack != stack) { + throw new IllegalArgumentException("addStackReferenceIfNeeded:" + + " split-screen-primary" + " stack=" + mSplitScreenPrimaryStack + + " already exist on display=" + this + " stack=" + stack); + } + mSplitScreenPrimaryStack = stack; + } + } + + private 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; + } + } + /** Returns the top visible stack activity type that isn't in the exclude windowing mode. */ int getTopVisibleStackActivityType(int excludeWindowingMode) { for (int i = mStacks.size() - 1; i >= 0; --i) { @@ -310,20 +382,42 @@ class ActivityDisplay extends ConfigurationContainer { return ACTIVITY_TYPE_UNDEFINED; } - ActivityStack getSplitScreenStack() { - return getStack(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_UNDEFINED); + /** + * Get the topmost stack on the display. It may be different from focused stack, because + * focus may be on another display. + */ + ActivityStack getTopStack() { + return mStacks.isEmpty() ? null : mStacks.get(mStacks.size() - 1); + } + + boolean isTopStack(ActivityStack stack) { + return stack == getTopStack(); } - boolean hasSplitScreenStack() { - return getSplitScreenStack() != null; + int getIndexOf(ActivityStack stack) { + return mStacks.indexOf(stack); + } + + void onLockTaskPackagesUpdated() { + for (int i = mStacks.size() - 1; i >= 0; --i) { + mStacks.get(i).onLockTaskPackagesUpdated(); + } + } + + ActivityStack getSplitScreenPrimaryStack() { + return mSplitScreenPrimaryStack; + } + + boolean hasSplitScreenPrimaryStack() { + return mSplitScreenPrimaryStack != null; } PinnedActivityStack getPinnedStack() { - return getStack(WINDOWING_MODE_PINNED, ACTIVITY_TYPE_UNDEFINED); + return (PinnedActivityStack) mPinnedStack; } boolean hasPinnedStack() { - return getPinnedStack() != null; + return mPinnedStack != null; } @Override @@ -337,7 +431,7 @@ class ActivityDisplay extends ConfigurationContainer { } @Override - protected ConfigurationContainer getChildAt(int index) { + protected ActivityStack getChildAt(int index) { return mStacks.get(index); } @@ -385,6 +479,10 @@ class ActivityDisplay extends ConfigurationContainer { mSleeping = asleep; } + public void dump(PrintWriter pw, String prefix) { + pw.println(prefix + "displayId=" + mDisplayId + " mStacks=" + mStacks); + } + public void writeToProto(ProtoOutputStream proto, long fieldId) { final long token = proto.start(fieldId); super.writeToProto(proto, CONFIGURATION_CONTAINER); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 5e10adaf1b1f..b6afd91aae0c 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -176,7 +176,6 @@ import static com.android.server.am.TaskRecord.INVALID_TASK_ID; import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_DONT_LOCK; import static com.android.server.am.TaskRecord.REPARENT_KEEP_STACK_AT_FRONT; import static com.android.server.am.TaskRecord.REPARENT_LEAVE_STACK_IN_PLACE; -import static com.android.server.am.proto.ActivityManagerServiceProto.ACTIVITIES; import static com.android.server.wm.AppTransition.TRANSIT_ACTIVITY_OPEN; import static com.android.server.wm.AppTransition.TRANSIT_NONE; import static com.android.server.wm.AppTransition.TRANSIT_TASK_IN_PLACE; @@ -209,7 +208,6 @@ import android.app.ContentProviderHolder; import android.app.Dialog; import android.app.IActivityController; import android.app.IActivityManager; -import android.app.IAppTask; import android.app.IApplicationThread; import android.app.IInstrumentationWatcher; import android.app.INotificationManager; @@ -10157,11 +10155,14 @@ public class ActivityManagerService extends IActivityManager.Stub final long ident = Binder.clearCallingIdentity(); try { final ActivityStack stack = mStackSupervisor.getStack(stackId); - if (stack != null && !stack.isActivityTypeStandardOrUndefined()) { + if (stack == null) { + return; + } + if (!stack.isActivityTypeStandardOrUndefined()) { throw new IllegalArgumentException( "Removing non-standard stack is not allowed."); } - mStackSupervisor.removeStackLocked(stackId); + mStackSupervisor.removeStack(stack); } finally { Binder.restoreCallingIdentity(ident); } @@ -10527,7 +10528,7 @@ public class ActivityManagerService extends IActivityManager.Stub try { synchronized (this) { final ActivityStack stack = - mStackSupervisor.getDefaultDisplay().getSplitScreenStack(); + mStackSupervisor.getDefaultDisplay().getSplitScreenPrimaryStack(); if (toTop) { mStackSupervisor.resizeStackLocked(stack, null /* destBounds */, null /* tempTaskBounds */, null /* tempTaskInsetBounds */, diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 790c9a3cf259..40e568c27900 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -1558,7 +1558,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo // On devices that support leanback only (Android TV), Recents activity can only be // visible if the home stack is the focused stack or we are in split-screen mode. final ActivityDisplay display = getDisplay(); - boolean hasSplitScreenStack = display != null && display.hasSplitScreenStack(); + boolean hasSplitScreenStack = display != null && display.hasSplitScreenPrimaryStack(); isVisible = hasSplitScreenStack || mStackSupervisor.isFocusedStack(getStack()); } diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 3d3bae3dc24f..f0811dda105e 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -102,9 +102,6 @@ import android.app.ActivityOptions; import android.app.AppGlobals; import android.app.IActivityController; import android.app.ResultInfo; -import android.app.WindowConfiguration; -import android.app.WindowConfiguration.ActivityType; -import android.app.WindowConfiguration.WindowingMode; import android.content.ComponentName; import android.content.Intent; import android.content.pm.ActivityInfo; @@ -473,6 +470,16 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai return mWindowContainerController; } + @Override + public void onConfigurationChanged(Configuration newParentConfig) { + final int prevWindowingMode = getWindowingMode(); + super.onConfigurationChanged(newParentConfig); + final ActivityDisplay display = getDisplay(); + if (display != null && prevWindowingMode != getWindowingMode()) { + display.onStackWindowingModeChanged(this); + } + } + /** Adds the stack to specified display and calls WindowManager to do the same. */ void reparent(ActivityDisplay activityDisplay, boolean onTop) { removeFromDisplay(); @@ -1529,6 +1536,10 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai && !mForceHidden; } + boolean isTopStackOnDisplay() { + return getDisplay().isTopStack(this); + } + /** * Returns true if the stack should be visible. * @@ -1539,22 +1550,15 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai return false; } - if (mStackSupervisor.isFrontStackOnDisplay(this) || mStackSupervisor.isFocusedStack(this)) { + final ActivityDisplay display = getDisplay(); + if (isTopStackOnDisplay() || mStackSupervisor.isFocusedStack(this)) { return true; } - final ActivityDisplay display = getDisplay(); - final ArrayList<ActivityStack> displayStacks = display.mStacks; - final int stackIndex = displayStacks.indexOf(this); - - if (stackIndex == displayStacks.size() - 1) { - Slog.wtf(TAG, - "Stack=" + this + " isn't front stack but is at the top of the stack list"); - return false; - } + final int stackIndex = display.getIndexOf(this); // Check position and visibility of this stack relative to the front stack on its display. - final ActivityStack topStack = getTopStackOnDisplay(); + final ActivityStack topStack = getDisplay().getTopStack(); final int windowingMode = getWindowingMode(); final int activityType = getActivityType(); @@ -1571,22 +1575,21 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // A case would be if recents stack exists but has no tasks and is below the docked stack // and home stack is below recents if (activityType == ACTIVITY_TYPE_HOME) { - final ActivityStack splitScreenStack = display.getStack( - WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_UNDEFINED); - int dockedStackIndex = displayStacks.indexOf(splitScreenStack); + final ActivityStack splitScreenStack = display.getSplitScreenPrimaryStack(); + int dockedStackIndex = display.getIndexOf(splitScreenStack); if (dockedStackIndex > stackIndex && stackIndex != dockedStackIndex - 1) { return false; } } // Find the first stack behind front stack that actually got something visible. - int stackBehindTopIndex = displayStacks.indexOf(topStack) - 1; + int stackBehindTopIndex = display.getIndexOf(topStack) - 1; while (stackBehindTopIndex >= 0 && - displayStacks.get(stackBehindTopIndex).topRunningActivityLocked() == null) { + display.getChildAt(stackBehindTopIndex).topRunningActivityLocked() == null) { stackBehindTopIndex--; } final ActivityStack stackBehindTop = (stackBehindTopIndex >= 0) - ? displayStacks.get(stackBehindTopIndex) : null; + ? display.getChildAt(stackBehindTopIndex) : null; int stackBehindTopWindowingMode = WINDOWING_MODE_UNDEFINED; int stackBehindTopActivityType = ACTIVITY_TYPE_UNDEFINED; if (stackBehindTop != null) { @@ -1635,8 +1638,9 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai return false; } - for (int i = stackIndex + 1; i < displayStacks.size(); i++) { - final ActivityStack stack = displayStacks.get(i); + final int stackCount = display.getChildCount(); + for (int i = stackIndex + 1; i < stackCount; i++) { + final ActivityStack stack = display.getChildAt(i); if (!stack.mFullscreen && !stack.hasFullscreenTask()) { continue; @@ -2572,8 +2576,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai Slog.i(TAG, "Restarting because process died: " + next); if (!next.hasBeenLaunched) { next.hasBeenLaunched = true; - } else if (SHOW_APP_STARTING_PREVIEW && lastStack != null && - mStackSupervisor.isFrontStackOnDisplay(lastStack)) { + } else if (SHOW_APP_STARTING_PREVIEW && lastStack != null + && lastStack.isTopStackOnDisplay()) { next.showStartingWindow(null /* prev */, false /* newTask */, false /* taskSwitch */); } @@ -4428,7 +4432,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai AppTimeTracker timeTracker, String reason) { if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "moveTaskToFront: " + tr); - final ActivityStack topStack = getTopStackOnDisplay(); + final ActivityStack topStack = getDisplay().getTopStack(); final ActivityRecord topActivity = topStack != null ? topStack.topActivity() : null; final int numTasks = mTaskHistory.size(); final int index = mTaskHistory.indexOf(tr); @@ -4518,7 +4522,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // If we have a watcher, preflight the move before committing to it. First check // for *other* available tasks, but if none are available, then try again allowing the // current task to be selected. - if (mStackSupervisor.isFrontStackOnDisplay(this) && mService.mController != null) { + if (isTopStackOnDisplay() && mService.mController != null) { ActivityRecord next = topRunningActivityLocked(null, taskId); if (next == null) { next = topRunningActivityLocked(null, 0); @@ -4566,7 +4570,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai } if (inPinnedWindowingMode()) { - mStackSupervisor.removeStackLocked(mStackId); + mStackSupervisor.removeStack(this); return true; } @@ -4598,15 +4602,6 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai return true; } - /** - * Get the topmost stack on the current display. It may be different from focused stack, because - * focus may be on another display. - */ - private ActivityStack getTopStackOnDisplay() { - final ArrayList<ActivityStack> stacks = getDisplay().mStacks; - return stacks.isEmpty() ? null : stacks.get(stacks.size() - 1); - } - static void logStartActivity(int tag, ActivityRecord r, TaskRecord task) { final Uri data = r.intent.getData(); final String strData = data != null ? data.toSafeString() : null; @@ -5249,7 +5244,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai + mTaskHistory.size() + " tasks}"; } - void onLockTaskPackagesUpdatedLocked() { + void onLockTaskPackagesUpdated() { for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) { mTaskHistory.get(taskNdx).setLockTaskAuth(); } diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 333d759ba7a3..5c91e3ccd050 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -631,15 +631,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D return stack != null && stack == mFocusedStack; } - /** The top most stack on its display. */ - boolean isFrontStackOnDisplay(ActivityStack stack) { - return isFrontOfStackList(stack, stack.getDisplay().mStacks); - } - - private boolean isFrontOfStackList(ActivityStack stack, List<ActivityStack> stackList) { - return stack == stackList.get((stackList.size() - 1)); - } - /** NOTE: Should only be called from {@link ActivityStack#moveToFront} */ void setFocusStackUnchecked(String reason, ActivityStack focusCandidate) { if (!focusCandidate.isFocusable()) { @@ -735,9 +726,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D int numDisplays = mActivityDisplays.size(); for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { - ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); final TaskRecord task = stack.taskForIdLocked(id); if (task != null) { return task; @@ -780,9 +771,10 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D ActivityRecord isInAnyStackLocked(IBinder token) { int numDisplays = mActivityDisplays.size(); for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { - ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityRecord r = stacks.get(stackNdx).isInStackLocked(token); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); + final ActivityRecord r = stack.isInStackLocked(token); if (r != null) { return r; } @@ -820,18 +812,21 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D void lockAllProfileTasks(@UserIdInt int userId) { mWindowManager.deferSurfaceLayout(); try { - final List<ActivityStack> stacks = getStacks(); - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; stackNdx--) { - final List<TaskRecord> tasks = stacks.get(stackNdx).getAllTasks(); - for (int taskNdx = tasks.size() - 1; taskNdx >= 0; taskNdx--) { - final TaskRecord task = tasks.get(taskNdx); - - // Check the task for a top activity belonging to userId, or returning a result - // to an activity belonging to userId. Example case: a document picker for - // personal files, opened by a work app, should still get locked. - if (taskTopActivityIsUser(task, userId)) { - mService.mTaskChangeNotificationController.notifyTaskProfileLocked( - task.taskId, userId); + for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); + final List<TaskRecord> tasks = stack.getAllTasks(); + for (int taskNdx = tasks.size() - 1; taskNdx >= 0; taskNdx--) { + final TaskRecord task = tasks.get(taskNdx); + + // Check the task for a top activity belonging to userId, or returning a + // result to an activity belonging to userId. Example case: a document + // picker for personal files, opened by a work app, should still get locked. + if (taskTopActivityIsUser(task, userId)) { + mService.mTaskChangeNotificationController.notifyTaskProfileLocked( + task.taskId, userId); + } } } } @@ -897,9 +892,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D final String processName = app.processName; boolean didSomething = false; for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); if (!isFocusedStack(stack)) { continue; } @@ -932,9 +927,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D boolean allResumedActivitiesIdle() { for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); if (!isFocusedStack(stack) || stack.numActivities() == 0) { continue; } @@ -953,9 +948,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D boolean allResumedActivitiesComplete() { for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); if (isFocusedStack(stack)) { final ActivityRecord r = stack.mResumedActivity; if (r != null && r.state != RESUMED) { @@ -972,12 +967,12 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D return true; } - boolean allResumedActivitiesVisible() { + private boolean allResumedActivitiesVisible() { boolean foundResumed = false; for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); final ActivityRecord r = stack.mResumedActivity; if (r != null) { if (!r.nowVisible || mActivitiesWaitingForVisibleActivity.contains(r)) { @@ -1001,9 +996,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D boolean pauseBackStacks(boolean userLeaving, ActivityRecord resuming, boolean dontWait) { boolean someActivityPaused = false; for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); if (!isFocusedStack(stack) && stack.mResumedActivity != null) { if (DEBUG_STATES) Slog.d(TAG_STATES, "pauseBackStacks: stack=" + stack + " mResumedActivity=" + stack.mResumedActivity); @@ -1018,9 +1013,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D boolean allPausedActivitiesComplete() { boolean pausing = true; for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); final ActivityRecord r = stack.mPausingActivity; if (r != null && r.state != PAUSED && r.state != STOPPED && r.state != STOPPING) { if (DEBUG_STATES) { @@ -1038,9 +1033,10 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D void cancelInitializingActivities() { for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - stacks.get(stackNdx).cancelInitializingActivities(); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); + stack.cancelInitializingActivities(); } } } @@ -1138,13 +1134,10 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D for (int i = mTmpOrderedDisplayIds.size() - 1; i >= 0; --i) { final int displayId = mTmpOrderedDisplayIds.get(i); - final List<ActivityStack> stacks = mActivityDisplays.get(displayId).mStacks; - if (stacks == null) { - continue; - } - for (int j = stacks.size() - 1; j >= 0; --j) { - final ActivityStack stack = stacks.get(j); - if (stack != focusedStack && isFrontStackOnDisplay(stack) && stack.isFocusable()) { + final ActivityDisplay display = mActivityDisplays.get(displayId); + for (int j = display.getChildCount() - 1; j >= 0; --j) { + final ActivityStack stack = display.getChildAt(j); + if (stack != focusedStack && stack.isTopStackOnDisplay() && stack.isFocusable()) { r = stack.topRunningActivityLocked(); if (r != null) { return r; @@ -1160,9 +1153,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D ArrayList<ArrayList<RunningTaskInfo>> runningTaskLists = new ArrayList<>(); final int numDisplays = mActivityDisplays.size(); for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { - ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); ArrayList<RunningTaskInfo> stackTaskList = new ArrayList<>(); runningTaskLists.add(stackTaskList); stack.getTasksLocked(stackTaskList, callingUid, allowed); @@ -1942,9 +1935,10 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D boolean handleAppDiedLocked(ProcessRecord app) { boolean hasVisibleActivities = false; for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - hasVisibleActivities |= stacks.get(stackNdx).handleAppDiedLocked(app); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); + hasVisibleActivities |= stack.handleAppDiedLocked(app); } } return hasVisibleActivities; @@ -1952,9 +1946,10 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D void closeSystemDialogsLocked() { for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - stacks.get(stackNdx).closeSystemDialogsLocked(); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); + stack.closeSystemDialogsLocked(); } } } @@ -1980,9 +1975,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D boolean doit, boolean evenPersistent, int userId) { boolean didSomething = false; for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); if (stack.finishDisabledPackageActivitiesLocked( packageName, filterByClasses, doit, evenPersistent, userId)) { didSomething = true; @@ -2002,9 +1997,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // hosted by the process that is actually still the foreground. ProcessRecord fgApp = null; for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); if (isFocusedStack(stack)) { if (stack.mResumedActivity != null) { fgApp = stack.mResumedActivity.app; @@ -2054,9 +2049,10 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D void updateActivityApplicationInfoLocked(ApplicationInfo aInfo) { for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - stacks.get(stackNdx).updateActivityApplicationInfoLocked(aInfo); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); + stack.updateActivityApplicationInfoLocked(aInfo); } } } @@ -2065,10 +2061,10 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D TaskRecord finishedTask = null; ActivityStack focusedStack = getFocusedStack(); for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - final int numStacks = stacks.size(); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + final int numStacks = display.getChildCount(); for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityStack stack = display.getChildAt(stackNdx); TaskRecord t = stack.finishTopRunningActivityLocked(app, reason); if (stack == focusedStack || finishedTask == null) { finishedTask = t; @@ -2080,10 +2076,10 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D void finishVoiceTask(IVoiceInteractionSession session) { for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - final int numStacks = stacks.size(); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + final int numStacks = display.getChildCount(); for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityStack stack = display.getChildAt(stackNdx); stack.finishVoiceTask(session); } } @@ -2139,7 +2135,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D "findTaskToMoveToFront: moved to front of stack=" + currentStack); handleNonResizableTaskIfNeeded(task, WINDOWING_MODE_UNDEFINED, DEFAULT_DISPLAY, - currentStack.mStackId, forceNonResizeable); + currentStack, forceNonResizeable); } boolean canUseActivityOptionsLaunchBounds(ActivityOptions options) { @@ -2334,8 +2330,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } final ActivityDisplay display = getActivityDisplayOrCreateLocked(displayId); if (display != null) { - for (int i = display.mStacks.size() - 1; i >= 0; --i) { - stack = (T) display.mStacks.get(i); + for (int i = display.getChildCount() - 1; i >= 0; --i) { + stack = (T) display.getChildAt(i); if (stack.isCompatible(windowingMode, activityType)) { return stack; } @@ -2403,8 +2399,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } // Return the topmost valid stack on the display. - for (int i = activityDisplay.mStacks.size() - 1; i >= 0; --i) { - final ActivityStack stack = activityDisplay.mStacks.get(i); + for (int i = activityDisplay.getChildCount() - 1; i >= 0; --i) { + final ActivityStack stack = activityDisplay.getChildAt(i); if (isValidLaunchStack(stack, displayId, r)) { return stack; } @@ -2442,18 +2438,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D return false; } - ArrayList<ActivityStack> getStacks() { - ArrayList<ActivityStack> allStacks = new ArrayList<>(); - for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - allStacks.addAll(mActivityDisplays.valueAt(displayNdx).mStacks); - } - return allStacks; - } - - ArrayList<ActivityStack> getStacksOnDefaultDisplay() { - return mActivityDisplays.valueAt(DEFAULT_DISPLAY).mStacks; - } - /** * Get next focusable stack in the system. This will search across displays and stacks * in last-focused order for a focusable and visible stack, different from the target stack. @@ -2468,10 +2452,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D for (int i = mTmpOrderedDisplayIds.size() - 1; i >= 0; --i) { final int displayId = mTmpOrderedDisplayIds.get(i); // If a display is registered in WM, it must also be available in AM. - @SuppressWarnings("ConstantConditions") - final List<ActivityStack> stacks = getActivityDisplayOrCreateLocked(displayId).mStacks; - for (int j = stacks.size() - 1; j >= 0; --j) { - final ActivityStack stack = stacks.get(j); + final ActivityDisplay display = getActivityDisplayOrCreateLocked(displayId); + for (int j = display.getChildCount() - 1; j >= 0; --j) { + final ActivityStack stack = display.getChildAt(j); if (stack != currentFocus && stack.isFocusable() && stack.shouldBeVisible(null)) { return stack; @@ -2539,7 +2522,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D return; } - final boolean splitScreenActive = getDefaultDisplay().hasSplitScreenStack(); + final boolean splitScreenActive = getDefaultDisplay().hasSplitScreenPrimaryStack(); if (!allowResizeInDockedMode && !stack.getWindowConfiguration().tasksAreFloating() && splitScreenActive) { // If the docked stack exists, don't resize non-floating stacks independently of the @@ -2614,9 +2597,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // We are moving all tasks from the docked stack to the fullscreen stack, // which is dismissing the docked stack, so resize all other stacks to // fullscreen here already so we don't end up with resize trashing. - final ArrayList<ActivityStack> displayStacks = toDisplay.mStacks; - for (int i = displayStacks.size() - 1; i >= 0; --i) { - final ActivityStack otherStack = displayStacks.get(i); + for (int i = toDisplay.getChildCount() - 1; i >= 0; --i) { + final ActivityStack otherStack = toDisplay.getChildAt(i); if (!otherStack.inSplitScreenSecondaryWindowingMode()) { continue; } @@ -2711,8 +2693,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D return; } - final ActivityStack stack = getDefaultDisplay().getStack( - WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_UNDEFINED); + final ActivityStack stack = getDefaultDisplay().getSplitScreenPrimaryStack(); if (stack == null) { Slog.w(TAG, "resizeDockedStackLocked: docked stack not found"); return; @@ -2741,10 +2722,10 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // static stacks need to be adjusted so they don't overlap with the docked stack. // We get the bounds to use from window manager which has been adjusted for any // screen controls and is also the same for all stacks. - final ArrayList<ActivityStack> stacks = getStacksOnDefaultDisplay(); + final ActivityDisplay display = getDefaultDisplay(); final Rect otherTaskRect = new Rect(); - for (int i = stacks.size() - 1; i >= 0; --i) { - final ActivityStack current = stacks.get(i); + for (int i = display.getChildCount() - 1; i >= 0; --i) { + final ActivityStack current = display.getChildAt(i); if (current.getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { continue; } @@ -2776,8 +2757,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D void resizePinnedStackLocked(Rect pinnedBounds, Rect tempPinnedTaskBounds) { // TODO(multi-display): Pinned stack display should be passed in. - final PinnedActivityStack stack = getDefaultDisplay().getStack( - WINDOWING_MODE_PINNED, ACTIVITY_TYPE_UNDEFINED); + final PinnedActivityStack stack = getDefaultDisplay().getPinnedStack(); if (stack == null) { Slog.w(TAG, "resizePinnedStackLocked: pinned stack not found"); return; @@ -2815,12 +2795,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } } - private void removeStackInSurfaceTransaction(int stackId) { - final ActivityStack stack = getStack(stackId); - if (stack == null) { - return; - } - + private void removeStackInSurfaceTransaction(ActivityStack stack) { final ArrayList<TaskRecord> tasks = stack.getAllTasks(); if (stack.getWindowingMode() == WINDOWING_MODE_PINNED) { /** @@ -2850,12 +2825,12 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } /** - * Removes the stack associated with the given {@param stackId}. If the {@param stackId} is the + * Removes the stack associated with the given {@param stack}. If the {@param stack} is the * pinned stack, then its tasks are not explicitly removed when the stack is destroyed, but * instead moved back onto the fullscreen stack. */ - void removeStackLocked(int stackId) { - mWindowManager.inSurfaceTransaction(() -> removeStackInSurfaceTransaction(stackId)); + void removeStack(ActivityStack stack) { + mWindowManager.inSurfaceTransaction(() -> removeStackInSurfaceTransaction(stack)); } /** @@ -3273,9 +3248,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D ActivityRecord affinityMatch = null; if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Looking for task of " + r); for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); if (!r.hasCompatibleActivityType(stack)) { if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping stack: (mismatch activity/stack) " + stack); @@ -3308,12 +3283,13 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } ActivityRecord findActivityLocked(Intent intent, ActivityInfo info, - boolean compareIntentFilters) { + boolean compareIntentFilters) { for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityRecord ar = stacks.get(stackNdx) - .findActivityLocked(intent, info, compareIntentFilters); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); + final ActivityRecord ar = stack.findActivityLocked( + intent, info, compareIntentFilters); if (ar != null) { return ar; } @@ -3407,9 +3383,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } // Set the sleeping state of the stacks on the display. - final ArrayList<ActivityStack> stacks = display.mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); if (displayShouldSleep) { stack.goToSleepIfPossible(false /* shuttingDown */); } else { @@ -3471,12 +3446,13 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D private boolean putStacksToSleepLocked(boolean allowDelay, boolean shuttingDown) { boolean allSleep = true; for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); if (allowDelay) { - allSleep &= stacks.get(stackNdx).goToSleepIfPossible(shuttingDown); + allSleep &= stack.goToSleepIfPossible(shuttingDown); } else { - stacks.get(stackNdx).goToSleep(); + stack.goToSleep(); } } } @@ -3501,11 +3477,10 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D void handleAppCrashLocked(ProcessRecord app) { for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - int stackNdx = stacks.size() - 1; - while (stackNdx >= 0) { - stacks.get(stackNdx).handleAppCrashLocked(app); - stackNdx--; + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); + stack.handleAppCrashLocked(app); } } } @@ -3538,10 +3513,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D try { // First the front stacks. In case any are not fullscreen and are in front of home. for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - final int topStackNdx = stacks.size() - 1; - for (int stackNdx = topStackNdx; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); stack.ensureActivitiesVisibleLocked(starting, configChanges, preserveWindows); } } @@ -3552,10 +3526,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D void addStartingWindowsForVisibleActivities(boolean taskSwitch) { for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - final int topStackNdx = stacks.size() - 1; - for (int stackNdx = topStackNdx; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); stack.addStartingWindowsForVisibleActivities(taskSwitch); } } @@ -3571,20 +3544,20 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } mTaskLayersChanged = false; for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); displayNdx++) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); int baseLayer = 0; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - baseLayer += stacks.get(stackNdx).rankTaskLayers(baseLayer); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); + baseLayer += stack.rankTaskLayers(baseLayer); } } } void clearOtherAppTimeTrackers(AppTimeTracker except) { for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - final int topStackNdx = stacks.size() - 1; - for (int stackNdx = topStackNdx; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); stack.clearOtherAppTimeTrackers(except); } } @@ -3592,10 +3565,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D void scheduleDestroyAllActivities(ProcessRecord app, String reason) { for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - final int numStacks = stacks.size(); - for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); stack.scheduleDestroyActivities(app, reason); } } @@ -3647,10 +3619,11 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // let's iterate through the tasks and release the oldest one. final int numDisplays = mActivityDisplays.size(); for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + final int stackCount = display.getChildCount(); // Step through all stacks starting from behind, to hit the oldest things first. - for (int stackNdx = 0; stackNdx < stacks.size(); stackNdx++) { - final ActivityStack stack = stacks.get(stackNdx); + for (int stackNdx = 0; stackNdx < stackCount; stackNdx++) { + final ActivityStack stack = display.getChildAt(stackNdx); // Try to release activities in this stack; if we manage to, we are done. if (stack.releaseSomeActivitiesLocked(app, tasks, reason) > 0) { return; @@ -3662,7 +3635,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D boolean switchUserLocked(int userId, UserState uss) { final int focusStackId = mFocusedStack.getStackId(); // We dismiss the docked stack whenever we switch users. - final ActivityStack dockedStack = getDefaultDisplay().getSplitScreenStack(); + final ActivityStack dockedStack = getDefaultDisplay().getSplitScreenPrimaryStack(); if (dockedStack != null) { moveTasksToFullscreenStackLocked(dockedStack, mFocusedStack == dockedStack); } @@ -3677,9 +3650,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D mStartingUsers.add(uss); for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); stack.switchUserLocked(userId); TaskRecord task = stack.topTask(); if (task != null) { @@ -3777,9 +3750,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D void validateTopActivitiesLocked() { for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); final ActivityRecord r = stack.topRunningActivityLocked(); final ActivityState state = r == null ? DESTROYED : r.state; if (isFocusedStack(stack)) { @@ -3814,7 +3787,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D pw.print(prefix); pw.println("mUserStackInFront=" + mUserStackInFront); for (int i = mActivityDisplays.size() - 1; i >= 0; --i) { final ActivityDisplay display = mActivityDisplays.valueAt(i); - pw.println(prefix + "displayId=" + display.mDisplayId + " mStacks=" + display.mStacks); + display.dump(pw, prefix); } if (!mWaitingForActivityVisible.isEmpty()) { pw.print(prefix); pw.println("mWaitingForActivityVisible="); @@ -3871,9 +3844,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D ArrayList<ActivityRecord> activities = new ArrayList<>(); int numDisplays = mActivityDisplays.size(); for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { - ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); if (!dumpVisibleStacksOnly || stack.shouldBeVisible(null)) { activities.addAll(stack.getDumpActivitiesLocked(name)); } @@ -3906,9 +3879,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D ActivityDisplay activityDisplay = mActivityDisplays.valueAt(displayNdx); pw.print("Display #"); pw.print(activityDisplay.mDisplayId); pw.println(" (activities from top to bottom):"); - ArrayList<ActivityStack> stacks = activityDisplay.mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); pw.println(); pw.println(" Stack #" + stack.mStackId + ": type=" + activityTypeToString(stack.getActivityType()) @@ -4156,30 +4129,29 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } synchronized (mService) { - ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); - if (activityDisplay != null) { - final boolean destroyContentOnRemoval - = activityDisplay.shouldDestroyContentOnRemove(); - final ArrayList<ActivityStack> stacks = activityDisplay.mStacks; - while (!stacks.isEmpty()) { - final ActivityStack stack = stacks.get(0); - if (destroyContentOnRemoval) { - moveStackToDisplayLocked(stack.mStackId, DEFAULT_DISPLAY, - false /* onTop */); - stack.finishAllActivitiesLocked(true /* immediately */); - } else { - // Moving all tasks to fullscreen stack, because it's guaranteed to be - // a valid launch stack for all activities. This way the task history from - // external display will be preserved on primary after move. - moveTasksToFullscreenStackLocked(stack, true /* onTop */); - } + final ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); + if (activityDisplay == null) { + return; + } + final boolean destroyContentOnRemoval + = activityDisplay.shouldDestroyContentOnRemove(); + while (activityDisplay.getChildCount() > 0) { + final ActivityStack stack = activityDisplay.getChildAt(0); + if (destroyContentOnRemoval) { + moveStackToDisplayLocked(stack.mStackId, DEFAULT_DISPLAY, false /* onTop */); + stack.finishAllActivitiesLocked(true /* immediately */); + } else { + // Moving all tasks to fullscreen stack, because it's guaranteed to be + // a valid launch stack for all activities. This way the task history from + // external display will be preserved on primary after move. + moveTasksToFullscreenStackLocked(stack, true /* onTop */); } + } - releaseSleepTokens(activityDisplay); + releaseSleepTokens(activityDisplay); - mActivityDisplays.remove(displayId); - mWindowManager.onDisplayRemoved(displayId); - } + mActivityDisplays.remove(displayId); + mWindowManager.onDisplayRemoved(displayId); } } @@ -4251,7 +4223,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D info.userId = stack.mCurrentUser; info.visible = stack.shouldBeVisible(null); // A stack might be not attached to a display. - info.position = display != null ? display.mStacks.indexOf(stack) : 0; + info.position = display != null ? display.getIndexOf(stack) : 0; info.configuration.setTo(stack.getConfiguration()); ArrayList<TaskRecord> tasks = stack.getAllTasks(); @@ -4297,25 +4269,25 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D ArrayList<StackInfo> getAllStackInfosLocked() { ArrayList<StackInfo> list = new ArrayList<>(); for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); ++displayNdx) { - ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int ndx = stacks.size() - 1; ndx >= 0; --ndx) { - list.add(getStackInfo(stacks.get(ndx))); + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); + list.add(getStackInfo(stack)); } } return list; } void handleNonResizableTaskIfNeeded(TaskRecord task, int preferredWindowingMode, - int preferredDisplayId, int actualStackId) { + int preferredDisplayId, ActivityStack actualStack) { handleNonResizableTaskIfNeeded(task, preferredWindowingMode, preferredDisplayId, - actualStackId, false /* forceNonResizable */); + actualStack, false /* forceNonResizable */); } void handleNonResizableTaskIfNeeded(TaskRecord task, int preferredWindowingMode, - int preferredDisplayId, int actualStackId, boolean forceNonResizable) { + int preferredDisplayId, ActivityStack actualStack, boolean forceNonResizable) { final boolean isSecondaryDisplayPreferred = (preferredDisplayId != DEFAULT_DISPLAY && preferredDisplayId != INVALID_DISPLAY); - final ActivityStack actualStack = getStack(actualStackId); final boolean inSplitScreenMode = actualStack != null && actualStack.inSplitScreenWindowingMode(); if (((!inSplitScreenMode && preferredWindowingMode != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) @@ -4362,10 +4334,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // Dismiss docked stack. If task appeared to be in docked stack but is not resizable - // we need to move it to top of fullscreen stack, otherwise it will be covered. - final ActivityStack dockedStack = task.getStack().getDisplay().getSplitScreenStack(); + final ActivityStack dockedStack = task.getStack().getDisplay().getSplitScreenPrimaryStack(); if (dockedStack != null) { - moveTasksToFullscreenStackLocked(dockedStack, - actualStackId == dockedStack.getStackId()); + moveTasksToFullscreenStackLocked(dockedStack, actualStack == dockedStack); } } else if (topActivity != null && topActivity.isNonResizableOrForcedResizable() && !topActivity.noDisplay) { @@ -4577,14 +4548,13 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D if (display == null) { return null; } - final ArrayList<ActivityStack> stacks = display.mStacks; - for (int i = stacks.size() - 1; i >= 0; i--) { - if (stacks.get(i) == stack && i > 0) { - return stacks.get(i - 1); + for (int i = display.getChildCount() - 1; i >= 0; i--) { + if (display.getChildAt(i) == stack && i > 0) { + return display.getChildAt(i - 1); } } throw new IllegalStateException("Failed to find a stack behind stack=" + stack - + " in=" + stacks); + + " in=" + display); } /** @@ -4697,8 +4667,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D for (int i = mActivityDisplays.size() - 1; i >= 0; i--) { final ActivityDisplay display = mActivityDisplays.valueAt(i); // Traverse all stacks on a display. - for (int j = display.mStacks.size() - 1; j >= 0; j--) { - final ActivityStack stack = display.mStacks.get(j); + for (int j = display.getChildCount() - 1; j >= 0; --j) { + final ActivityStack stack = display.getChildAt(j); // Get top activity from a visible stack and add it to the list. if (stack.shouldBeVisible(null /* starting */)) { final ActivityRecord top = stack.topActivity(); diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index cceb57674daa..f39b97f51167 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -29,7 +29,6 @@ import static android.app.ActivityManager.START_TASK_TO_FRONT; import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; -import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; @@ -618,8 +617,7 @@ class ActivityStarter { } if (startedActivityStack.inSplitScreenPrimaryWindowingMode()) { - final ActivityStack homeStack = mSupervisor.getDefaultDisplay().getStack( - WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME); + final ActivityStack homeStack = mSupervisor.mHomeStack; final boolean homeStackVisible = homeStack != null && homeStack.isVisible(); if (homeStackVisible) { // We launch an activity while being in home stack, which means either launcher or @@ -1163,7 +1161,7 @@ class ActivityStarter { // Don't use mStartActivity.task to show the toast. We're not starting a new activity // but reusing 'top'. Fields in mStartActivity may not be fully initialized. mSupervisor.handleNonResizableTaskIfNeeded(top.getTask(), preferredWindowingMode, - preferredLaunchDisplayId, topStack.mStackId); + preferredLaunchDisplayId, topStack); return START_DELIVERED_TO_TOP; } @@ -1245,7 +1243,7 @@ class ActivityStarter { mSupervisor.updateUserStackLocked(mStartActivity.userId, mTargetStack); mSupervisor.handleNonResizableTaskIfNeeded(mStartActivity.getTask(), preferredWindowingMode, - preferredLaunchDisplayId, mTargetStack.mStackId); + preferredLaunchDisplayId, mTargetStack); return START_SUCCESS; } @@ -1666,7 +1664,7 @@ class ActivityStarter { } mSupervisor.handleNonResizableTaskIfNeeded(intentActivity.getTask(), - WINDOWING_MODE_UNDEFINED, DEFAULT_DISPLAY, mTargetStack.mStackId); + WINDOWING_MODE_UNDEFINED, DEFAULT_DISPLAY, mTargetStack); // If the caller has requested that the target task be reset, then do so. if ((mLaunchFlags & FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { @@ -2114,10 +2112,9 @@ class ActivityStarter { } if (stack == null) { // We first try to put the task in the first dynamic stack on home display. - final ArrayList<ActivityStack> homeDisplayStacks = - mSupervisor.getStacksOnDefaultDisplay(); - for (int stackNdx = homeDisplayStacks.size() - 1; stackNdx >= 0; --stackNdx) { - stack = homeDisplayStacks.get(stackNdx); + final ActivityDisplay display = mSupervisor.getDefaultDisplay(); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + stack = display.getChildAt(stackNdx); if (!stack.isOnHomeDisplay()) { if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG_FOCUS, "computeStackFocus: Setting focused stack=" + stack); @@ -2213,8 +2210,8 @@ class ActivityStarter { // If the parent is not in the docked stack, we check if there is docked window // and if yes, we will launch into that stack. If not, we just put the new // activity into parent's stack, because we can't find a better place. - final ActivityStack dockedStack = mSupervisor.getDefaultDisplay().getStack( - WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_UNDEFINED); + final ActivityStack dockedStack = + mSupervisor.getDefaultDisplay().getSplitScreenPrimaryStack(); if (dockedStack != null && !dockedStack.shouldBeVisible(r)) { // There is a docked stack, but it isn't visible, so we can't launch into that. return null; diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java index ba541e6eea16..c3fed17126b7 100644 --- a/services/core/java/com/android/server/am/KeyguardController.java +++ b/services/core/java/com/android/server/am/KeyguardController.java @@ -46,7 +46,6 @@ import com.android.internal.policy.IKeyguardDismissCallback; import com.android.server.wm.WindowManagerService; import java.io.PrintWriter; -import java.util.ArrayList; /** * Controls Keyguard occluding, dismissing and transitions depending on what kind of activities are @@ -237,9 +236,9 @@ class KeyguardController { final ActivityRecord lastDismissingKeyguardActivity = mDismissingKeyguardActivity; mOccluded = false; mDismissingKeyguardActivity = null; - final ArrayList<ActivityStack> stacks = mStackSupervisor.getStacksOnDefaultDisplay(); - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); + final ActivityDisplay display = mStackSupervisor.getDefaultDisplay(); + for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = display.getChildAt(stackNdx); // Only the focused stack top activity may control occluded state if (mStackSupervisor.isFocusedStack(stack)) { @@ -341,7 +340,7 @@ class KeyguardController { // show on top of the lock screen. In this can we want to dismiss the docked // stack since it will be complicated/risky to try to put the activity on top // of the lock screen in the right fullscreen configuration. - final ActivityStack stack = mStackSupervisor.getDefaultDisplay().getSplitScreenStack(); + final ActivityStack stack = mStackSupervisor.getDefaultDisplay().getSplitScreenPrimaryStack(); if (stack == null) { return; } diff --git a/services/core/java/com/android/server/am/LockTaskController.java b/services/core/java/com/android/server/am/LockTaskController.java index 72b5de88e50f..940f9051ec1e 100644 --- a/services/core/java/com/android/server/am/LockTaskController.java +++ b/services/core/java/com/android/server/am/LockTaskController.java @@ -19,7 +19,6 @@ package com.android.server.am; import static android.app.ActivityManager.LOCK_TASK_MODE_LOCKED; import static android.app.ActivityManager.LOCK_TASK_MODE_NONE; import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED; -import static android.app.ActivityManager.StackId.INVALID_STACK_ID; import static android.app.StatusBarManager.DISABLE_BACK; import static android.app.StatusBarManager.DISABLE_HOME; import static android.app.StatusBarManager.DISABLE_MASK; @@ -59,7 +58,6 @@ import android.provider.Settings; import android.util.Slog; import android.util.SparseArray; -import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.widget.LockPatternUtils; @@ -433,7 +431,7 @@ public class LockTaskController { mWindowManager.executeAppTransition(); } else if (lockTaskModeState != LOCK_TASK_MODE_NONE) { mSupervisor.handleNonResizableTaskIfNeeded(task, WINDOWING_MODE_UNDEFINED, - DEFAULT_DISPLAY, task.getStackId(), true /* forceNonResizable */); + DEFAULT_DISPLAY, task.getStack(), true /* forceNonResizable */); } } @@ -494,11 +492,7 @@ public class LockTaskController { } for (int displayNdx = mSupervisor.getChildCount() - 1; displayNdx >= 0; --displayNdx) { - ArrayList<ActivityStack> stacks = mSupervisor.getChildAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); - stack.onLockTaskPackagesUpdatedLocked(); - } + mSupervisor.getChildAt(displayNdx).onLockTaskPackagesUpdated(); } final ActivityRecord r = mSupervisor.topRunningActivityLocked(); diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index e4a5980b913e..0bc30cf4110b 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -83,7 +83,6 @@ import android.annotation.IntDef; import android.annotation.Nullable; import android.app.Activity; import android.app.ActivityManager; -import android.app.ActivityManager.StackId; import android.app.ActivityManager.TaskDescription; import android.app.ActivityManager.TaskSnapshot; import android.app.ActivityOptions; @@ -650,7 +649,7 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi // In some cases the focused stack isn't the front stack. E.g. pinned stack. // Whenever we are moving the top activity from the front stack we want to make sure to // move the stack to the front. - final boolean wasFront = r != null && supervisor.isFrontStackOnDisplay(sourceStack) + final boolean wasFront = r != null && sourceStack.isTopStackOnDisplay() && (sourceStack.topRunningActivityLocked() == r); // Adjust the position for the new parent stack as needed. @@ -739,9 +738,9 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi } // TODO: Handle incorrect request to move before the actual move, not after. - final boolean inSplitScreenMode = supervisor.getDefaultDisplay().hasSplitScreenStack(); + final boolean inSplitScreenMode = supervisor.getDefaultDisplay().hasSplitScreenPrimaryStack(); supervisor.handleNonResizableTaskIfNeeded(this, preferredStack.getWindowingMode(), - DEFAULT_DISPLAY, toStack.mStackId); + DEFAULT_DISPLAY, toStack); boolean successful = (preferredStack == toStack); if (successful && toStack.getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { |