Fix issue with compressed smart replies.
Width overflows if we both remeasure due
to failing to squeeze and due to padding
changes.
Bug: 79225896
Test: atest SmartReplyViewTest
Test: manual - recieve notification from Inbox check reply buttons.
Change-Id: I8ef306bbb7e3732b433830f856257fbfedeb89c0
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
index 351868d..dbd9ddf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
@@ -454,12 +454,14 @@
// measured with the wrong number of lines).
if (child.getPaddingLeft() != buttonPaddingHorizontal) {
requiresNewMeasure = true;
- if (buttonPaddingHorizontal == mSingleLineButtonPaddingHorizontal) {
- // Decrease padding (2->1 line).
- newWidth -= mSingleToDoubleLineButtonWidthIncrease;
- } else {
- // Increase padding (1->2 lines).
- newWidth += mSingleToDoubleLineButtonWidthIncrease;
+ if (newWidth != Integer.MAX_VALUE) {
+ if (buttonPaddingHorizontal == mSingleLineButtonPaddingHorizontal) {
+ // Change padding (2->1 line).
+ newWidth -= mSingleToDoubleLineButtonWidthIncrease;
+ } else {
+ // Change padding (1->2 lines).
+ newWidth += mSingleToDoubleLineButtonWidthIncrease;
+ }
}
child.setPadding(buttonPaddingHorizontal, child.getPaddingTop(),
buttonPaddingHorizontal, child.getPaddingBottom());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
index f3d79fd..c573ca8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
@@ -347,6 +347,30 @@
assertEqualLayouts(expectedView.getChildAt(2), mView.getChildAt(2));
}
+ @Test
+ public void testMeasure_dropLongest() {
+ final CharSequence[] choices = new CharSequence[]{"Short", "Short",
+ "LooooooongUnbreakableReplyyyyy"};
+
+ // Short choices should be shown as single line views
+ ViewGroup expectedView = buildExpectedView(
+ new CharSequence[]{"Short", "Short"}, 1);
+ expectedView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+ expectedView.layout(10, 10, 10 + expectedView.getMeasuredWidth(),
+ 10 + expectedView.getMeasuredHeight());
+
+ setRepliesFromRemoteInput(choices);
+ mView.measure(
+ MeasureSpec.makeMeasureSpec(expectedView.getMeasuredWidth(), MeasureSpec.AT_MOST),
+ MeasureSpec.UNSPECIFIED);
+ mView.layout(10, 10, 10 + mView.getMeasuredWidth(), 10 + mView.getMeasuredHeight());
+
+ assertEqualLayouts(expectedView, mView);
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(0), mView.getChildAt(0));
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(1), mView.getChildAt(1));
+ assertReplyButtonHidden(mView.getChildAt(2));
+ }
+
private void setRepliesFromRemoteInput(CharSequence[] choices) {
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0,
new Intent(TEST_ACTION), 0);
@@ -407,10 +431,7 @@
private static void assertReplyButtonShownWithEqualMeasures(View expected, View actual) {
assertReplyButtonShown(actual);
assertEqualMeasures(expected, actual);
- assertEquals(expected.getPaddingLeft(), actual.getPaddingLeft());
- assertEquals(expected.getPaddingTop(), actual.getPaddingTop());
- assertEquals(expected.getPaddingRight(), actual.getPaddingRight());
- assertEquals(expected.getPaddingBottom(), actual.getPaddingBottom());
+ assertEqualPadding(expected, actual);
}
private static void assertReplyButtonShown(View view) {
@@ -427,4 +448,11 @@
assertEquals(expected.getRight(), actual.getRight());
assertEquals(expected.getBottom(), actual.getBottom());
}
+
+ private static void assertEqualPadding(View expected, View actual) {
+ assertEquals(expected.getPaddingLeft(), actual.getPaddingLeft());
+ assertEquals(expected.getPaddingTop(), actual.getPaddingTop());
+ assertEquals(expected.getPaddingRight(), actual.getPaddingRight());
+ assertEquals(expected.getPaddingBottom(), actual.getPaddingBottom());
+ }
}