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());
+    }
 }