summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/WindowAnimationSpec.java19
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java19
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);