Merge "Cache reference to stack objects we use a lot in AM."
This commit is contained in:
committed by
Android (Google) Code Review
commit
35712aeaa8
@@ -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 hasSplitScreenStack() {
|
||||
return getSplitScreenStack() != null;
|
||||
boolean isTopStack(ActivityStack stack) {
|
||||
return stack == getTopStack();
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
@@ -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 */,
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
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);
|
||||
// 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 */);
|
||||
}
|
||||
}
|
||||
|
||||
releaseSleepTokens(activityDisplay);
|
||||
|
||||
mActivityDisplays.remove(displayId);
|
||||
mWindowManager.onDisplayRemoved(displayId);
|
||||
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);
|
||||
|
||||
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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user