From a37db3ab47cd0c349c217f2e5ad7a275b34d2019 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Thu, 31 Oct 2024 07:37:53 +0000 Subject: 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 --- .../android/window/flags/windowing_frontend.aconfig | 11 +++++++++++ .../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 @@ -48,6 +48,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" 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); } } } -- cgit v1.2.3-59-g8ed1b