diff options
| author | 2018-12-05 11:48:52 +0000 | |
|---|---|---|
| committer | 2018-12-05 11:48:52 +0000 | |
| commit | e8f49f349ad619e180be54a22db4a59324c1ba48 (patch) | |
| tree | 743c80adb91e2c254599738ee0ab2a19106a1b70 | |
| parent | 97a0949361a4ece651fdbd63113420ba706975e1 (diff) | |
| parent | b149a1a97278278eb758d9a27af50e20a4cfb7eb (diff) | |
Merge "Prioritize Smart Actions over Smart Replies."
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java | 58 | ||||
| -rw-r--r-- | packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java | 51 |
2 files changed, 98 insertions, 11 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 f1996b137021..2a4336e809a0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java @@ -40,6 +40,7 @@ import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.phone.KeyguardDismissUtil; import java.text.BreakIterator; +import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.PriorityQueue; @@ -294,6 +295,9 @@ public class SmartReplyView extends ViewGroup { // TODO(b/119010281): handle accessibility + // Mark this as an Action button + final LayoutParams lp = (LayoutParams) button.getLayoutParams(); + lp.buttonType = SmartButtonType.ACTION; return button; } @@ -330,18 +334,26 @@ public class SmartReplyView extends ViewGroup { int displayedChildCount = 0; int buttonPaddingHorizontal = mSingleLineButtonPaddingHorizontal; - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); + // Set up a list of suggestions where actions come before replies. Note that the Buttons + // themselves have already been added to the view hierarchy in an order such that Smart + // Replies are shown before Smart Actions. The order of the list below determines which + // suggestions will be shown at all - only the first X elements are shown (where X depends + // on how much space each suggestion button needs). + List<View> smartActions = filterActionsOrReplies(SmartButtonType.ACTION); + List<View> smartReplies = filterActionsOrReplies(SmartButtonType.REPLY); + List<View> smartSuggestions = new ArrayList<>(smartActions); + smartSuggestions.addAll(smartReplies); + List<View> coveredSuggestions = new ArrayList<>(); + + for (View child : smartSuggestions) { final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - if (child.getVisibility() != View.VISIBLE || !(child instanceof Button)) { - continue; - } child.setPadding(buttonPaddingHorizontal, child.getPaddingTop(), buttonPaddingHorizontal, child.getPaddingBottom()); child.measure(MEASURE_SPEC_ANY_LENGTH, heightMeasureSpec); + coveredSuggestions.add(child); + final int lineCount = ((Button) child).getLineCount(); if (lineCount < 1 || lineCount > 2) { // If smart reply has no text, or more than two lines, then don't show it. @@ -395,7 +407,8 @@ public class SmartReplyView extends ViewGroup { // Mark all buttons from the last squeezing round as "failed to squeeze", so // that they're re-measured without squeezing later. - markButtonsWithPendingSqueezeStatusAs(LayoutParams.SQUEEZE_STATUS_FAILED, i); + markButtonsWithPendingSqueezeStatusAs( + LayoutParams.SQUEEZE_STATUS_FAILED, coveredSuggestions); // The current button doesn't fit, so there's no point in measuring further // buttons. @@ -404,7 +417,8 @@ public class SmartReplyView extends ViewGroup { // The current button fits, so mark all squeezed buttons as "successfully squeezed" // to prevent them from being un-squeezed in a subsequent squeezing round. - markButtonsWithPendingSqueezeStatusAs(LayoutParams.SQUEEZE_STATUS_SUCCESSFUL, i); + markButtonsWithPendingSqueezeStatusAs( + LayoutParams.SQUEEZE_STATUS_SUCCESSFUL, coveredSuggestions); } lp.show = true; @@ -423,6 +437,22 @@ public class SmartReplyView extends ViewGroup { mPaddingTop + maxChildHeight + mPaddingBottom), heightMeasureSpec)); } + private List<View> filterActionsOrReplies(SmartButtonType buttonType) { + List<View> actions = new ArrayList<>(); + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + if (child.getVisibility() != View.VISIBLE || !(child instanceof Button)) { + continue; + } + if (lp.buttonType == buttonType) { + actions.add(child); + } + } + return actions; + } + private void resetButtonsLayoutParams() { final int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { @@ -593,9 +623,9 @@ public class SmartReplyView extends ViewGroup { } } - private void markButtonsWithPendingSqueezeStatusAs(int squeezeStatus, int maxChildIndex) { - for (int i = 0; i <= maxChildIndex; i++) { - final View child = getChildAt(i); + private void markButtonsWithPendingSqueezeStatusAs( + int squeezeStatus, List<View> coveredChildren) { + for (View child : coveredChildren) { final LayoutParams lp = (LayoutParams) child.getLayoutParams(); if (lp.squeezeStatus == LayoutParams.SQUEEZE_STATUS_PENDING) { lp.squeezeStatus = squeezeStatus; @@ -690,6 +720,11 @@ public class SmartReplyView extends ViewGroup { return mActivityStarter; } + private enum SmartButtonType { + REPLY, + ACTION + } + @VisibleForTesting static class LayoutParams extends ViewGroup.LayoutParams { @@ -715,6 +750,7 @@ public class SmartReplyView extends ViewGroup { private boolean show = false; private int squeezeStatus = SQUEEZE_STATUS_NONE; + private SmartButtonType buttonType = SmartButtonType.REPLY; private LayoutParams(Context c, AttributeSet attrs) { super(c, attrs); 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 df7aeab2ed38..506fa974944a 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 @@ -801,4 +801,55 @@ public class SmartReplyViewTest extends SysuiTestCase { assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(1), mView.getChildAt(1)); assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(2), mView.getChildAt(2)); } + + @Test + public void testMeasure_choicesAndActionsPrioritizeActionsOnlyActions() { + String[] choices = new String[] {"Reply"}; + String[] actions = new String[] {"Looooooong actioooon", "second action", "third action"}; + + // All actions should be displayed as DOUBLE-line smart action buttons. + ViewGroup expectedView = buildExpectedView(new String[0], 2, + createActions(new String[] { + "Looooooong \nactioooon", "second \naction", "third \naction"})); + expectedView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); + + setSmartRepliesAndActions(choices, actions); + mView.measure( + MeasureSpec.makeMeasureSpec(expectedView.getMeasuredWidth(), MeasureSpec.AT_MOST), + MeasureSpec.UNSPECIFIED); + + assertEqualMeasures(expectedView, mView); + // smart replies + assertReplyButtonHidden(mView.getChildAt(0)); + // smart actions + assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(0), mView.getChildAt(1)); + assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(1), mView.getChildAt(2)); + assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(2), mView.getChildAt(3)); + } + + @Test + public void testMeasure_choicesAndActionsPrioritizeActions() { + String[] choices = new String[] {"Short", "longer reply"}; + String[] actions = new String[] {"Looooooong actioooon", "second action"}; + + // All actions should be displayed as DOUBLE-line smart action buttons. + ViewGroup expectedView = buildExpectedView(new String[] {"Short"}, 2, + createActions(new String[] {"Looooooong \nactioooon", "second \naction"})); + expectedView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); + + setSmartRepliesAndActions(choices, actions); + mView.measure( + MeasureSpec.makeMeasureSpec(expectedView.getMeasuredWidth(), MeasureSpec.AT_MOST), + MeasureSpec.UNSPECIFIED); + + Button firstAction = ((Button) mView.getChildAt(1)); + + assertEqualMeasures(expectedView, mView); + // smart replies + assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(0), mView.getChildAt(0)); + assertReplyButtonHidden(mView.getChildAt(1)); + // smart actions + assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(1), mView.getChildAt(2)); + assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(2), mView.getChildAt(3)); + } } |