Get TaskRecord children with getChildAt & co. APIs (54/n)
Helps reduce work with Task level unification.
Bug: 80414790
Test: Existing tests pass
Change-Id: I5e019c7d1f3ed50c4efd628b68fee6990841904d
diff --git a/services/core/java/com/android/server/wm/ActivityDisplay.java b/services/core/java/com/android/server/wm/ActivityDisplay.java
index 9d9a37c..673366f 100644
--- a/services/core/java/com/android/server/wm/ActivityDisplay.java
+++ b/services/core/java/com/android/server/wm/ActivityDisplay.java
@@ -1430,9 +1430,8 @@
continue;
}
- final ArrayList<ActivityRecord> activities = task.mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = activities.get(activityNdx);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = task.getChildAt(activityNdx);
if (r.isActivityTypeHome()
&& ((userId == UserHandle.USER_ALL) || (r.mUserId == userId))) {
return r;
diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
index a0a2967..ef8c020 100644
--- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
@@ -527,8 +527,8 @@
}
private boolean hasVisibleNonFinishingActivity(TaskRecord t) {
- for (int i = t.mActivities.size() - 1; i >= 0; --i) {
- final ActivityRecord r = t.mActivities.get(i);
+ for (int i = t.getChildCount() - 1; i >= 0; --i) {
+ final ActivityRecord r = t.getChildAt(i);
if (r.visible && !r.finishing) {
return true;
}
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 4f52d9d..7476249 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -1577,12 +1577,12 @@
task.mTaskId, shortComponentName, reason);
final ArrayList<ActivityRecord> activities = task.mActivities;
final int index = activities.indexOf(this);
- if (index < (activities.size() - 1)) {
+ if (index < (task.getChildCount() - 1)) {
if ((intent.getFlags() & Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) {
// If the caller asked that this activity (and all above it)
// be cleared when the task is reset, don't lose that information,
// but propagate it up to the next activity.
- final ActivityRecord next = activities.get(index + 1);
+ final ActivityRecord next = task.getChildAt(index + 1);
next.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
}
}
@@ -2788,12 +2788,12 @@
if (positionInTask == -1) {
throw new IllegalStateException("Activity not found in its task");
}
- if (positionInTask == task.mActivities.size() - 1) {
+ if (positionInTask == task.getChildCount() - 1) {
// It's the topmost activity in the task - should become resumed now
return true;
}
// Check if activity above is finishing now and this one becomes the topmost in task.
- final ActivityRecord activityAbove = task.mActivities.get(positionInTask + 1);
+ final ActivityRecord activityAbove = task.getChildAt(positionInTask + 1);
if (activityAbove.finishing && results == null) {
// We will only allow making active if activity above wasn't launched for result.
// Otherwise it will cause this activity to resume before getting result.
@@ -2848,7 +2848,7 @@
stopped = false;
if (isActivityTypeHome()) {
- mStackSupervisor.updateHomeProcess(task.mActivities.get(0).app);
+ mStackSupervisor.updateHomeProcess(task.getChildAt(0).app);
}
if (nowVisible) {
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index 5959254..11c1e36 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -488,7 +488,7 @@
int numActivities() {
int count = 0;
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
- count += mTaskHistory.get(taskNdx).mActivities.size();
+ count += mTaskHistory.get(taskNdx).getChildCount();
}
return count;
}
@@ -1077,9 +1077,8 @@
ActivityRecord topRunningNonOverlayTaskActivity() {
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
final TaskRecord task = mTaskHistory.get(taskNdx);
- final ArrayList<ActivityRecord> activities = task.mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = activities.get(activityNdx);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = task.getChildAt(activityNdx);
if (!r.finishing && !r.mTaskOverlay) {
return r;
}
@@ -1091,9 +1090,8 @@
ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) {
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
final TaskRecord task = mTaskHistory.get(taskNdx);
- final ArrayList<ActivityRecord> activities = task.mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord r = activities.get(activityNdx);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = task.getChildAt(activityNdx);
if (!r.finishing && !r.delayedResume && r != notTop && r.okToShowLocked()) {
return r;
}
@@ -1117,9 +1115,8 @@
if (task.mTaskId == taskId) {
continue;
}
- ArrayList<ActivityRecord> activities = task.mActivities;
- for (int i = activities.size() - 1; i >= 0; --i) {
- final ActivityRecord r = activities.get(i);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = task.getChildAt(activityNdx);
// Note: the taskId check depends on real taskId fields being non-zero
if (!r.finishing && (token != r.appToken) && r.okToShowLocked()) {
return r;
@@ -1431,10 +1428,8 @@
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
final TaskRecord task = mTaskHistory.get(taskNdx);
- final ArrayList<ActivityRecord> activities = task.mActivities;
-
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord r = activities.get(activityNdx);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = task.getChildAt(activityNdx);
if (!r.okToShowLocked()) {
continue;
}
@@ -1500,9 +1495,10 @@
void awakeFromSleepingLocked() {
// Ensure activities are no longer sleeping.
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
- final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- activities.get(activityNdx).setSleeping(false);
+ final TaskRecord task = mTaskHistory.get(taskNdx);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = task.getChildAt(activityNdx);
+ r.setSleeping(false);
}
}
if (mPausingActivity != null) {
@@ -1516,9 +1512,9 @@
final int userId = UserHandle.getUserId(aInfo.uid);
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
- final List<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord ar = activities.get(activityNdx);
+ final TaskRecord task = mTaskHistory.get(taskNdx);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord ar = task.getChildAt(activityNdx);
if ((userId == ar.mUserId) && packageName.equals(ar.packageName)) {
ar.updateApplicationInfo(aInfo);
@@ -1594,9 +1590,9 @@
// Make sure any paused or stopped but visible activities are now sleeping.
// This ensures that the activity's onStop() is called.
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
- final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = activities.get(activityNdx);
+ final TaskRecord task = mTaskHistory.get(taskNdx);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = task.getChildAt(activityNdx);
if (r.isState(STARTED, STOPPING, STOPPED, PAUSED, PAUSING)) {
r.setSleeping(true);
}
@@ -1880,9 +1876,8 @@
}
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
final TaskRecord task = mTaskHistory.get(taskNdx);
- final ArrayList<ActivityRecord> activities = task.mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = activities.get(activityNdx);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = task.getChildAt(activityNdx);
if (r.finishing) {
// We don't factor in finishing activities when determining translucency since
@@ -2113,9 +2108,8 @@
&& top != null && !top.mLaunchTaskBehind;
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
final TaskRecord task = mTaskHistory.get(taskNdx);
- final ArrayList<ActivityRecord> activities = task.mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = activities.get(activityNdx);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = task.getChildAt(activityNdx);
final boolean isTop = r == top;
if (aboveTop && !isTop) {
continue;
@@ -2363,9 +2357,8 @@
void clearOtherAppTimeTrackers(AppTimeTracker except) {
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
final TaskRecord task = mTaskHistory.get(taskNdx);
- final ArrayList<ActivityRecord> activities = task.mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = activities.get(activityNdx);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = task.getChildAt(activityNdx);
if ( r.appTimeTracker != except) {
r.appTimeTracker = null;
}
@@ -2423,9 +2416,9 @@
}
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
- final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = activities.get(activityNdx);
+ final TaskRecord task = mTaskHistory.get(taskNdx);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = task.getChildAt(activityNdx);
if (aboveTop) {
if (r == topActivity) {
aboveTop = false;
@@ -3210,14 +3203,13 @@
// We only do this for activities that are not the root of the task (since if we finish
// the root, we may no longer have the task!).
- final ArrayList<ActivityRecord> activities = task.mActivities;
- final int numActivities = activities.size();
+ final int numActivities = task.getChildCount();
int lastActivityNdx = task.findRootIndex(true /* effectiveRoot */);
if (lastActivityNdx == -1) {
lastActivityNdx = 0;
}
for (int i = numActivities - 1; i > lastActivityNdx; --i) {
- ActivityRecord target = activities.get(i);
+ ActivityRecord target = task.getChildAt(i);
// TODO: Why is this needed? Looks like we're breaking the loop before we reach the root
if (target.isRootOfTask()) break;
@@ -3257,7 +3249,7 @@
final TaskRecord targetTask;
final ActivityRecord bottom =
!mTaskHistory.isEmpty() && !mTaskHistory.get(0).mActivities.isEmpty() ?
- mTaskHistory.get(0).mActivities.get(0) : null;
+ mTaskHistory.get(0).getChildAt(0) : null;
if (bottom != null && target.taskAffinity.equals(bottom.getTaskRecord().affinity)) {
// If the activity currently at the bottom has the
// same task affinity as the one we are moving,
@@ -3279,7 +3271,7 @@
boolean noOptions = canMoveOptions;
final int start = replyChainEnd < 0 ? i : replyChainEnd;
for (int srcPos = start; srcPos >= i; --srcPos) {
- final ActivityRecord p = activities.get(srcPos);
+ final ActivityRecord p = task.getChildAt(srcPos);
if (p.finishing) {
continue;
}
@@ -3312,7 +3304,7 @@
// In this case, we want to finish this activity
// and everything above it, so be sneaky and pretend
// like these are all in the reply chain.
- end = activities.size() - 1;
+ end = task.getChildCount() - 1;
} else if (replyChainEnd < 0) {
end = i;
} else {
@@ -3320,7 +3312,7 @@
}
boolean noOptions = canMoveOptions;
for (int srcPos = i; srcPos <= end; srcPos++) {
- ActivityRecord p = activities.get(srcPos);
+ ActivityRecord p = task.getChildAt(srcPos);
if (p.finishing) {
continue;
}
@@ -3389,8 +3381,7 @@
int replyChainEnd = -1;
final String taskAffinity = task.affinity;
- final ArrayList<ActivityRecord> activities = affinityTask.mActivities;
- final int numActivities = activities.size();
+ final int numActivities = task.getChildCount();
// Do not operate on or below the effective root Activity.
int lastActivityNdx = affinityTask.findRootIndex(true /* effectiveRoot */);
@@ -3398,7 +3389,7 @@
lastActivityNdx = 0;
}
for (int i = numActivities - 1; i > lastActivityNdx; --i) {
- ActivityRecord target = activities.get(i);
+ ActivityRecord target = task.getChildAt(i);
// TODO: Why is this needed? Looks like we're breaking the loop before we reach the root
if (target.isRootOfTask()) break;
@@ -3435,7 +3426,7 @@
if (DEBUG_TASKS) Slog.v(TAG_TASKS,
"Finishing task at index " + start + " to " + i);
for (int srcPos = start; srcPos >= i; --srcPos) {
- final ActivityRecord p = activities.get(srcPos);
+ final ActivityRecord p = task.getChildAt(srcPos);
if (p.finishing) {
continue;
}
@@ -3443,7 +3434,7 @@
}
} else {
if (taskInsertionPoint < 0) {
- taskInsertionPoint = task.mActivities.size();
+ taskInsertionPoint = task.getChildCount();
}
@@ -3452,7 +3443,7 @@
"Reparenting from task=" + affinityTask + ":" + start + "-" + i
+ " to task=" + task + ":" + taskInsertionPoint);
for (int srcPos = start; srcPos >= i; --srcPos) {
- final ActivityRecord p = activities.get(srcPos);
+ final ActivityRecord p = task.getChildAt(srcPos);
p.reparent(task, taskInsertionPoint, "resetAffinityTaskIfNeededLocked");
if (DEBUG_ADD_REMOVE) Slog.i(TAG_ADD_REMOVE,
@@ -3589,9 +3580,9 @@
/** Finish all activities that were started for result from the specified activity. */
final void finishSubActivityLocked(ActivityRecord self, String resultWho, int requestCode) {
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
- ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord r = activities.get(activityNdx);
+ final TaskRecord task = mTaskHistory.get(taskNdx);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = task.getChildAt(activityNdx);
if (r.resultTo == self && r.requestCode == requestCode) {
if ((r.resultWho == null && resultWho == null) ||
(r.resultWho != null && r.resultWho.equals(resultWho))) {
@@ -3637,11 +3628,11 @@
if (taskNdx < 0) {
break;
}
- activityNdx = mTaskHistory.get(taskNdx).mActivities.size() - 1;
+ activityNdx = mTaskHistory.get(taskNdx).getChildCount() - 1;
} while (activityNdx < 0);
}
if (activityNdx >= 0) {
- r = mTaskHistory.get(taskNdx).mActivities.get(activityNdx);
+ r = mTaskHistory.get(taskNdx).getChildAt(activityNdx);
if (r.isState(STARTED, RESUMED, PAUSING, PAUSED)) {
if (!r.isActivityTypeHome() || mService.mHomeProcess != r.app) {
Slog.w(TAG, " Force finishing activity "
@@ -3659,8 +3650,8 @@
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
TaskRecord tr = mTaskHistory.get(taskNdx);
if (tr.voiceSession != null && tr.voiceSession.asBinder() == sessionBinder) {
- for (int activityNdx = tr.mActivities.size() - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord r = tr.mActivities.get(activityNdx);
+ for (int activityNdx = tr.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ ActivityRecord r = tr.getChildAt(activityNdx);
if (!r.finishing) {
r.finishIfPossible("finish-voice", false /* oomAdj */);
didOne = true;
@@ -3668,8 +3659,8 @@
}
} else {
// Check if any of the activities are using voice
- for (int activityNdx = tr.mActivities.size() - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord r = tr.mActivities.get(activityNdx);
+ for (int activityNdx = tr.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ ActivityRecord r = tr.getChildAt(activityNdx);
if (r.voiceSession != null && r.voiceSession.asBinder() == sessionBinder) {
// Inform of cancellation
r.clearVoiceSessionLocked();
@@ -3695,9 +3686,9 @@
void finishAllActivitiesImmediately() {
boolean noActivitiesInStack = true;
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
- final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = activities.get(activityNdx);
+ final TaskRecord task = mTaskHistory.get(taskNdx);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = task.getChildAt(activityNdx);
noActivitiesInStack = false;
Slog.d(TAG, "finishAllActivitiesImmediatelyLocked: finishing " + r);
r.destroyIfPossible("finishAllActivitiesImmediatelyLocked");
@@ -3765,12 +3756,12 @@
return false;
}
int finishTo = start - 1;
- ActivityRecord parent = finishTo < 0 ? null : activities.get(finishTo);
+ ActivityRecord parent = finishTo < 0 ? null : task.getChildAt(finishTo);
boolean foundParentInTask = false;
final ComponentName dest = destIntent.getComponent();
if (start > 0 && dest != null) {
for (int i = finishTo; i >= 0; i--) {
- ActivityRecord r = activities.get(i);
+ ActivityRecord r = task.getChildAt(i);
if (r.info.packageName.equals(dest.getPackageName()) &&
r.info.name.equals(dest.getClassName())) {
finishTo = i;
@@ -3931,9 +3922,9 @@
boolean lastIsOpaque = false;
boolean activityRemoved = false;
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
- final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = activities.get(activityNdx);
+ final TaskRecord task = mTaskHistory.get(taskNdx);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = task.getChildAt(activityNdx);
if (r.finishing) {
continue;
}
@@ -3978,15 +3969,14 @@
}
if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Looking for activities to release in " + task);
int curNum = 0;
- final ArrayList<ActivityRecord> activities = task.mActivities;
- for (int actNdx = 0; actNdx < activities.size(); actNdx++) {
- final ActivityRecord activity = activities.get(actNdx);
+ for (int actNdx = 0; actNdx < task.getChildCount(); actNdx++) {
+ final ActivityRecord activity = task.getChildAt(actNdx);
if (activity.app == app && activity.isDestroyable()) {
if (DEBUG_RELEASE) Slog.v(TAG_RELEASE, "Destroying " + activity
+ " in state " + activity.getState() + " resumed=" + mResumedActivity
+ " pausing=" + mPausingActivity + " for reason " + reason);
activity.destroyImmediately(true /* removeFromApp */, reason);
- if (activities.get(actNdx) != activity) {
+ if (task.getChildAt(actNdx) != activity) {
// Was removed from list, back up so we don't miss the next one.
actNdx--;
}
@@ -4170,8 +4160,8 @@
if (timeTracker != null) {
// The caller wants a time tracker associated with this task.
- for (int i = tr.mActivities.size() - 1; i >= 0; i--) {
- tr.mActivities.get(i).appTimeTracker = timeTracker;
+ for (int i = tr.getChildCount() - 1; i >= 0; i--) {
+ tr.getChildAt(i).appTimeTracker = timeTracker;
}
}
@@ -4425,9 +4415,9 @@
boolean willActivityBeVisibleLocked(IBinder token) {
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
- final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = activities.get(activityNdx);
+ final TaskRecord task = mTaskHistory.get(taskNdx);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = task.getChildAt(activityNdx);
if (r.appToken == token) {
return true;
}
@@ -4447,9 +4437,9 @@
void closeSystemDialogsLocked() {
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
- final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = activities.get(activityNdx);
+ final TaskRecord task = mTaskHistory.get(taskNdx);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = task.getChildAt(activityNdx);
if ((r.info.flags&ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS) != 0) {
r.finishIfPossible("close-sys", true /* oomAdj */);
}
@@ -4556,10 +4546,10 @@
final int top = mTaskHistory.size() - 1;
if (DEBUG_SWITCH) Slog.d(TAG_SWITCH, "Performing unhandledBack(): top activity at " + top);
if (top >= 0) {
- final ArrayList<ActivityRecord> activities = mTaskHistory.get(top).mActivities;
- int activityTop = activities.size() - 1;
+ final TaskRecord task = mTaskHistory.get(top);
+ int activityTop = task.getChildCount() - 1;
if (activityTop >= 0) {
- activities.get(activityTop).finishIfPossible("unhandled-back", true /* oomAdj */);
+ task.getChildAt(activityTop).finishIfPossible("unhandled-back", true /* oomAdj */);
}
}
}
@@ -4585,9 +4575,9 @@
void handleAppCrash(WindowProcessController app) {
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
- final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = activities.get(activityNdx);
+ final TaskRecord task = mTaskHistory.get(taskNdx);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = task.getChildAt(activityNdx);
if (r.app == app) {
Slog.w(TAG, " Force finishing activity "
+ r.intent.getComponent().flattenToShortString());
@@ -4705,9 +4695,9 @@
// All activities that came from the package must be
// restarted as if there was a config change.
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
- final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord a = activities.get(activityNdx);
+ final TaskRecord task = mTaskHistory.get(taskNdx);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord a = task.getChildAt(activityNdx);
if (a.info.packageName.equals(packageName)) {
a.forceNewConfig = true;
if (starting != null && a == starting && a.visible) {
diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
index f1284d81..a262f16 100644
--- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
@@ -824,7 +824,7 @@
System.identityHashCode(r), task.mTaskId, r.shortComponentName);
if (r.isActivityTypeHome()) {
// Home process is the root process of the task.
- updateHomeProcess(task.mActivities.get(0).app);
+ updateHomeProcess(task.getChildAt(0).app);
}
mService.getPackageManagerInternalLocked().notifyPackageUse(
r.intent.getComponent().getPackageName(), NOTIFY_PACKAGE_USE_ACTIVITY);
@@ -1899,9 +1899,9 @@
task.createTask(onTop, true /* showForAllUsers */);
if (DEBUG_RECENTS) Slog.v(TAG_RECENTS,
"Added restored task=" + task + " to stack=" + stack);
- final ArrayList<ActivityRecord> activities = task.mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- activities.get(activityNdx).setTask(task);
+ for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = task.getChildAt(activityNdx);
+ r.setTask(task);
}
return true;
}
@@ -2501,8 +2501,8 @@
return;
}
- for (int i = task.mActivities.size() - 1; i >= 0; i--) {
- final ActivityRecord r = task.mActivities.get(i);
+ for (int i = task.getChildCount() - 1; i >= 0; i--) {
+ final ActivityRecord r = task.getChildAt(i);
if (r.attachedToProcess()) {
mMultiWindowModeChangedActivities.add(r);
}
@@ -2524,8 +2524,8 @@
}
void scheduleUpdatePictureInPictureModeIfNeeded(TaskRecord task, Rect targetStackBounds) {
- for (int i = task.mActivities.size() - 1; i >= 0; i--) {
- final ActivityRecord r = task.mActivities.get(i);
+ for (int i = task.getChildCount() - 1; i >= 0; i--) {
+ final ActivityRecord r = task.getChildAt(i);
if (r.attachedToProcess()) {
mPipModeChangedActivities.add(r);
// If we are scheduling pip change, then remove this activity from multi-window
@@ -2543,8 +2543,8 @@
void updatePictureInPictureMode(TaskRecord task, Rect targetStackBounds, boolean forceUpdate) {
mHandler.removeMessages(REPORT_PIP_MODE_CHANGED_MSG);
- for (int i = task.mActivities.size() - 1; i >= 0; i--) {
- final ActivityRecord r = task.mActivities.get(i);
+ for (int i = task.getChildCount() - 1; i >= 0; i--) {
+ final ActivityRecord r = task.getChildAt(i);
if (r.attachedToProcess()) {
r.updatePictureInPictureMode(targetStackBounds, forceUpdate);
}
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 9397893..b68ba7c 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -2430,7 +2430,7 @@
if (mStartActivity.getTaskRecord() == null || mStartActivity.getTaskRecord() == parent) {
parent.addActivityToTop(mStartActivity);
} else {
- mStartActivity.reparent(parent, parent.mActivities.size() /* top */, reason);
+ mStartActivity.reparent(parent, parent.getChildCount() /* top */, reason);
}
}
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 750fc68..44d748d 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -1982,7 +1982,7 @@
final TaskRecord task = r.getTaskRecord();
int index = task.mActivities.lastIndexOf(r);
if (index > 0) {
- ActivityRecord under = task.mActivities.get(index - 1);
+ ActivityRecord under = task.getChildAt(index - 1);
under.returningOptions = safeOptions != null ? safeOptions.getOptions(r) : null;
}
return r.setOccludesParent(false);
diff --git a/services/core/java/com/android/server/wm/ConfigurationContainer.java b/services/core/java/com/android/server/wm/ConfigurationContainer.java
index 8afbbdf..300ee1d 100644
--- a/services/core/java/com/android/server/wm/ConfigurationContainer.java
+++ b/services/core/java/com/android/server/wm/ConfigurationContainer.java
@@ -626,6 +626,10 @@
return mFullConfiguration.windowConfiguration.isAlwaysOnTop();
}
+ boolean hasChild() {
+ return getChildCount() > 0;
+ }
+
abstract protected int getChildCount();
abstract protected E getChildAt(int index);
diff --git a/services/core/java/com/android/server/wm/RootActivityContainer.java b/services/core/java/com/android/server/wm/RootActivityContainer.java
index d78d517..60833c3 100644
--- a/services/core/java/com/android/server/wm/RootActivityContainer.java
+++ b/services/core/java/com/android/server/wm/RootActivityContainer.java
@@ -983,7 +983,7 @@
stack.resize(task.getRequestedOverrideBounds(), null /* tempTaskBounds */,
null /* tempTaskInsetBounds */, !PRESERVE_WINDOWS, !DEFER_RESUME);
- if (task.mActivities.size() == 1) {
+ if (task.getChildCount() == 1) {
// Defer resume until below, and do not schedule PiP changes until we animate below
task.reparent(stack, ON_TOP, REPARENT_MOVE_STACK_TO_FRONT, !ANIMATE, DEFER_RESUME,
false /* schedulePictureInPictureModeChange */, reason);
diff --git a/services/core/java/com/android/server/wm/TaskRecord.java b/services/core/java/com/android/server/wm/TaskRecord.java
index 75333c7..ab661ca 100644
--- a/services/core/java/com/android/server/wm/TaskRecord.java
+++ b/services/core/java/com/android/server/wm/TaskRecord.java
@@ -447,7 +447,7 @@
}
void cleanUpResourcesForDestroy() {
- if (!mActivities.isEmpty()) {
+ if (hasChild()) {
return;
}
@@ -1095,7 +1095,7 @@
// There are no non-finishing activities in the task.
return null;
}
- return mActivities.get(rootActivityIndex);
+ return getChildAt(rootActivityIndex);
}
ActivityRecord getTopActivity() {
@@ -1103,8 +1103,8 @@
}
ActivityRecord getTopActivity(boolean includeOverlays) {
- for (int i = mActivities.size() - 1; i >= 0; --i) {
- final ActivityRecord r = mActivities.get(i);
+ for (int i = getChildCount() - 1; i >= 0; --i) {
+ final ActivityRecord r = getChildAt(i);
if (r.finishing || (!includeOverlays && r.mTaskOverlay)) {
continue;
}
@@ -1115,8 +1115,8 @@
ActivityRecord topRunningActivityLocked() {
if (mStack != null) {
- for (int activityNdx = mActivities.size() - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord r = mActivities.get(activityNdx);
+ for (int activityNdx = getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ ActivityRecord r = getChildAt(activityNdx);
if (!r.finishing && r.okToShowLocked()) {
return r;
}
@@ -1126,8 +1126,8 @@
}
boolean isVisible() {
- for (int i = mActivities.size() - 1; i >= 0; --i) {
- final ActivityRecord r = mActivities.get(i);
+ for (int i = getChildCount() - 1; i >= 0; --i) {
+ final ActivityRecord r = getChildAt(i);
if (r.visible) {
return true;
}
@@ -1139,8 +1139,8 @@
* Return true if any activities in this task belongs to input uid.
*/
boolean containsAppUid(int uid) {
- for (int i = mActivities.size() - 1; i >= 0; --i) {
- final ActivityRecord r = mActivities.get(i);
+ for (int i = getChildCount() - 1; i >= 0; --i) {
+ final ActivityRecord r = getChildAt(i);
if (r.getUid() == uid) {
return true;
}
@@ -1150,8 +1150,8 @@
void getAllRunningVisibleActivitiesLocked(ArrayList<ActivityRecord> outActivities) {
if (mStack != null) {
- for (int activityNdx = mActivities.size() - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord r = mActivities.get(activityNdx);
+ for (int activityNdx = getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ ActivityRecord r = getChildAt(activityNdx);
if (!r.finishing && r.okToShowLocked() && r.visibleIgnoringKeyguard) {
outActivities.add(r);
}
@@ -1161,8 +1161,8 @@
ActivityRecord topRunningActivityWithStartingWindowLocked() {
if (mStack != null) {
- for (int activityNdx = mActivities.size() - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord r = mActivities.get(activityNdx);
+ for (int activityNdx = getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ ActivityRecord r = getChildAt(activityNdx);
if (r.mStartingWindowState != STARTING_WINDOW_SHOWN
|| r.finishing || !r.okToShowLocked()) {
continue;
@@ -1179,8 +1179,8 @@
*/
void getNumRunningActivities(TaskActivitiesReport reportOut) {
reportOut.reset();
- for (int i = mActivities.size() - 1; i >= 0; --i) {
- final ActivityRecord r = mActivities.get(i);
+ for (int i = getChildCount() - 1; i >= 0; --i) {
+ final ActivityRecord r = getChildAt(i);
if (r.finishing) {
continue;
}
@@ -1227,17 +1227,17 @@
}
void addActivityToTop(ActivityRecord r) {
- addActivityAtIndex(mActivities.size(), r);
+ addActivityAtIndex(getChildCount(), r);
}
@Override
/*@WindowConfiguration.ActivityType*/
public int getActivityType() {
final int applicationType = super.getActivityType();
- if (applicationType != ACTIVITY_TYPE_UNDEFINED || mActivities.isEmpty()) {
+ if (applicationType != ACTIVITY_TYPE_UNDEFINED || !hasChild()) {
return applicationType;
}
- return mActivities.get(0).getActivityType();
+ return getChildAt(0).getActivityType();
}
/**
@@ -1259,7 +1259,7 @@
numFullscreen++;
}
// Only set this based on the first activity
- if (mActivities.isEmpty()) {
+ if (!hasChild()) {
if (r.getActivityType() == ACTIVITY_TYPE_UNDEFINED) {
// Normally non-standard activity type for the activity record will be set when the
// object is created, however we delay setting the standard application type until
@@ -1279,10 +1279,10 @@
r.setActivityType(getActivityType());
}
- final int size = mActivities.size();
+ final int size = getChildCount();
if (index == size && size > 0) {
- final ActivityRecord top = mActivities.get(size - 1);
+ final ActivityRecord top = getChildAt(size - 1);
if (top.mTaskOverlay) {
// Place below the task overlay activity since the overlay activity should always
// be on top.
@@ -1341,7 +1341,7 @@
mAtmService.getTaskChangeNotificationController().notifyTaskStackChanged();
}
- if (mActivities.isEmpty()) {
+ if (!hasChild()) {
return !mReuseTask;
}
updateEffectiveIntent();
@@ -1355,8 +1355,8 @@
*/
boolean onlyHasTaskOverlayActivities(boolean excludeFinishing) {
int count = 0;
- for (int i = mActivities.size() - 1; i >= 0; i--) {
- final ActivityRecord r = mActivities.get(i);
+ for (int i = getChildCount() - 1; i >= 0; i--) {
+ final ActivityRecord r = getChildAt(i);
if (excludeFinishing && r.finishing) {
continue;
}
@@ -1372,7 +1372,7 @@
// We will automatically remove the task either if it has explicitly asked for
// this, or it is empty and has never contained an activity that got shown to
// the user.
- return autoRemoveRecents || (mActivities.isEmpty() && !hasBeenVisible);
+ return autoRemoveRecents || (!hasChild() && !hasBeenVisible);
}
/**
@@ -1380,9 +1380,9 @@
* task starting at a specified index.
*/
final void performClearTaskAtIndexLocked(int activityNdx, String reason) {
- int numActivities = mActivities.size();
+ int numActivities = getChildCount();
for ( ; activityNdx < numActivities; ++activityNdx) {
- final ActivityRecord r = mActivities.get(activityNdx);
+ final ActivityRecord r = getChildAt(activityNdx);
if (r.finishing) {
continue;
}
@@ -1429,9 +1429,9 @@
* or null if none was found.
*/
final ActivityRecord performClearTaskLocked(ActivityRecord newR, int launchFlags) {
- int numActivities = mActivities.size();
+ int numActivities = getChildCount();
for (int activityNdx = numActivities - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord r = mActivities.get(activityNdx);
+ ActivityRecord r = getChildAt(activityNdx);
if (r.finishing) {
continue;
}
@@ -1440,7 +1440,7 @@
final ActivityRecord ret = r;
for (++activityNdx; activityNdx < numActivities; ++activityNdx) {
- r = mActivities.get(activityNdx);
+ r = getChildAt(activityNdx);
if (r.finishing) {
continue;
}
@@ -1591,8 +1591,8 @@
*/
final ActivityRecord findActivityInHistoryLocked(ActivityRecord r) {
final ComponentName realActivity = r.mActivityComponent;
- for (int activityNdx = mActivities.size() - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord candidate = mActivities.get(activityNdx);
+ for (int activityNdx = getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ ActivityRecord candidate = getChildAt(activityNdx);
if (candidate.finishing) {
continue;
}
@@ -1609,12 +1609,12 @@
// Traverse upwards looking for any break between main task activities and
// utility activities.
int activityNdx;
- final int numActivities = mActivities.size();
+ final int numActivities = getChildCount();
final boolean relinquish = numActivities != 0 &&
- (mActivities.get(0).info.flags & FLAG_RELINQUISH_TASK_IDENTITY) != 0;
+ (getChildAt(0).info.flags & FLAG_RELINQUISH_TASK_IDENTITY) != 0;
for (activityNdx = Math.min(numActivities, 1); activityNdx < numActivities;
++activityNdx) {
- final ActivityRecord r = mActivities.get(activityNdx);
+ final ActivityRecord r = getChildAt(activityNdx);
if (relinquish && (r.info.flags & FLAG_RELINQUISH_TASK_IDENTITY) == 0) {
// This will be the top activity for determining taskDescription. Pre-inc to
// overcome initial decrement below.
@@ -1642,7 +1642,7 @@
boolean navigationBarContrastWhenTransparent = false;
boolean topActivity = true;
for (--activityNdx; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = mActivities.get(activityNdx);
+ final ActivityRecord r = getChildAt(activityNdx);
if (r.mTaskOverlay) {
continue;
}
@@ -1697,9 +1697,9 @@
*/
int findRootIndex(boolean effectiveRoot) {
int effectiveNdx = -1;
- final int topActivityNdx = mActivities.size() - 1;
+ final int topActivityNdx = getChildCount() - 1;
for (int activityNdx = 0; activityNdx <= topActivityNdx; ++activityNdx) {
- final ActivityRecord r = mActivities.get(activityNdx);
+ final ActivityRecord r = getChildAt(activityNdx);
if (r.finishing) {
continue;
}
@@ -1720,7 +1720,7 @@
// But we still want to update the intent, so let's use the bottom activity.
effectiveRootIndex = 0;
}
- final ActivityRecord r = mActivities.get(effectiveRootIndex);
+ final ActivityRecord r = getChildAt(effectiveRootIndex);
setIntent(r);
// Update the task description when the activities change
@@ -2289,8 +2289,8 @@
}
void addStartingWindowsForVisibleActivities(boolean taskSwitch) {
- for (int activityNdx = mActivities.size() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = mActivities.get(activityNdx);
+ for (int activityNdx = getChildCount() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = getChildAt(activityNdx);
if (r.visible) {
r.showStartingWindow(null /* prev */, false /* newTask */, taskSwitch);
}
@@ -2462,7 +2462,7 @@
sb.append(" StackId=");
sb.append(getStackId());
sb.append(" sz=");
- sb.append(mActivities.size());
+ sb.append(getChildCount());
sb.append('}');
return sb.toString();
}
@@ -2495,8 +2495,8 @@
final long token = proto.start(fieldId);
super.writeToProto(proto, CONFIGURATION_CONTAINER, logLevel);
proto.write(ID, mTaskId);
- for (int i = mActivities.size() - 1; i >= 0; i--) {
- ActivityRecord activity = mActivities.get(i);
+ for (int i = getChildCount() - 1; i >= 0; i--) {
+ ActivityRecord activity = getChildAt(i);
activity.writeToProto(proto, ACTIVITIES);
}
proto.write(STACK_ID, mStack.mStackId);
@@ -2607,10 +2607,9 @@
out.endTag(null, TAG_INTENT);
}
- final ArrayList<ActivityRecord> activities = mActivities;
- final int numActivities = activities.size();
+ final int numActivities = getChildCount();
for (int activityNdx = 0; activityNdx < numActivities; ++activityNdx) {
- final ActivityRecord r = activities.get(activityNdx);
+ final ActivityRecord r = getChildAt(activityNdx);
if (r.info.persistableMode == ActivityInfo.PERSIST_ROOT_ONLY || !r.isPersistable() ||
((r.intent.getFlags() & FLAG_ACTIVITY_NEW_DOCUMENT
| FLAG_ACTIVITY_RETAIN_IN_RECENTS) == FLAG_ACTIVITY_NEW_DOCUMENT) &&
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 c2a05c24..2835c1f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
@@ -891,7 +891,7 @@
activity.app = null;
overlayActivity.app = null;
- assertEquals(2, mTask.mActivities.size());
+ assertEquals(2, mTask.getChildCount());
mStack.finishDisabledPackageActivitiesLocked(activity.packageName,
null /* filterByClasses */, true /* doit */, true /* evenPersistent */,
@@ -900,7 +900,7 @@
// Although the overlay activity is in another package, the non-overlay activities are
// removed from the task. Since the overlay activity should be removed as well, the task
// should be empty.
- assertThat(mTask.mActivities).isEmpty();
+ assertFalse(mTask.hasChild());
assertThat(mStack.getAllTasks()).isEmpty();
}
@@ -918,11 +918,11 @@
// second activity will be immediately removed as it has no state.
secondActivity.setSavedState(null /* savedState */);
- assertEquals(2, mTask.mActivities.size());
+ assertEquals(2, mTask.getChildCount());
mStack.handleAppDiedLocked(secondActivity.app);
- assertThat(mTask.mActivities).isEmpty();
+ assertFalse(mTask.hasChild());
assertThat(mStack.getAllTasks()).isEmpty();
}
@@ -936,7 +936,7 @@
mStack.handleAppDiedLocked(activity.app);
- assertEquals(1, mTask.mActivities.size());
+ assertEquals(1, mTask.getChildCount());
assertEquals(1, mStack.getAllTasks().size());
}
@@ -950,7 +950,7 @@
mStack.handleAppDiedLocked(activity.app);
- assertThat(mTask.mActivities).isEmpty();
+ assertFalse(mTask.hasChild());
assertThat(mStack.getAllTasks()).isEmpty();
}
@@ -964,7 +964,7 @@
mStack.handleAppDiedLocked(activity.app);
- assertEquals(1, mTask.mActivities.size());
+ assertEquals(1, mTask.getChildCount());
assertEquals(1, mStack.getAllTasks().size());
}
@@ -978,7 +978,7 @@
mStack.handleAppDiedLocked(activity.app);
- assertThat(mTask.mActivities).isEmpty();
+ assertFalse(mTask.hasChild());
assertThat(mStack.getAllTasks()).isEmpty();
}