diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowAnimationSpec.java | 19 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java | 19 |
2 files changed, 32 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/wm/WindowAnimationSpec.java b/services/core/java/com/android/server/wm/WindowAnimationSpec.java index 57311e19bc76..d8ebd84b3e73 100644 --- a/services/core/java/com/android/server/wm/WindowAnimationSpec.java +++ b/services/core/java/com/android/server/wm/WindowAnimationSpec.java @@ -98,14 +98,25 @@ public class WindowAnimationSpec implements AnimationSpec { tmp.transformation.getMatrix().postTranslate(mPosition.x, mPosition.y); t.setMatrix(leash, tmp.transformation.getMatrix(), tmp.floats); t.setAlpha(leash, tmp.transformation.getAlpha()); - if (mStackClipMode == STACK_CLIP_NONE || mStackClipMode == STACK_CLIP_AFTER_ANIM) { - t.setWindowCrop(leash, tmp.transformation.getClipRect()); + + boolean cropSet = false; + if (mStackClipMode == STACK_CLIP_NONE) { + if (tmp.transformation.hasClipRect()) { + t.setWindowCrop(leash, tmp.transformation.getClipRect()); + cropSet = true; + } } else { mTmpRect.set(mStackBounds); - mTmpRect.intersect(tmp.transformation.getClipRect()); + if (tmp.transformation.hasClipRect()) { + mTmpRect.intersect(tmp.transformation.getClipRect()); + } t.setWindowCrop(leash, mTmpRect); + cropSet = true; } - if (mAnimation.hasRoundedCorners() && mWindowCornerRadius > 0) { + + // We can only apply rounded corner if a crop is set, as otherwise the value is meaningless, + // since it doesn't have anything it's relative to. + if (cropSet && mAnimation.hasRoundedCorners() && mWindowCornerRadius > 0) { t.setCornerRadius(leash, mWindowCornerRadius); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java b/services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java index 897f0a2c6e81..0330de8d2c63 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java @@ -22,6 +22,8 @@ import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_AFTER_ANIM; import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_BEFORE_ANIM; import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_NONE; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.never; @@ -70,7 +72,8 @@ public class WindowAnimationSpecTest { mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_AFTER_ANIM, true /* isAppAnimation */, 0 /* windowCornerRadius */); windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0); - verify(mTransaction).setWindowCrop(eq(mSurfaceControl), argThat(Rect::isEmpty)); + verify(mTransaction).setWindowCrop(eq(mSurfaceControl), + argThat(rect -> rect.equals(mStackBounds))); } @Test @@ -80,7 +83,8 @@ public class WindowAnimationSpecTest { new Point(20, 40), mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_AFTER_ANIM, true /* isAppAnimation */, 0 /* windowCornerRadius */); windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0); - verify(mTransaction).setWindowCrop(eq(mSurfaceControl), argThat(Rect::isEmpty)); + verify(mTransaction).setWindowCrop(eq(mSurfaceControl), + argThat(rect -> rect.equals(mStackBounds))); } @Test @@ -121,6 +125,17 @@ public class WindowAnimationSpecTest { } @Test + public void testApply_setCornerRadius_noClip() { + final float windowCornerRadius = 30f; + WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(mAnimation, null, + mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_NONE, + true /* isAppAnimation */, windowCornerRadius); + when(mAnimation.hasRoundedCorners()).thenReturn(true); + windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0); + verify(mTransaction, never()).setCornerRadius(any(), anyFloat()); + } + + @Test public void testApply_clipBeforeSmallerAnimationClip() { // Stack bounds is (0, 0, 10, 10) animation clip is (0, 0, 5, 5) Rect windowCrop = new Rect(0, 0, 5, 5); |