summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Riddle Hsu <riddlehsu@google.com> 2024-10-31 07:37:53 +0000
committer Riddle Hsu <riddlehsu@google.com> 2024-10-31 11:22:00 +0000
commita37db3ab47cd0c349c217f2e5ad7a275b34d2019 (patch)
tree00a19126dabda3b79a6e5c1d1368b43491147e4d
parent428aef405975f5e07e8e47afaf91823ea3c338a4 (diff)
Make shell default animator respect clip rect
This aligns the transformation operations with legacy transition's WindowAnimationSpec of WM core. Bug: 376601866 Flag: com.android.window.flags.respect_animation_clip Test: Launch an activity with ActivityOptions.makeClipRevealAnimation The open animation should apply the give clip bounds. Change-Id: I8aecc34f63ae3483b1369b49056aa3b7805d8dd2
-rw-r--r--core/java/android/window/flags/windowing_frontend.aconfig11
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultSurfaceAnimator.java20
2 files changed, 26 insertions, 5 deletions
diff --git a/core/java/android/window/flags/windowing_frontend.aconfig b/core/java/android/window/flags/windowing_frontend.aconfig
index 3a035087be7f..e9a5ffd10d92 100644
--- a/core/java/android/window/flags/windowing_frontend.aconfig
+++ b/core/java/android/window/flags/windowing_frontend.aconfig
@@ -49,6 +49,17 @@ flag {
}
flag {
+ name: "respect_animation_clip"
+ namespace: "windowing_frontend"
+ description: "Fix missing clip transformation of animation"
+ bug: "376601866"
+ is_fixed_read_only: true
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
+
+flag {
name: "edge_to_edge_by_default"
namespace: "windowing_frontend"
description: "Make app go edge-to-edge by default when targeting SDK 35 or greater"
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultSurfaceAnimator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultSurfaceAnimator.java
index a1a9ca9fd2bd..4ea4613185e1 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultSurfaceAnimator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultSurfaceAnimator.java
@@ -136,6 +136,7 @@ public class DefaultSurfaceAnimator {
@NonNull final Animation mAnim;
@Nullable final Point mPosition;
@Nullable final Rect mClipRect;
+ @Nullable private final Rect mAnimClipRect;
final float mCornerRadius;
final boolean mIsActivity;
@@ -147,6 +148,7 @@ public class DefaultSurfaceAnimator {
mPosition = (position != null && (position.x != 0 || position.y != 0))
? position : null;
mClipRect = (clipRect != null && !clipRect.isEmpty()) ? clipRect : null;
+ mAnimClipRect = mClipRect != null ? new Rect() : null;
mCornerRadius = cornerRadius;
mIsActivity = isActivity;
}
@@ -169,18 +171,26 @@ public class DefaultSurfaceAnimator {
t.setAlpha(leash, transformation.getAlpha());
if (mClipRect != null) {
- Rect clipRect = mClipRect;
+ boolean needCrop = false;
+ mAnimClipRect.set(mClipRect);
+ if (transformation.hasClipRect()
+ && com.android.window.flags.Flags.respectAnimationClip()) {
+ mAnimClipRect.intersectUnchecked(transformation.getClipRect());
+ needCrop = true;
+ }
final Insets extensionInsets = Insets.min(transformation.getInsets(), Insets.NONE);
if (!extensionInsets.equals(Insets.NONE)) {
// Clip out any overflowing edge extension.
- clipRect = new Rect(mClipRect);
- clipRect.inset(extensionInsets);
- t.setCrop(leash, clipRect);
+ mAnimClipRect.inset(extensionInsets);
+ needCrop = true;
}
if (mCornerRadius > 0 && mAnim.hasRoundedCorners()) {
// Rounded corner can only be applied if a crop is set.
- t.setCrop(leash, clipRect);
t.setCornerRadius(leash, mCornerRadius);
+ needCrop = true;
+ }
+ if (needCrop) {
+ t.setCrop(leash, mAnimClipRect);
}
}
}