diff options
| author | 2024-10-31 07:37:53 +0000 | |
|---|---|---|
| committer | 2024-10-31 11:22:00 +0000 | |
| commit | a37db3ab47cd0c349c217f2e5ad7a275b34d2019 (patch) | |
| tree | 00a19126dabda3b79a6e5c1d1368b43491147e4d | |
| parent | 428aef405975f5e07e8e47afaf91823ea3c338a4 (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.aconfig | 11 | ||||
| -rw-r--r-- | libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultSurfaceAnimator.java | 20 |
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); } } } |