Index: chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarControlLayout.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarControlLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarControlLayout.java |
index 6b5e1a9cdb95a629e05dca6000a87ad46c6c4498..7bb2d2dec166408d794b1769090e5bc8a1cae03c 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarControlLayout.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarControlLayout.java |
@@ -92,25 +92,49 @@ public final class InfoBarControlLayout extends ViewGroup { |
int exactlyColumnWidthSpec = MeasureSpec.makeMeasureSpec(columnWidth, MeasureSpec.EXACTLY); |
int unspecifiedSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); |
- // Measure all children, assuming they all have to fit within the width of the layout. |
- // Height is unconstrained. |
+ // Figure out how many columns each child requires. |
for (int i = 0; i < getChildCount(); i++) { |
View child = getChildAt(i); |
measureChild(child, atMostFullWidthSpec, unspecifiedSpec); |
if (child.getMeasuredWidth() <= columnWidth |
&& !getControlLayoutParams(child).mMustBeFullWidth) { |
- // Stretch out the control to take up a column width. |
getControlLayoutParams(child).columnsRequired = 1; |
- measureChild(child, exactlyColumnWidthSpec, unspecifiedSpec); |
} else { |
- // Stretch out the control to take up the full width. |
getControlLayoutParams(child).columnsRequired = 2; |
- measureChild(child, exactlyFullWidthSpec, unspecifiedSpec); |
} |
} |
// Pack all the children as tightly into rows as possible without changing their ordering. |
+ // Stretch out column-width controls if either it is the last control or the next one is |
+ // a full-width control. |
+ for (int i = 0; i < getChildCount(); i++) { |
+ ControlLayoutParams lp = getControlLayoutParams(getChildAt(i)); |
+ |
+ if (i == getChildCount() - 1) { |
+ lp.columnsRequired = 2; |
+ } else { |
+ ControlLayoutParams nextLp = getControlLayoutParams(getChildAt(i + 1)); |
+ if (lp.columnsRequired + nextLp.columnsRequired > 2) { |
+ // This control is too big to place with the next child. |
+ lp.columnsRequired = 2; |
+ } else { |
+ // This and the next control fit on the same line. Skip placing the next child. |
+ i++; |
+ } |
+ } |
+ } |
+ |
+ // Measure all children, assuming they all have to fit within the width of the layout. |
+ // Height is unconstrained. |
+ for (int i = 0; i < getChildCount(); i++) { |
+ View child = getChildAt(i); |
+ ControlLayoutParams lp = getControlLayoutParams(child); |
+ int spec = lp.columnsRequired == 1 ? exactlyColumnWidthSpec : exactlyFullWidthSpec; |
+ measureChild(child, spec, unspecifiedSpec); |
+ } |
+ |
+ // Pack all the children as tightly into rows as possible without changing their ordering. |
int layoutHeight = 0; |
int nextChildStart = 0; |
int nextChildTop = 0; |