diff options
| -rw-r--r-- | core/java/android/view/View.java | 25 | ||||
| -rw-r--r-- | core/java/android/view/ViewGroup.java | 4 | ||||
| -rw-r--r-- | core/java/android/widget/FastScroller.java | 6 | ||||
| -rw-r--r-- | core/java/android/widget/GridView.java | 2 | ||||
| -rw-r--r-- | core/java/android/widget/LinearLayout.java | 4 | ||||
| -rw-r--r-- | core/java/android/widget/ListView.java | 6 | ||||
| -rw-r--r-- | core/java/android/widget/ScrollView.java | 4 | ||||
| -rw-r--r-- | core/java/android/widget/Spinner.java | 4 | ||||
| -rw-r--r-- | core/java/android/widget/TabWidget.java | 3 | ||||
| -rw-r--r-- | core/java/android/widget/TableRow.java | 2 | ||||
| -rw-r--r-- | core/java/com/android/internal/widget/ActionBarContextView.java | 2 | ||||
| -rw-r--r-- | core/java/com/android/internal/widget/SlidingTab.java | 8 |
12 files changed, 48 insertions, 22 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index be372d0bf859..d2ee0e56a034 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -741,6 +741,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private static boolean sUseBrokenMakeMeasureSpec = false; /** + * Always return a size of 0 for MeasureSpec values with a mode of UNSPECIFIED + */ + static boolean sUseZeroUnspecifiedMeasureSpec = false; + + /** * Ignore any optimizations using the measure cache. */ private static boolean sIgnoreMeasureCache = false; @@ -3796,6 +3801,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Canvas.sCompatibilityRestore = targetSdkVersion < MNC; + // In MNC and newer, our widgets can pass a "hint" value in the size + // for UNSPECIFIED MeasureSpecs. This lets child views of scrolling containers + // know what the expected parent size is going to be, so e.g. list items can size + // themselves at 1/3 the size of their container. It breaks older apps though, + // specifically apps that use some popular open source libraries. + sUseZeroUnspecifiedMeasureSpec = targetSdkVersion < MNC; + sCompatibilityDone = true; } } @@ -21032,6 +21044,19 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * Like {@link #makeMeasureSpec(int, int)}, but any spec with a mode of UNSPECIFIED + * will automatically get a size of 0. Older apps expect this. + * + * @hide internal use only for compatibility with system widgets and older apps + */ + public static int makeSafeMeasureSpec(int size, int mode) { + if (sUseZeroUnspecifiedMeasureSpec && mode == UNSPECIFIED) { + return 0; + } + return makeMeasureSpec(size, mode); + } + + /** * Extracts the mode from the supplied measure specification. * * @param measureSpec the measure specification to extract the mode from diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index dd32f854e26d..89743e539fa2 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -5963,12 +5963,12 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } else if (childDimension == LayoutParams.MATCH_PARENT) { // Child wants to be our size... find out how big it should // be - resultSize = size; + resultSize = View.sUseZeroUnspecifiedMeasureSpec ? 0 : size; resultMode = MeasureSpec.UNSPECIFIED; } else if (childDimension == LayoutParams.WRAP_CONTENT) { // Child wants to determine its own size.... find out how // big it should be - resultSize = size; + resultSize = View.sUseZeroUnspecifiedMeasureSpec ? 0 : size; resultMode = MeasureSpec.UNSPECIFIED; } break; diff --git a/core/java/android/widget/FastScroller.java b/core/java/android/widget/FastScroller.java index f06f3c218276..11d70265342d 100644 --- a/core/java/android/widget/FastScroller.java +++ b/core/java/android/widget/FastScroller.java @@ -662,7 +662,7 @@ class FastScroller { final int adjMaxWidth = maxWidth - marginLeft - marginRight; final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(adjMaxWidth, MeasureSpec.AT_MOST); - final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(container.height(), + final int heightMeasureSpec = MeasureSpec.makeSafeMeasureSpec(container.height(), MeasureSpec.UNSPECIFIED); view.measure(widthMeasureSpec, heightMeasureSpec); @@ -702,7 +702,7 @@ class FastScroller { final int containerWidth = container.width(); final int adjMaxWidth = containerWidth - marginLeft - marginRight; final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(adjMaxWidth, MeasureSpec.AT_MOST); - final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(container.height(), + final int heightMeasureSpec = MeasureSpec.makeSafeMeasureSpec(container.height(), MeasureSpec.UNSPECIFIED); preview.measure(widthMeasureSpec, heightMeasureSpec); @@ -768,7 +768,7 @@ class FastScroller { final Rect container = mContainerRect; final int maxWidth = container.width(); final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.AT_MOST); - final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(container.height(), + final int heightMeasureSpec = MeasureSpec.makeSafeMeasureSpec(container.height(), MeasureSpec.UNSPECIFIED); track.measure(widthMeasureSpec, heightMeasureSpec); diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java index dcaafa527920..f994d4ad91be 100644 --- a/core/java/android/widget/GridView.java +++ b/core/java/android/widget/GridView.java @@ -1073,7 +1073,7 @@ public class GridView extends AbsListView { p.forceAdd = true; int childHeightSpec = getChildMeasureSpec( - MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec), + MeasureSpec.makeSafeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.UNSPECIFIED), 0, p.height); int childWidthSpec = getChildMeasureSpec( MeasureSpec.makeMeasureSpec(mColumnWidth, MeasureSpec.EXACTLY), 0, p.width); diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java index 9d14254bdbbd..056323db9560 100644 --- a/core/java/android/widget/LinearLayout.java +++ b/core/java/android/widget/LinearLayout.java @@ -1062,9 +1062,9 @@ public class LinearLayout extends ViewGroup { // use as much space as it wants because we can shrink things // later (and re-measure). if (baselineAligned) { - final int freeWidthSpec = MeasureSpec.makeMeasureSpec( + final int freeWidthSpec = MeasureSpec.makeSafeMeasureSpec( MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.UNSPECIFIED); - final int freeHeightSpec = MeasureSpec.makeMeasureSpec( + final int freeHeightSpec = MeasureSpec.makeSafeMeasureSpec( MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.UNSPECIFIED); child.measure(freeWidthSpec, freeHeightSpec); } else { diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index f8b965fce8c2..fd0395a8a036 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -1206,7 +1206,7 @@ public class ListView extends AbsListView { if (lpHeight > 0) { childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY); } else { - childHeightSpec = MeasureSpec.makeMeasureSpec(heightHint, MeasureSpec.UNSPECIFIED); + childHeightSpec = MeasureSpec.makeSafeMeasureSpec(heightHint, MeasureSpec.UNSPECIFIED); } child.measure(childWidthSpec, childHeightSpec); } @@ -1943,7 +1943,7 @@ public class ListView extends AbsListView { if (lpHeight > 0) { childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY); } else { - childHeightSpec = MeasureSpec.makeMeasureSpec(getMeasuredHeight(), + childHeightSpec = MeasureSpec.makeSafeMeasureSpec(getMeasuredHeight(), MeasureSpec.UNSPECIFIED); } child.measure(childWidthSpec, childHeightSpec); @@ -2698,7 +2698,7 @@ public class ListView extends AbsListView { if (lpHeight > 0) { childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY); } else { - childHeightSpec = MeasureSpec.makeMeasureSpec(getMeasuredHeight(), + childHeightSpec = MeasureSpec.makeSafeMeasureSpec(getMeasuredHeight(), MeasureSpec.UNSPECIFIED); } child.measure(childWidthSpec, childHeightSpec); diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index 11904e12cda9..58a94b96a7f2 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -1263,7 +1263,7 @@ public class ScrollView extends FrameLayout { childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, mPaddingLeft + mPaddingRight, lp.width); - childHeightMeasureSpec = MeasureSpec.makeMeasureSpec( + childHeightMeasureSpec = MeasureSpec.makeSafeMeasureSpec( MeasureSpec.getSize(parentHeightMeasureSpec), MeasureSpec.UNSPECIFIED); child.measure(childWidthMeasureSpec, childHeightMeasureSpec); @@ -1277,7 +1277,7 @@ public class ScrollView extends FrameLayout { final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, mPaddingLeft + mPaddingRight + lp.leftMargin + lp.rightMargin + widthUsed, lp.width); - final int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec( + final int childHeightMeasureSpec = MeasureSpec.makeSafeMeasureSpec( MeasureSpec.getSize(parentHeightMeasureSpec), MeasureSpec.UNSPECIFIED); child.measure(childWidthMeasureSpec, childHeightMeasureSpec); diff --git a/core/java/android/widget/Spinner.java b/core/java/android/widget/Spinner.java index 6fe34ddfc0d3..fdabe913e80a 100644 --- a/core/java/android/widget/Spinner.java +++ b/core/java/android/widget/Spinner.java @@ -812,9 +812,9 @@ public class Spinner extends AbsSpinner implements OnClickListener { View itemView = null; int itemType = 0; final int widthMeasureSpec = - MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.UNSPECIFIED); + MeasureSpec.makeSafeMeasureSpec(getMeasuredWidth(), MeasureSpec.UNSPECIFIED); final int heightMeasureSpec = - MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.UNSPECIFIED); + MeasureSpec.makeSafeMeasureSpec(getMeasuredHeight(), MeasureSpec.UNSPECIFIED); // Make sure the number of items we'll measure is capped. If it's a huge data set // with wildly varying sizes, oh well. diff --git a/core/java/android/widget/TabWidget.java b/core/java/android/widget/TabWidget.java index aa7168c617f0..d9cff4e24940 100644 --- a/core/java/android/widget/TabWidget.java +++ b/core/java/android/widget/TabWidget.java @@ -174,7 +174,8 @@ public class TabWidget extends LinearLayout implements OnFocusChangeListener { // First, measure with no constraint final int width = MeasureSpec.getSize(widthMeasureSpec); - final int unspecifiedWidth = MeasureSpec.makeMeasureSpec(width, MeasureSpec.UNSPECIFIED); + final int unspecifiedWidth = MeasureSpec.makeSafeMeasureSpec(width, + MeasureSpec.UNSPECIFIED); mImposedTabsHeight = -1; super.measureHorizontal(unspecifiedWidth, heightMeasureSpec); diff --git a/core/java/android/widget/TableRow.java b/core/java/android/widget/TableRow.java index d4288d69c2c2..f7f9c9177034 100644 --- a/core/java/android/widget/TableRow.java +++ b/core/java/android/widget/TableRow.java @@ -303,7 +303,7 @@ public class TableRow extends LinearLayout { spec = getChildMeasureSpec(widthMeasureSpec, 0, LayoutParams.WRAP_CONTENT); break; case LayoutParams.MATCH_PARENT: - spec = MeasureSpec.makeMeasureSpec( + spec = MeasureSpec.makeSafeMeasureSpec( MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.UNSPECIFIED); break; diff --git a/core/java/com/android/internal/widget/ActionBarContextView.java b/core/java/com/android/internal/widget/ActionBarContextView.java index 106272bd9568..c5d329020a17 100644 --- a/core/java/com/android/internal/widget/ActionBarContextView.java +++ b/core/java/com/android/internal/widget/ActionBarContextView.java @@ -367,7 +367,7 @@ public class ActionBarContextView extends AbsActionBarView implements AnimatorLi if (mTitleLayout != null && mCustomView == null) { if (mTitleOptional) { - final int titleWidthSpec = MeasureSpec.makeMeasureSpec(contentWidth, + final int titleWidthSpec = MeasureSpec.makeSafeMeasureSpec(contentWidth, MeasureSpec.UNSPECIFIED); mTitleLayout.measure(titleWidthSpec, childSpecHeight); final int titleWidth = mTitleLayout.getMeasuredWidth(); diff --git a/core/java/com/android/internal/widget/SlidingTab.java b/core/java/com/android/internal/widget/SlidingTab.java index 0066ed0db859..79adada9cc98 100644 --- a/core/java/com/android/internal/widget/SlidingTab.java +++ b/core/java/com/android/internal/widget/SlidingTab.java @@ -403,10 +403,10 @@ public class SlidingTab extends ViewGroup { public void measure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); - tab.measure(View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.UNSPECIFIED), - View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.UNSPECIFIED)); - text.measure(View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.UNSPECIFIED), - View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.UNSPECIFIED)); + tab.measure(View.MeasureSpec.makeSafeMeasureSpec(width, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeSafeMeasureSpec(height, View.MeasureSpec.UNSPECIFIED)); + text.measure(View.MeasureSpec.makeSafeMeasureSpec(width, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeSafeMeasureSpec(height, View.MeasureSpec.UNSPECIFIED)); } /** |