Use stack bounds to apply STACK_CLIP_BEFORE_ANIM
Clips the stack before the animation. Added back the
getAnimationBounds helper for testing.
Bug: 130651371
Test: atest AppWindowTokenTests#testTransitionAnimationBounds
Change-Id: Ibd0882ab790031585598efb2be64423da233228a
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index a53f85d..d4a4170 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -21,8 +21,6 @@
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.content.pm.ActivityInfo.COLOR_MODE_DEFAULT;
-import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION;
-import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
@@ -81,6 +79,7 @@
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES;
import static com.android.server.wm.WindowManagerService.logWithStack;
import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_AFTER_ANIM;
+import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_BEFORE_ANIM;
import android.annotation.CallSuper;
import android.annotation.Size;
@@ -2475,6 +2474,17 @@
return getBounds();
}
+ @VisibleForTesting
+ Rect getAnimationBounds(int appStackClipMode) {
+ if (appStackClipMode == STACK_CLIP_BEFORE_ANIM && getStack() != null) {
+ // Using the stack bounds here effectively applies the clipping before animation.
+ return getStack().getBounds();
+ }
+ // Use task-bounds if available so that activity-level letterbox (maxAspectRatio) is
+ // included in the animation.
+ return getTask() != null ? getTask().getBounds() : getBounds();
+ }
+
boolean applyAnimationLocked(WindowManager.LayoutParams lp, int transit, boolean enter,
boolean isVoiceInteraction) {
@@ -2495,9 +2505,11 @@
final AnimationAdapter adapter;
AnimationAdapter thumbnailAdapter = null;
- // Separate position and size for use in animators. Use task-bounds for now so
- // that activity-level letterbox (maxAspectRatio) is included in the animation.
- mTmpRect.set(getTask() != null ? getTask().getBounds() : getBounds());
+ final int appStackClipMode =
+ getDisplayContent().mAppTransition.getAppStackClipMode();
+
+ // Separate position and size for use in animators.
+ mTmpRect.set(getAnimationBounds(appStackClipMode));
mTmpPoint.set(mTmpRect.left, mTmpRect.top);
mTmpRect.offsetTo(0, 0);
@@ -2531,8 +2543,6 @@
mTransit = transit;
mTransitFlags = getDisplayContent().mAppTransition.getTransitFlags();
} else {
- final int appStackClipMode =
- getDisplayContent().mAppTransition.getAppStackClipMode();
mNeedsAnimationBoundsLayer = (appStackClipMode == STACK_CLIP_AFTER_ANIM);
final Animation a = loadAnimation(lp, transit, enter, isVoiceInteraction);