Apply over-expansion to clipping bounds
Fixes: 288553572
Test: atest SystemUITests
Flag: com.android.systemui.notification_over_expansion_clipping_fix
Change-Id: I6ae1671394bad49951cea590db87d3a62e9d3fae
diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig
index c979d05..b214a5c 100644
--- a/packages/SystemUI/aconfig/systemui.aconfig
+++ b/packages/SystemUI/aconfig/systemui.aconfig
@@ -61,6 +61,16 @@
}
flag {
+ name: "notification_over_expansion_clipping_fix"
+ namespace: "systemui"
+ description: "fix NSSL clipping when over-expanding; fixes split shade bug."
+ bug: "288553572"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
+
+flag {
name: "notification_async_group_header_inflation"
namespace: "systemui"
description: "Inflates the notification group summary header views from the background thread."
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
index 0bb871b..dedf366 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
@@ -291,7 +291,7 @@
mOverExpansion = overExpansion;
}
- float getOverExpansion() {
+ public float getOverExpansion() {
return mOverExpansion;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
index 82559de..f3b8a9a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
@@ -23,6 +23,7 @@
import static com.android.internal.jank.InteractionJankMonitor.CUJ_NOTIFICATION_SHADE_SCROLL_FLING;
import static com.android.internal.jank.InteractionJankMonitor.CUJ_SHADE_CLEAR_ALL;
import static com.android.systemui.Flags.newAodTransition;
+import static com.android.systemui.Flags.notificationOverExpansionClippingFix;
import static com.android.systemui.flags.Flags.UNCLEARED_TRANSIENT_HUN_FIX;
import static com.android.systemui.statusbar.notification.stack.NotificationPriorityBucketKt.BUCKET_SILENT;
import static com.android.systemui.statusbar.notification.stack.StackStateAnimator.ANIMATION_DURATION_SWIPE;
@@ -514,6 +515,7 @@
private int mRoundedRectClippingTop;
private int mRoundedRectClippingBottom;
private int mRoundedRectClippingRight;
+ private int mRoundedRectClippingYTranslation;
private final float[] mBgCornerRadii = new float[8];
/**
@@ -669,6 +671,9 @@
*/
void setOverExpansion(float margin) {
mAmbientState.setOverExpansion(margin);
+ if (notificationOverExpansionClippingFix() && !SceneContainerFlag.isEnabled()) {
+ setRoundingClippingYTranslation((int) margin);
+ }
updateStackPosition();
requestChildrenUpdate();
}
@@ -5094,6 +5099,7 @@
pw.append(" t=").print(mRoundedRectClippingTop);
pw.append(" r=").print(mRoundedRectClippingRight);
pw.append(" b=").print(mRoundedRectClippingBottom);
+ pw.append(" +y=").print(mRoundedRectClippingYTranslation);
pw.append("} topRadius=").print(mBgCornerRadii[0]);
pw.append(" bottomRadius=").println(mBgCornerRadii[4]);
}
@@ -5645,8 +5651,28 @@
mBgCornerRadii[5] = bottomRadius;
mBgCornerRadii[6] = bottomRadius;
mBgCornerRadii[7] = bottomRadius;
+ updateRoundedClipPath();
+ }
+
+ // see b/288553572
+ private void setRoundingClippingYTranslation(int yTranslation) {
+ SceneContainerFlag.assertInLegacyMode();
+ if (mRoundedRectClippingYTranslation == yTranslation) {
+ return;
+ }
+ mRoundedRectClippingYTranslation = yTranslation;
+ updateRoundedClipPath();
+ }
+
+ private void updateRoundedClipPath() {
+ SceneContainerFlag.assertInLegacyMode();
mRoundedClipPath.reset();
- mRoundedClipPath.addRoundRect(left, top, right, bottom, mBgCornerRadii, Path.Direction.CW);
+ mRoundedClipPath.addRoundRect(
+ mRoundedRectClippingLeft,
+ mRoundedRectClippingTop + mRoundedRectClippingYTranslation,
+ mRoundedRectClippingRight,
+ mRoundedRectClippingBottom + mRoundedRectClippingYTranslation,
+ mBgCornerRadii, Path.Direction.CW);
if (mShouldUseRoundedRectClipping) {
invalidate();
}