Move policy handling into ATM hierarchy [2/n]
Start removing concept of "insetBounds".
This is an important step in moving policy into the hierarchy since it
represents a codepath that resolves configuration with more data than
what is in the hierarchy (passing in 2-3 sets of bounds instead of 1).
In theory, we shouldn't need this as the extra bounds are only used
during transitionary periods (animation/interactive dragging).
Previously, we set the whole hierarchy to have the "displayed" bounds
and then fed in "insetBounds" to be used for the actual configuration
update. This is a backwards abstraction and a little wasteful since what
we actually want to do is prevent the configuration from updating and
change only how/where the eventual window is displayed.
This CL is a first step which introduces mDisplayedBounds to represent
the Task's bounds during transient periods. This way we can leave the
hierarchy in a steady state and use the displayed bounds to move it
around on screen. These displayedBounds are then used to position the
surface and the computed frame so that we aren't recalculating the
hierarchy (and passing "inset" bounds around) for transient operations.
Bug: 113900640
Bug: 119687367
Test: go/wm-smoke and wmtests/servicestests
Change-Id: Ia70d3e260e9ed6e2c2c8c19920025fd10fab9e17
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index d3db5df..c70f075 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -27,11 +27,11 @@
import static com.android.server.wm.TaskProto.APP_WINDOW_TOKENS;
import static com.android.server.wm.TaskProto.BOUNDS;
import static com.android.server.wm.TaskProto.DEFER_REMOVAL;
+import static com.android.server.wm.TaskProto.DISPLAYED_BOUNDS;
import static com.android.server.wm.TaskProto.FILLS_PARENT;
import static com.android.server.wm.TaskProto.ID;
import static com.android.server.wm.TaskProto.SURFACE_HEIGHT;
import static com.android.server.wm.TaskProto.SURFACE_WIDTH;
-import static com.android.server.wm.TaskProto.TEMP_INSET_BOUNDS;
import static com.android.server.wm.TaskProto.WINDOW_CONTAINER;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
@@ -66,8 +66,8 @@
final Rect mPreparedFrozenBounds = new Rect();
final Configuration mPreparedFrozenMergedConfig = new Configuration();
- // Bounds used to calculate the insets.
- private final Rect mTempInsetBounds = new Rect();
+ // If non-empty, bounds used to display the task during animations/interactions.
+ private final Rect mOverrideDisplayedBounds = new Rect();
/** ID of the display which rotation {@link #mRotation} has. */
private int mLastRotationDisplayId = Display.INVALID_DISPLAY;
@@ -307,23 +307,23 @@
}
/**
- * Sets the bounds used to calculate the insets. See
- * {@link android.app.IActivityTaskManager#resizeDockedStack} why this is needed.
+ * Sets bounds that override where the task is displayed. Used during transient operations
+ * like animation / interaction.
*/
- void setTempInsetBounds(Rect tempInsetBounds) {
- if (tempInsetBounds != null) {
- mTempInsetBounds.set(tempInsetBounds);
+ void setOverrideDisplayedBounds(Rect overrideDisplayedBounds) {
+ if (overrideDisplayedBounds != null) {
+ mOverrideDisplayedBounds.set(overrideDisplayedBounds);
} else {
- mTempInsetBounds.setEmpty();
+ mOverrideDisplayedBounds.setEmpty();
}
}
/**
- * Gets the bounds used to calculate the insets. See
+ * Gets the bounds that override where the task is displayed. See
* {@link android.app.IActivityTaskManager#resizeDockedStack} why this is needed.
*/
- void getTempInsetBounds(Rect out) {
- out.set(mTempInsetBounds);
+ Rect getOverrideDisplayedBounds() {
+ return mOverrideDisplayedBounds;
}
void setResizeable(int resizeMode) {
@@ -380,8 +380,13 @@
} else {
mTmpRect2.offsetTo(adjustedBounds.left, adjustedBounds.top);
}
- setTempInsetBounds(tempInsetBounds);
- setBounds(mTmpRect2, false /* forced */);
+ if (tempInsetBounds == null || tempInsetBounds.isEmpty()) {
+ setOverrideDisplayedBounds(null);
+ setBounds(mTmpRect2);
+ } else {
+ setOverrideDisplayedBounds(mTmpRect2);
+ setBounds(tempInsetBounds);
+ }
}
/** Return true if the current bound can get outputted to the rest of the system as-is. */
@@ -407,6 +412,15 @@
mStack.getDisplayContent().getBounds(out);
}
+ @Override
+ public Rect getDisplayedBounds() {
+ if (mOverrideDisplayedBounds.isEmpty()) {
+ return super.getDisplayedBounds();
+ } else {
+ return mOverrideDisplayedBounds;
+ }
+ }
+
/**
* Calculate the maximum visible area of this task. If the task has only one app,
* the result will be visible frame of that app. If the task has more than one apps,
@@ -723,7 +737,7 @@
}
proto.write(FILLS_PARENT, matchParentBounds());
getBounds().writeToProto(proto, BOUNDS);
- mTempInsetBounds.writeToProto(proto, TEMP_INSET_BOUNDS);
+ mOverrideDisplayedBounds.writeToProto(proto, DISPLAYED_BOUNDS);
proto.write(DEFER_REMOVAL, mDeferRemoval);
proto.write(SURFACE_WIDTH, mSurfaceControl.getWidth());
proto.write(SURFACE_HEIGHT, mSurfaceControl.getHeight());
@@ -739,7 +753,7 @@
pw.println(doublePrefix + "mBounds=" + getBounds().toShortString());
pw.println(doublePrefix + "mdr=" + mDeferRemoval);
pw.println(doublePrefix + "appTokens=" + mChildren);
- pw.println(doublePrefix + "mTempInsetBounds=" + mTempInsetBounds.toShortString());
+ pw.println(doublePrefix + "mDisplayedBounds=" + mOverrideDisplayedBounds.toShortString());
final String triplePrefix = doublePrefix + " ";
final String quadruplePrefix = triplePrefix + " ";