Change Task to have generic WindowContainer children (73/n)
- Step towards Tasks containing other Tasks.
- There are several places where we want to perform an operation on all
activities in a branch of the hierarchy. We end up looping based on
the parent knowing what type of children is in the sub-branch.
Instead use forAllActivities() to perfrom the operation on all
activities in the sub-branch.
Bug: 80414790
Test: Existing tests pass
Change-Id: I3dd08784e82b3eceac9aacacd4d1f1bd85ef8c02
diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
index d088a5e..0376d2c 100644
--- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
@@ -138,6 +138,7 @@
import com.android.internal.os.TransferPipe;
import com.android.internal.os.logging.MetricsLoggerWrapper;
import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.function.pooled.PooledConsumer;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.am.ActivityManagerService;
import com.android.server.am.UserState;
@@ -825,7 +826,7 @@
task.mTaskId, r.shortComponentName);
if (r.isActivityTypeHome()) {
// Home process is the root process of the task.
- updateHomeProcess(task.getChildAt(0).app);
+ updateHomeProcess(task.getBottomMostActivity().app);
}
mService.getPackageManagerInternalLocked().notifyPackageUse(
r.intent.getComponent().getPackageName(), NOTIFY_PACKAGE_USE_ACTIVITY);
@@ -1688,7 +1689,7 @@
}
}
if (!deferResume) {
- stack.ensureVisibleActivitiesConfigurationLocked(r, preserveWindows);
+ stack.ensureVisibleActivitiesConfiguration(r, preserveWindows);
}
} finally {
mAllowDockedStackResize = true;
@@ -2485,18 +2486,23 @@
return;
}
- for (int i = task.getChildCount() - 1; i >= 0; i--) {
- final ActivityRecord r = task.getChildAt(i);
- if (r.attachedToProcess()) {
- mMultiWindowModeChangedActivities.add(r);
- }
- }
+ final PooledConsumer c = PooledLambda.obtainConsumer(
+ ActivityStackSupervisor::addToMultiWindowModeChangedList, this,
+ PooledLambda.__(ActivityRecord.class));
+ task.forAllActivities(c);
+ c.recycle();
if (!mHandler.hasMessages(REPORT_MULTI_WINDOW_MODE_CHANGED_MSG)) {
mHandler.sendEmptyMessage(REPORT_MULTI_WINDOW_MODE_CHANGED_MSG);
}
}
+ private void addToMultiWindowModeChangedList(ActivityRecord r) {
+ if (r.attachedToProcess()) {
+ mMultiWindowModeChangedActivities.add(r);
+ }
+ }
+
void scheduleUpdatePictureInPictureModeIfNeeded(Task task, ActivityStack prevStack) {
final ActivityStack stack = task.getStack();
if (prevStack == null || prevStack == stack
@@ -2507,17 +2513,13 @@
scheduleUpdatePictureInPictureModeIfNeeded(task, stack.getRequestedOverrideBounds());
}
- void scheduleUpdatePictureInPictureModeIfNeeded(Task task, Rect targetStackBounds) {
- 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
- // change list as the processing of pip change will make sure multi-window changed
- // message is processed in the right order relative to pip changed.
- mMultiWindowModeChangedActivities.remove(r);
- }
- }
+ private void scheduleUpdatePictureInPictureModeIfNeeded(Task task, Rect targetStackBounds) {
+ final PooledConsumer c = PooledLambda.obtainConsumer(
+ ActivityStackSupervisor::addToPipModeChangedList, this,
+ PooledLambda.__(ActivityRecord.class));
+ task.forAllActivities(c);
+ c.recycle();
+
mPipModeChangedTargetStackBounds = targetStackBounds;
if (!mHandler.hasMessages(REPORT_PIP_MODE_CHANGED_MSG)) {
@@ -2525,14 +2527,23 @@
}
}
+ private void addToPipModeChangedList(ActivityRecord r) {
+ if (!r.attachedToProcess()) return;
+
+ mPipModeChangedActivities.add(r);
+ // If we are scheduling pip change, then remove this activity from multi-window
+ // change list as the processing of pip change will make sure multi-window changed
+ // message is processed in the right order relative to pip changed.
+ mMultiWindowModeChangedActivities.remove(r);
+ }
+
void updatePictureInPictureMode(Task task, Rect targetStackBounds, boolean forceUpdate) {
mHandler.removeMessages(REPORT_PIP_MODE_CHANGED_MSG);
- for (int i = task.getChildCount() - 1; i >= 0; i--) {
- final ActivityRecord r = task.getChildAt(i);
- if (r.attachedToProcess()) {
- r.updatePictureInPictureMode(targetStackBounds, forceUpdate);
- }
- }
+ final PooledConsumer c = PooledLambda.obtainConsumer(
+ ActivityRecord::updatePictureInPictureMode,
+ PooledLambda.__(ActivityRecord.class), targetStackBounds, forceUpdate);
+ task.forAllActivities(c);
+ c.recycle();
}
void wakeUp(String reason) {