Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a37db3ab authored by Riddle Hsu's avatar Riddle Hsu
Browse files

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
parent 428aef40
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -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"
+15 −5
Original line number Diff line number Diff line
@@ -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);
                }
            }
        }