Pre-cleanup before unifying Task and Stack (82/n)
- Removed Task#getTaskStack() and Task#mStack. Changed callers to use getStack().
- Made ActivityStack#mDisplayId private and changed callers to use getDisplayId.
- Switch stack id assignment to use getNextTaskIdForUser() so there isn't dups. with the ids.
- Made ActivityRecord#mTaskOverlay private.
Bug: 80414790
Test: Existing tests pass.
Change-Id: I47716f1fdac4cab21eed5a69f91e765f070e7550
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 76d18fa..d49270d 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -521,7 +521,7 @@
static final int STARTING_WINDOW_SHOWN = 1;
static final int STARTING_WINDOW_REMOVED = 2;
int mStartingWindowState = STARTING_WINDOW_NOT_SHOWN;
- boolean mTaskOverlay = false; // Task is always on-top of other activities in the task.
+ private boolean mTaskOverlay = false; // Task is always on-top of other activities in the task.
// Marking the reason why this activity is being relaunched. Mainly used to track that this
// activity is being relaunched to fulfill a resize request due to compatibility issues, e.g. in
@@ -1222,7 +1222,7 @@
}
ActivityStack getStack() {
- return task != null ? task.getTaskStack() : null;
+ return task != null ? task.getStack() : null;
}
@Override
@@ -1269,8 +1269,8 @@
if (getDisplayContent() != null) {
getDisplayContent().mClosingApps.remove(this);
}
- } else if (mLastParent != null && mLastParent.getTaskStack() != null) {
- task.getTaskStack().mExitingActivities.remove(this);
+ } else if (mLastParent != null && mLastParent.getStack() != null) {
+ task.getStack().mExitingActivities.remove(this);
}
final ActivityStack stack = getStack();
@@ -5523,7 +5523,7 @@
if (stack == null) {
return INVALID_DISPLAY;
}
- return stack.mDisplayId;
+ return stack.getDisplayId();
}
final boolean isDestroyable() {
@@ -7451,6 +7451,15 @@
return this == rootActivity;
}
+ void setTaskOverlay(boolean taskOverlay) {
+ mTaskOverlay = taskOverlay;
+ setAlwaysOnTop(mTaskOverlay);
+ }
+
+ boolean isTaskOverlay() {
+ return mTaskOverlay;
+ }
+
@Override
public String toString() {
if (stringName != null) {
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index 16245f0..18264f5 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -310,7 +310,7 @@
int mCurrentUser;
/** The attached Display's unique identifier, or -1 if detached */
- int mDisplayId;
+ private int mDisplayId;
// Id of the previous display the stack was on.
int mPrevDisplayId = INVALID_DISPLAY;
@@ -1013,6 +1013,10 @@
return getDisplayContent();
}
+ int getDisplayId() {
+ return mDisplayId;
+ }
+
/**
* Defers updating the bounds of the stack. If the stack was resized/repositioned while
* deferring, the bounds will update in {@link #continueUpdateBounds()}.
@@ -1082,7 +1086,7 @@
}
private ActivityRecord topRunningNonOverlayTaskActivity() {
- return getActivity((r) -> (r.canBeTopRunning() && !r.mTaskOverlay));
+ return getActivity((r) -> (r.canBeTopRunning() && !r.isTaskOverlay()));
}
ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) {
diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
index a380efc4..a508e1c 100644
--- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
@@ -571,14 +571,14 @@
}
}
- void setNextTaskIdForUserLocked(int taskId, int userId) {
+ void setNextTaskIdForUser(int taskId, int userId) {
final int currentTaskId = mCurTaskIdForUser.get(userId, -1);
if (taskId > currentTaskId) {
mCurTaskIdForUser.put(userId, taskId);
}
}
- static int nextTaskIdForUser(int taskId, int userId) {
+ private static int nextTaskIdForUser(int taskId, int userId) {
int nextTaskId = taskId + 1;
if (nextTaskId == (userId + 1) * MAX_TASK_IDS_PER_USER) {
// Wrap around as there will be smaller task ids that are available now.
@@ -587,7 +587,11 @@
return nextTaskId;
}
- int getNextTaskIdForUserLocked(int userId) {
+ int getNextTaskIdForUser() {
+ return getNextTaskIdForUser(mRootWindowContainer.mCurrentUser);
+ }
+
+ int getNextTaskIdForUser(int userId) {
final int currentTaskId = mCurTaskIdForUser.get(userId, userId * MAX_TASK_IDS_PER_USER);
// for a userId u, a taskId can only be in the range
// [u*MAX_TASK_IDS_PER_USER, (u+1)*MAX_TASK_IDS_PER_USER-1], so if MAX_TASK_IDS_PER_USER
@@ -1955,7 +1959,7 @@
// Ensure that we're not moving a task to a dynamic stack if device doesn't support
// multi-display.
- if (stack.mDisplayId != DEFAULT_DISPLAY && !mService.mSupportsMultiDisplay) {
+ if (stack.getDisplayId() != DEFAULT_DISPLAY && !mService.mSupportsMultiDisplay) {
throw new IllegalArgumentException("Device doesn't support multi-display, can not"
+ " reparent task=" + task + " to stackId=" + stackId);
}
@@ -2443,7 +2447,7 @@
// Handle incorrect launch/move to secondary display if needed.
if (isSecondaryDisplayPreferred) {
- final int actualDisplayId = task.getStack().mDisplayId;
+ final int actualDisplayId = task.getDisplayId();
if (!task.canBeLaunchedOnDisplay(actualDisplayId)) {
throw new IllegalStateException("Task resolved to incompatible display");
}
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index a2b9d95..c688612 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -1073,7 +1073,8 @@
mRootWindowContainer.getTopDisplayFocusedStack();
Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true,
true, false) + "} from uid " + callingUid + " on display "
- + (focusedStack == null ? DEFAULT_DISPLAY : focusedStack.mDisplayId));
+ + (focusedStack == null ? DEFAULT_DISPLAY
+ : focusedStack.getDisplayId()));
}
}
}
@@ -1576,7 +1577,7 @@
final ActivityRecord topTaskActivity =
mStartActivity.getTask().topRunningActivityLocked();
if (!mTargetStack.isFocusable()
- || (topTaskActivity != null && topTaskActivity.mTaskOverlay
+ || (topTaskActivity != null && topTaskActivity.isTaskOverlay()
&& mStartActivity != topTaskActivity)) {
// If the activity is not focusable, we can't resume it, but still would like to
// make sure it becomes visible as it starts (this will also trigger entry
@@ -2044,7 +2045,7 @@
if (mOptions != null) {
if (mOptions.getLaunchTaskId() != -1 && mOptions.getTaskOverlay()) {
- r.mTaskOverlay = true;
+ r.setTaskOverlay(true);
if (!mOptions.canTaskOverlayResume()) {
final Task task = mRootWindowContainer.anyTaskForId(
mOptions.getLaunchTaskId());
@@ -2293,7 +2294,7 @@
// the same behavior as if a new instance was being started, which means not bringing it
// to the front if the caller is not itself in the front.
final boolean differentTopTask;
- if (mPreferredDisplayId == mTargetStack.mDisplayId) {
+ if (mPreferredDisplayId == mTargetStack.getDisplayId()) {
final ActivityStack focusStack = mTargetStack.getDisplay().getFocusedStack();
final ActivityRecord curTop = (focusStack == null)
? null : focusStack.topRunningNonDelayedActivityLocked(mNotTop);
@@ -2343,7 +2344,7 @@
}
mMovedToFront = launchStack != launchStack.getDisplay()
.getTopStackInWindowingMode(launchStack.getWindowingMode());
- } else if (launchStack.mDisplayId != mTargetStack.mDisplayId) {
+ } else if (launchStack.getDisplayId() != mTargetStack.getDisplayId()) {
// Target and computed stacks are on different displays and we've
// found a matching task - move the existing instance to that display and
// move it to front.
@@ -2392,7 +2393,7 @@
private void setNewTask(Task taskToAffiliate) {
final boolean toTop = !mLaunchTaskBehind && !mAvoidMoveToFront;
final Task task = mTargetStack.createTask(
- mSupervisor.getNextTaskIdForUserLocked(mStartActivity.mUserId),
+ mSupervisor.getNextTaskIdForUser(mStartActivity.mUserId),
mNewTaskInfo != null ? mNewTaskInfo : mStartActivity.info,
mNewTaskIntent != null ? mNewTaskIntent : mIntent, mVoiceSession,
mVoiceInteractor, toTop, mStartActivity, mSourceRecord, mOptions);
@@ -2545,12 +2546,12 @@
// Dynamic stacks behave similarly to the fullscreen stack and can contain any
// resizeable task.
canUseFocusedStack = !focusedStack.isOnHomeDisplay()
- && r.canBeLaunchedOnDisplay(focusedStack.mDisplayId);
+ && r.canBeLaunchedOnDisplay(focusedStack.getDisplayId());
}
}
return canUseFocusedStack && !newTask
// Using the focus stack isn't important enough to override the preferred display.
- && (mPreferredDisplayId == focusedStack.mDisplayId);
+ && (mPreferredDisplayId == focusedStack.getDisplayId());
}
private ActivityStack getLaunchStack(ActivityRecord r, int launchFlags, Task task,
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index ac1dbc4..facfbed 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -2042,8 +2042,8 @@
public int getDisplayId(IBinder activityToken) throws RemoteException {
synchronized (mGlobalLock) {
final ActivityStack stack = ActivityRecord.getStackLocked(activityToken);
- if (stack != null && stack.mDisplayId != INVALID_DISPLAY) {
- return stack.mDisplayId;
+ if (stack != null && stack.getDisplayId() != INVALID_DISPLAY) {
+ return stack.getDisplayId();
}
return DEFAULT_DISPLAY;
}
@@ -3201,7 +3201,7 @@
final ActivityStack stack = r.getActivityStack();
final Task task = stack.createTask(
- mStackSupervisor.getNextTaskIdForUserLocked(r.mUserId), ainfo, intent,
+ mStackSupervisor.getNextTaskIdForUser(r.mUserId), ainfo, intent,
null /* voiceSession */, null /* voiceInteractor */, !ON_TOP);
if (!mRecentTasks.addToBottom(task)) {
// The app has too many tasks already and we can't add any more
@@ -4311,7 +4311,7 @@
if (params.hasSetAspectRatio()
&& !mWindowManager.isValidPictureInPictureAspectRatio(
- r.getActivityStack().mDisplayId, params.getAspectRatio())) {
+ r.getDisplayId(), params.getAspectRatio())) {
final float minAspectRatio = mContext.getResources().getFloat(
com.android.internal.R.dimen.config_pictureInPictureMinAspectRatio);
final float maxAspectRatio = mContext.getResources().getFloat(
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 51742b9..896147e 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -600,11 +600,6 @@
private final SparseArray<ShellRoot> mShellRoots = new SparseArray<>();
- /**
- * Counter for next free stack ID to use for dynamic activity stacks. Unique across displays.
- */
- private static int sNextFreeStackId = 0;
-
private RootWindowContainer mRootWindowContainer;
/**
@@ -5694,7 +5689,7 @@
@VisibleForTesting
int getNextStackId() {
- return sNextFreeStackId++;
+ return mAtmService.mStackSupervisor.getNextTaskIdForUser();
}
/**
diff --git a/services/core/java/com/android/server/wm/LaunchParamsPersister.java b/services/core/java/com/android/server/wm/LaunchParamsPersister.java
index 0beae7e..f4e608e 100644
--- a/services/core/java/com/android/server/wm/LaunchParamsPersister.java
+++ b/services/core/java/com/android/server/wm/LaunchParamsPersister.java
@@ -222,9 +222,7 @@
private boolean saveTaskToLaunchParam(Task task, PersistableLaunchParams params) {
final ActivityStack stack = task.getStack();
- final int displayId = stack.mDisplayId;
- final DisplayContent display =
- mSupervisor.mRootWindowContainer.getDisplayContent(displayId);
+ final DisplayContent display = stack.getDisplayContent();
final DisplayInfo info = new DisplayInfo();
display.mDisplay.getDisplayInfo(info);
diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java
index a18d541..5df80fc 100644
--- a/services/core/java/com/android/server/wm/RecentTasks.java
+++ b/services/core/java/com/android/server/wm/RecentTasks.java
@@ -1382,7 +1382,7 @@
// Ignore tasks from different displays
// TODO (b/115289124): No Recents on non-default displays.
- if (stack.mDisplayId != DEFAULT_DISPLAY) {
+ if (stack.getDisplayId() != DEFAULT_DISPLAY) {
return false;
}
diff --git a/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java b/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java
index f78c82b..53d7688 100644
--- a/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java
+++ b/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java
@@ -135,7 +135,7 @@
+ r + " out to bottom task " + targetTask);
} else {
targetTask = mParent.createTask(
- mParent.mStackSupervisor.getNextTaskIdForUserLocked(r.mUserId),
+ mParent.mStackSupervisor.getNextTaskIdForUser(r.mUserId),
r.info, null /* intent */, null /* voiceSession */,
null /* voiceInteractor */, false /* toTop */);
targetTask.affinityIntent = r.intent;
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 5470327..93362b9 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -1495,7 +1495,7 @@
// Fallback to top focused display if the displayId is invalid.
if (displayId == INVALID_DISPLAY) {
final ActivityStack stack = getTopDisplayFocusedStack();
- displayId = stack != null ? stack.mDisplayId : DEFAULT_DISPLAY;
+ displayId = stack != null ? stack.getDisplayId() : DEFAULT_DISPLAY;
}
Intent homeIntent = null;
@@ -2148,7 +2148,7 @@
// ensures that all the necessary work to migrate states in the old and new stacks
// is also done.
final Task newTask = task.getStack().createTask(
- mStackSupervisor.getNextTaskIdForUserLocked(r.mUserId), r.info,
+ mStackSupervisor.getNextTaskIdForUser(r.mUserId), r.info,
r.intent, null, null, true);
r.reparent(newTask, MAX_VALUE, "moveActivityToStack");
@@ -2405,11 +2405,10 @@
}
private ActivityManager.StackInfo getStackInfo(ActivityStack stack) {
- final int displayId = stack.mDisplayId;
- final DisplayContent display = getDisplayContent(displayId);
+ final DisplayContent display = stack.getDisplayContent();
ActivityManager.StackInfo info = new ActivityManager.StackInfo();
stack.getBounds(info.bounds);
- info.displayId = displayId;
+ info.displayId = display.mDisplayId;
info.stackId = stack.mStackId;
info.stackToken = stack.mRemoteToken;
info.userId = stack.mCurrentUser;
@@ -2571,7 +2570,7 @@
}
ActivityStack findStackBehind(ActivityStack stack) {
- final DisplayContent display = getDisplayContent(stack.mDisplayId);
+ final DisplayContent display = getDisplayContent(stack.getDisplayId());
if (display != null) {
for (int i = display.getStackCount() - 1; i >= 0; i--) {
if (display.getStackAt(i) == stack && i > 0) {
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 987ecc5..06af095 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -54,6 +54,7 @@
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
import static android.provider.Settings.Secure.USER_SETUP_COMPLETE;
import static android.view.Display.DEFAULT_DISPLAY;
+import static android.view.Display.INVALID_DISPLAY;
import static android.view.SurfaceControl.METADATA_TASK_ID;
import static com.android.server.am.TaskRecordProto.ACTIVITIES;
@@ -127,7 +128,6 @@
import android.util.DisplayMetrics;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
-import android.view.Display;
import android.view.DisplayInfo;
import android.view.RemoteAnimationTarget;
import android.view.Surface;
@@ -268,9 +268,6 @@
int mLockTaskUid = -1; // The uid of the application that called startLockTask().
- /** Current stack. Setter must always be used to update the value. */
- private ActivityStack mStack;
-
/** The process that had previously hosted the root activity of this task.
* Used to know that we should try harder to keep this process around, in case the
* user wants to return to it. */
@@ -346,7 +343,7 @@
private final Rect mOverrideDisplayedBounds = new Rect();
/** ID of the display which rotation {@link #mRotation} has. */
- private int mLastRotationDisplayId = Display.INVALID_DISPLAY;
+ private int mLastRotationDisplayId = INVALID_DISPLAY;
/**
* Display rotation as of the last time {@link #setBounds(Rect)} was called or this task was
* moved to a new display.
@@ -678,7 +675,7 @@
if (toStack == sourceStack) {
return false;
}
- if (!canBeLaunchedOnDisplay(toStack.mDisplayId)) {
+ if (!canBeLaunchedOnDisplay(toStack.getDisplayId())) {
return false;
}
@@ -959,10 +956,6 @@
mNextAffiliateTaskId = nextAffiliate == null ? INVALID_TASK_ID : nextAffiliate.mTaskId;
}
- ActivityStack getStack() {
- return mStack;
- }
-
@Override
void onParentChanged(ConfigurationContainer newParent, ConfigurationContainer oldParent) {
final ActivityStack oldStack = ((ActivityStack) oldParent);
@@ -973,8 +966,6 @@
cleanUpResourcesForDestroy();
}
- mStack = newStack;
-
super.onParentChanged(newParent, oldParent);
if (oldStack != null) {
@@ -1044,13 +1035,6 @@
mAtmService.mRootWindowContainer.invalidateTaskLayers();
}
- /**
- * @return Id of current stack, {@link ActivityTaskManager#INVALID_STACK_ID} if no stack is set.
- */
- int getStackId() {
- return mStack != null ? mStack.mStackId : INVALID_STACK_ID;
- }
-
// Close up recents linked list.
private void closeRecentsChain() {
if (mPrevAffiliate != null) {
@@ -1261,7 +1245,7 @@
}
} else if (!mReuseTask) {
// Remove entire task if it doesn't have any activity left and it isn't marked for reuse
- mStack.removeChild(this, reason);
+ getStack().removeChild(this, reason);
EventLogTags.writeWmTaskRemoved(mTaskId,
"removeChild: last r=" + r + " in t=" + this);
removeIfPossible();
@@ -1278,9 +1262,9 @@
return false;
}
if (includeFinishing) {
- return getActivity((r) -> r.mTaskOverlay) != null;
+ return getActivity((r) -> r.isTaskOverlay()) != null;
}
- return getActivity((r) -> !r.finishing && r.mTaskOverlay) != null;
+ return getActivity((r) -> !r.finishing && r.isTaskOverlay()) != null;
}
private boolean autoRemoveFromRecents() {
@@ -1296,7 +1280,7 @@
*/
private void performClearTaskAtIndexLocked(String reason) {
// Broken down into to cases to avoid object create due to capturing mStack.
- if (mStack == null) {
+ if (getStack() == null) {
forAllActivities((r) -> {
if (r.finishing) return;
// Task was restored from persistent storage.
@@ -1525,7 +1509,7 @@
private static boolean setTaskDescriptionFromActivityAboveRoot(
ActivityRecord r, ActivityRecord root, TaskDescription td) {
- if (!r.mTaskOverlay && r.taskDescription != null) {
+ if (!r.isTaskOverlay() && r.taskDescription != null) {
final TaskDescription atd = r.taskDescription;
if (td.getLabel() == null) {
td.setLabel(atd.getLabel());
@@ -1579,11 +1563,10 @@
// If the task has no requested minimal size, we'd like to enforce a minimal size
// so that the user can not render the task too small to manipulate. We don't need
// to do this for the pinned stack as the bounds are controlled by the system.
- if (!inPinnedWindowingMode() && mStack != null) {
+ if (!inPinnedWindowingMode() && getDisplayContent() != null) {
final int defaultMinSizeDp =
mAtmService.mRootWindowContainer.mDefaultMinSizeOfResizeableTaskDp;
- final DisplayContent display =
- mAtmService.mRootWindowContainer.getDisplayContent(mStack.mDisplayId);
+ final DisplayContent display = getDisplayContent();
final float density =
(float) display.getConfiguration().densityDpi / DisplayMetrics.DENSITY_DEFAULT;
final int defaultMinSize = (int) (defaultMinSizeDp * density);
@@ -1820,7 +1803,7 @@
* @param bounds bounds to calculate smallestwidthdp for.
*/
private int getSmallestScreenWidthDpForDockedBounds(Rect bounds) {
- DisplayContent dc = mStack.getDisplay().mDisplayContent;
+ DisplayContent dc = getDisplayContent();
if (dc != null) {
return dc.getDockedDividerController().getSmallestWidthDpForBounds(bounds);
}
@@ -1884,9 +1867,9 @@
if (insideParentBounds && WindowConfiguration.isFloating(windowingMode)) {
mTmpNonDecorBounds.set(mTmpFullBounds);
mTmpStableBounds.set(mTmpFullBounds);
- } else if (insideParentBounds && mStack != null) {
+ } else if (insideParentBounds && getDisplayContent() != null) {
final DisplayInfo di = new DisplayInfo();
- mStack.getDisplay().mDisplay.getDisplayInfo(di);
+ getDisplayContent().mDisplay.getDisplayInfo(di);
// For calculating screenWidthDp, screenWidthDp, we use the stable inset screen
// area, i.e. the screen area without the system bars.
@@ -1997,7 +1980,7 @@
((float) newParentConfig.densityDpi) / DisplayMetrics.DENSITY_DEFAULT;
final Rect parentBounds =
new Rect(newParentConfig.windowConfiguration.getBounds());
- final DisplayContent display = mStack.getDisplay();
+ final DisplayContent display = getDisplayContent();
if (display != null && display.mDisplayContent != null) {
// If a freeform window moves below system bar, there is no way to move it again
// by touch. Because its caption is covered by system bar. So we exclude them
@@ -2077,7 +2060,8 @@
/** Updates the task's bounds and override configuration to match what is expected for the
* input stack. */
void updateOverrideConfigurationForStack(ActivityStack inStack) {
- if (mStack != null && mStack == inStack) {
+ final ActivityStack stack = getStack();
+ if (stack != null && stack == inStack) {
return;
}
@@ -2101,7 +2085,8 @@
/** Returns the bounds that should be used to launch this task. */
Rect getLaunchBounds() {
- if (mStack == null) {
+ final ActivityStack stack = getStack();
+ if (stack == null) {
return null;
}
@@ -2109,9 +2094,9 @@
if (!isActivityTypeStandardOrUndefined()
|| windowingMode == WINDOWING_MODE_FULLSCREEN
|| (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY && !isResizeable())) {
- return isResizeable() ? mStack.getRequestedOverrideBounds() : null;
+ return isResizeable() ? stack.getRequestedOverrideBounds() : null;
} else if (!getWindowConfiguration().persistTaskBounds()) {
- return mStack.getRequestedOverrideBounds();
+ return stack.getRequestedOverrideBounds();
}
return mLastNonFullscreenBounds;
}
@@ -2134,19 +2119,32 @@
@Override
DisplayContent getDisplayContent() {
- return getTaskStack() != null ? getTaskStack().getDisplayContent() : null;
+ return getStack() != null ? getStack().getDisplayContent() : null;
}
- ActivityStack getTaskStack() {
+ int getDisplayId() {
+ final DisplayContent dc = getDisplayContent();
+ return dc != null ? dc.mDisplayId : INVALID_DISPLAY;
+ }
+
+ ActivityStack getStack() {
return (ActivityStack) getParent();
}
+ /**
+ * @return Id of current stack, {@link ActivityTaskManager#INVALID_STACK_ID} if no stack is set.
+ */
+ int getStackId() {
+ final ActivityStack stack = getStack();
+ return stack != null ? stack.mStackId : INVALID_STACK_ID;
+ }
+
// TODO(task-hierarchy): Needs to take a generic WindowManager when task contains other tasks.
int getAdjustedAddPosition(ActivityRecord r, int suggestedPosition) {
int maxPosition = mChildren.size();
- if (!r.mTaskOverlay) {
+ if (!r.isTaskOverlay()) {
// We want to place all non-overlay activities below overlays.
- final ActivityRecord bottomMostOverlay = getActivity((ar) -> ar.mTaskOverlay, false);
+ final ActivityRecord bottomMostOverlay = getActivity((ar) -> ar.isTaskOverlay(), false);
if (bottomMostOverlay != null) {
maxPosition = Math.max(mChildren.indexOf(bottomMostOverlay) - 1, 0);
}
@@ -2171,7 +2169,7 @@
// No reason to defer removal of a Task that doesn't have any child.
return false;
}
- return hasWindowsAlive() && getTaskStack().isAnimating(TRANSITION | CHILDREN);
+ return hasWindowsAlive() && getStack().isAnimating(TRANSITION | CHILDREN);
}
@Override
@@ -2184,7 +2182,7 @@
// TODO: Consolidate this with Task.reparent()
void reparent(ActivityStack stack, int position, boolean moveParents, String reason) {
if (DEBUG_STACK) Slog.i(TAG, "reParentTask: removing taskId=" + mTaskId
- + " from stack=" + getTaskStack());
+ + " from stack=" + getStack());
EventLogTags.writeWmTaskRemoved(mTaskId, "reParentTask:" + reason);
position = stack.findPositionForTask(this, position, showForAllUsers());
@@ -2214,8 +2212,8 @@
@Override
public int setBounds(Rect bounds) {
int rotation = Surface.ROTATION_0;
- final DisplayContent displayContent = getTaskStack() != null
- ? getTaskStack().getDisplayContent() : null;
+ final DisplayContent displayContent = getStack() != null
+ ? getStack().getDisplayContent() : null;
if (displayContent != null) {
rotation = displayContent.getDisplayInfo().rotation;
} else if (bounds == null) {
@@ -2256,7 +2254,7 @@
void onDisplayChanged(DisplayContent dc) {
adjustBoundsForDisplayChangeIfNeeded(dc);
super.onDisplayChanged(dc);
- final int displayId = (dc != null) ? dc.getDisplayId() : Display.INVALID_DISPLAY;
+ final int displayId = (dc != null) ? dc.getDisplayId() : INVALID_DISPLAY;
mWmService.mAtmService.getTaskChangeNotificationController().notifyTaskDisplayChanged(
mTaskId, displayId);
}
@@ -2401,7 +2399,7 @@
/** Bounds of the task to be used for dimming, as well as touch related tests. */
public void getDimBounds(Rect out) {
- final DisplayContent displayContent = getTaskStack().getDisplayContent();
+ final DisplayContent displayContent = getStack().getDisplayContent();
// It doesn't matter if we in particular are part of the resize, since we couldn't have
// a DimLayer anyway if we weren't visible.
final boolean dockedResizing = displayContent != null
@@ -2424,9 +2422,9 @@
// stack bounds and so we don't even want to use them. Even if the app should not be
// resized the Dim should keep up with the divider.
if (dockedResizing) {
- getTaskStack().getBounds(out);
+ getStack().getBounds(out);
} else {
- getTaskStack().getBounds(mTmpRect);
+ getStack().getBounds(mTmpRect);
mTmpRect.intersect(getBounds());
out.set(mTmpRect);
}
@@ -2439,9 +2437,9 @@
void setDragResizing(boolean dragResizing, int dragResizeMode) {
if (mDragResizing != dragResizing) {
// No need to check if the mode is allowed if it's leaving dragResize
- if (dragResizing && !DragResizeMode.isModeAllowedForStack(getTaskStack(), dragResizeMode)) {
+ if (dragResizing && !DragResizeMode.isModeAllowedForStack(getStack(), dragResizeMode)) {
throw new IllegalArgumentException("Drag resize mode not allow for stack stackId="
- + getTaskStack().mStackId + " dragResizeMode=" + dragResizeMode);
+ + getStack().mStackId + " dragResizeMode=" + dragResizeMode);
}
mDragResizing = dragResizing;
mDragResizeMode = dragResizeMode;
@@ -2532,7 +2530,7 @@
*/
boolean isFloating() {
return getWindowConfiguration().tasksAreFloating()
- && !getTaskStack().isAnimatingBoundsToFullscreen() && !mPreserveNonFloatingState;
+ && !getStack().isAnimatingBoundsToFullscreen() && !mPreserveNonFloatingState;
}
@Override
@@ -2770,7 +2768,7 @@
info.userId = mUserId;
info.stackId = getStackId();
info.taskId = mTaskId;
- info.displayId = mStack == null ? Display.INVALID_DISPLAY : mStack.mDisplayId;
+ info.displayId = getDisplayId();
info.isRunning = getTopNonFinishingActivity() != null;
info.baseIntent = new Intent(getBaseIntent());
info.baseActivity = mReuseActivitiesReport.base != null
diff --git a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
index b8f3abe..e6757e1 100644
--- a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
+++ b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
@@ -316,8 +316,8 @@
ActivityStack stack =
(displayId == INVALID_DISPLAY && task != null) ? task.getStack() : null;
if (stack != null) {
- if (DEBUG) appendLog("display-from-task=" + stack.mDisplayId);
- displayId = stack.mDisplayId;
+ if (DEBUG) appendLog("display-from-task=" + stack.getDisplayId());
+ displayId = stack.getDisplayId();
}
if (displayId == INVALID_DISPLAY && source != null) {
diff --git a/services/core/java/com/android/server/wm/TaskPersister.java b/services/core/java/com/android/server/wm/TaskPersister.java
index 8cff99b..20af250 100644
--- a/services/core/java/com/android/server/wm/TaskPersister.java
+++ b/services/core/java/com/android/server/wm/TaskPersister.java
@@ -339,7 +339,7 @@
+ userTasksDir.getAbsolutePath());
} else {
// Looks fine.
- mStackSupervisor.setNextTaskIdForUserLocked(taskId, userId);
+ mStackSupervisor.setNextTaskIdForUser(taskId, userId);
task.isPersistable = true;
tasks.add(task);
recoveredTaskIds.add(taskId);
diff --git a/services/core/java/com/android/server/wm/TaskPositioner.java b/services/core/java/com/android/server/wm/TaskPositioner.java
index a867a5d4..85fac1e 100644
--- a/services/core/java/com/android/server/wm/TaskPositioner.java
+++ b/services/core/java/com/android/server/wm/TaskPositioner.java
@@ -450,7 +450,7 @@
}
// This is a moving or scrolling operation.
- mTask.getTaskStack().getDimBounds(mTmpRect);
+ mTask.getStack().getDimBounds(mTmpRect);
// If a target window is covered by system bar, there is no way to move it again by touch.
// So we exclude them from stack bounds. and then it will be shown inside stable area.
Rect stableBounds = new Rect();
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 5c02f46..62630a6 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -1323,12 +1323,12 @@
if (includeOverlays) {
return getActivity((r) -> true);
}
- return getActivity((r) -> !r.mTaskOverlay);
+ return getActivity((r) -> !r.isTaskOverlay());
} else if (includeOverlays) {
return getActivity((r) -> !r.finishing);
}
- return getActivity((r) -> !r.finishing && !r.mTaskOverlay);
+ return getActivity((r) -> !r.finishing && !r.isTaskOverlay());
}
void forAllWallpaperWindows(Consumer<WallpaperWindowToken> callback) {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index ab3419c..84441e5 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -4345,7 +4345,7 @@
final DisplayContent topFocusedDisplay = mRoot.getTopFocusedDisplayContent();
final ActivityRecord focusedApp = topFocusedDisplay.mFocusedApp;
return (focusedApp != null && focusedApp.getTask() != null)
- ? focusedApp.getTask().getTaskStack() : null;
+ ? focusedApp.getTask().getStack() : null;
}
public boolean detectSafeMode() {
@@ -7664,7 +7664,7 @@
return;
}
- final ActivityStack stack = task.getTaskStack();
+ final ActivityStack stack = task.getStack();
// We ignore home stack since we don't want home stack to move to front when touched.
// Specifically, in freeform we don't want tapping on home to cause the freeform apps to go
// behind home. See b/117376413
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index bb7c26c..b681923 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -1287,7 +1287,7 @@
// notify the client of frame changes in this case. Not only is it a lot of churn, but
// the frame may not correspond to the surface size or the onscreen area at various
// phases in the animation, and the client will become sad and confused.
- if (task != null && task.getTaskStack().isAnimatingBounds()) {
+ if (task != null && task.getStack().isAnimatingBounds()) {
return;
}
@@ -1427,8 +1427,8 @@
ActivityStack getStack() {
Task task = getTask();
if (task != null) {
- if (task.getTaskStack() != null) {
- return task.getTaskStack();
+ if (task.getStack() != null) {
+ return task.getStack();
}
}
// Some system windows (e.g. "Power off" dialog) don't have a task, but we would still
@@ -1447,7 +1447,7 @@
bounds.setEmpty();
mTmpRect.setEmpty();
if (intersectWithStackBounds) {
- final ActivityStack stack = task.getTaskStack();
+ final ActivityStack stack = task.getStack();
if (stack != null) {
stack.getDimBounds(mTmpRect);
} else {
@@ -1879,8 +1879,8 @@
final int top = mWindowFrames.mFrame.top;
final Task task = getTask();
final boolean adjustedForMinimizedDockOrIme = task != null
- && (task.getTaskStack().isAdjustedForMinimizedDockedStack()
- || task.getTaskStack().isAdjustedForIme());
+ && (task.getStack().isAdjustedForMinimizedDockedStack()
+ || task.getStack().isAdjustedForIme());
if (mToken.okToAnimate()
&& (mAttrs.privateFlags & PRIVATE_FLAG_NO_MOVE_ANIMATION) == 0
&& !isDragResizing() && !adjustedForMinimizedDockOrIme
@@ -1916,7 +1916,7 @@
boolean isObscuringDisplay() {
Task task = getTask();
- if (task != null && task.getTaskStack() != null && !task.getTaskStack().fillsParent()) {
+ if (task != null && task.getStack() != null && !task.getStack().fillsParent()) {
return false;
}
return isOpaqueDrawn() && fillsDisplay();
@@ -2349,8 +2349,8 @@
void applyAdjustForImeIfNeeded() {
final Task task = getTask();
- if (task != null && task.getTaskStack() != null && task.getTaskStack().isAdjustedForIme()) {
- task.getTaskStack().applyAdjustForImeIfNeeded(task);
+ if (task != null && task.getStack() != null && task.getStack().isAdjustedForIme()) {
+ task.getStack().applyAdjustForImeIfNeeded(task);
}
}
@@ -2694,7 +2694,7 @@
return false;
}
- return mActivityRecord.getTask().getTaskStack().shouldIgnoreInput()
+ return mActivityRecord.getTask().getStack().shouldIgnoreInput()
|| !mActivityRecord.mVisibleRequested
|| isRecentsAnimationConsumingAppInput();
}
@@ -3214,7 +3214,7 @@
return;
}
- final ActivityStack stack = task.getTaskStack();
+ final ActivityStack stack = task.getStack();
if (stack == null) {
return;
}
@@ -3228,7 +3228,7 @@
return;
}
- final ActivityStack stack = task.getTaskStack();
+ final ActivityStack stack = task.getStack();
if (stack == null) {
return;
}
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 175fccb..1a11766 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -888,10 +888,10 @@
int posX = 0;
int posY = 0;
- task.getTaskStack().getDimBounds(mTmpStackBounds);
+ task.getStack().getDimBounds(mTmpStackBounds);
boolean allowStretching = false;
- task.getTaskStack().getFinalAnimationSourceHintBounds(mTmpSourceBounds);
+ task.getStack().getFinalAnimationSourceHintBounds(mTmpSourceBounds);
// If we don't have source bounds, we can attempt to use the content insets
// in the following scenario:
// 1. We have content insets.
@@ -901,8 +901,8 @@
// because of the force-scale until resize state.
if (mTmpSourceBounds.isEmpty() && (mWin.mLastRelayoutContentInsets.width() > 0
|| mWin.mLastRelayoutContentInsets.height() > 0)
- && !task.getTaskStack().lastAnimatingBoundsWasToFullscreen()) {
- mTmpSourceBounds.set(task.getTaskStack().mPreAnimationBounds);
+ && !task.getStack().lastAnimatingBoundsWasToFullscreen()) {
+ mTmpSourceBounds.set(task.getStack().mPreAnimationBounds);
mTmpSourceBounds.inset(mWin.mLastRelayoutContentInsets);
allowStretching = true;
}
@@ -916,7 +916,7 @@
if (!mTmpSourceBounds.isEmpty()) {
// Get the final target stack bounds, if we are not animating, this is just the
// current stack bounds
- task.getTaskStack().getFinalAnimationBounds(mTmpAnimatingBounds);
+ task.getStack().getFinalAnimationBounds(mTmpAnimatingBounds);
// Calculate the current progress and interpolate the difference between the target
// and source bounds
@@ -1495,7 +1495,7 @@
*/
boolean isForceScaled() {
final Task task = mWin.getTask();
- if (task != null && task.getTaskStack().isForceScaled()) {
+ if (task != null && task.getStack().isForceScaled()) {
return true;
}
return mForceScaleUntilResize;
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
index c24ce2b..4e4020b 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
@@ -236,7 +236,7 @@
// Overlay must be for a different user to prevent recognizing a matching top activity
final ActivityRecord taskOverlay = new ActivityBuilder(mService).setTask(task)
.setUid(UserHandle.PER_USER_RANGE * 2).build();
- taskOverlay.mTaskOverlay = true;
+ taskOverlay.setTaskOverlay(true);
final RootWindowContainer.FindTaskResult result =
new RootWindowContainer.FindTaskResult();
@@ -865,7 +865,7 @@
.setComponent(new ComponentName("package.overlay", ".OverlayActivity")).build();
// If the task only remains overlay activity, the task should also be removed.
// See {@link ActivityStack#removeFromHistory}.
- overlayActivity.mTaskOverlay = true;
+ overlayActivity.setTaskOverlay(true);
// The activity without an app means it will be removed immediately.
// See {@link ActivityStack#destroyActivityLocked}.
@@ -893,7 +893,7 @@
// Making the first activity a task overlay means it will be removed from the task's
// activities as well once second activity is removed as handleAppDied processes the
// activity list in reverse.
- firstActivity.mTaskOverlay = true;
+ firstActivity.setTaskOverlay(true);
firstActivity.app = null;
// second activity will be immediately removed as it has no state.
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java
index fc94c5e..8c2b293 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java
@@ -61,7 +61,7 @@
public void setUpOnDisplay(DisplayContent dc) {
mActivity = createTestActivityRecord(dc, WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD);
mTask = mActivity.getTask();
- mStack = mTask.getTaskStack();
+ mStack = mTask.getStack();
// Set a remote animator with snapshot disabled. Snapshots don't work in wmtests.
RemoteAnimationDefinition definition = new RemoteAnimationDefinition();
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index 0758eeb..73dd2df 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -126,7 +126,7 @@
waitUntilHandlersIdle();
exitingApp.mIsExiting = true;
- exitingApp.getTask().getTaskStack().mExitingActivities.add(exitingApp);
+ exitingApp.getTask().getStack().mExitingActivities.add(exitingApp);
assertForAllWindowsOrder(Arrays.asList(
mWallpaperWindow,
diff --git a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java
index 31b658a..cf1f0a8 100644
--- a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java
@@ -424,7 +424,7 @@
void saveTask(Task task) {
final int userId = task.mUserId;
final ComponentName realActivity = task.realActivity;
- mTmpParams.mPreferredDisplayId = task.getStack().mDisplayId;
+ mTmpParams.mPreferredDisplayId = task.getDisplayId();
mTmpParams.mWindowingMode = task.getWindowingMode();
if (task.mLastNonFullscreenBounds != null) {
mTmpParams.mBounds.set(task.mLastNonFullscreenBounds);
diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
index 55a139a..79f808e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
@@ -421,6 +421,7 @@
@Test
public void testUsersTasks() {
mRecentTasks.setOnlyTestVisibleRange();
+ mRecentTasks.unloadUserDataFromMemoryLocked(TEST_USER_0_ID);
// Setup some tasks for the users
mTaskPersister.mUserTaskIdsOverride = new SparseBooleanArray();
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
index 9f092835..04d79ca 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
@@ -857,7 +857,7 @@
// Assert that the stack is returned as expected.
assertNotNull(result);
assertEquals("The display ID of the stack should same as secondary display ",
- secondaryDisplay.mDisplayId, result.mDisplayId);
+ secondaryDisplay.mDisplayId, result.getDisplayId());
}
/**
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java
index 9f2bfa7..9562fa4 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java
@@ -345,6 +345,7 @@
spyOn(parentWindowContainer);
parentWindowContainer.setBounds(fullScreenBounds);
doReturn(parentWindowContainer).when(task).getParent();
+ doReturn(stack).when(task).getStack();
doReturn(true).when(parentWindowContainer).handlesOrientationChangeFromDescendant();
// Setting app to fixed portrait fits within parent, but Task shouldn't adjust the
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java
index 6c3410a..b4f5751 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java
@@ -110,12 +110,12 @@
public void testStackRemoveImmediately() {
final ActivityStack stack = createTaskStackOnDisplay(mDisplayContent);
final Task task = createTaskInStack(stack, 0 /* userId */);
- assertEquals(stack, task.getTaskStack());
+ assertEquals(stack, task.getStack());
// Remove stack and check if its child is also removed.
stack.removeImmediately();
assertNull(stack.getDisplayContent());
- assertNull(task.getTaskStack());
+ assertNull(task.getStack());
}
@Test
@@ -131,7 +131,7 @@
assertEquals(0, stack.getChildCount());
assertNull(stack.getDisplayContent());
assertNull(task.getDisplayContent());
- assertNull(task.getTaskStack());
+ assertNull(task.getStack());
}
@Test