From 48ee6d6cc05d5f87edb359a57ec6bdef2b56a59b Mon Sep 17 00:00:00 2001 From: Kenny Guy Date: Wed, 9 May 2018 16:51:26 +0100 Subject: [PATCH] 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 --- .../statusbar/policy/SmartReplyView.java | 14 ++++---- .../statusbar/policy/SmartReplyViewTest.java | 36 ++++++++++++++++--- 2 files changed, 40 insertions(+), 10 deletions(-) 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 351868dd8b7b8..dbd9ddf856f87 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 @@ public class SmartReplyView extends ViewGroup { // 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 f3d79fd589829..c573ca88a4711 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 @@ public class SmartReplyViewTest extends SysuiTestCase { 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 @@ public class SmartReplyViewTest extends SysuiTestCase { 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 @@ public class SmartReplyViewTest extends SysuiTestCase { 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()); + } }