diff options
author | Adam Powell <adamp@google.com> | 2014-03-10 23:35:16 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-03-10 23:35:16 +0000 |
commit | 8566f1561bb99eeff16b7845156c978b42ada227 (patch) | |
tree | 5520e475b5341e4f6961dd864291bf89c88b6e02 | |
parent | 7d50596a9c27b6db6468009ad196707e08f88bd6 (diff) | |
parent | c8b43bc0021aea63858044551f13cae86f4e5699 (diff) | |
download | frameworks_base-8566f1561bb99eeff16b7845156c978b42ada227.zip frameworks_base-8566f1561bb99eeff16b7845156c978b42ada227.tar.gz frameworks_base-8566f1561bb99eeff16b7845156c978b42ada227.tar.bz2 |
am c8b43bc0: am fd6b9975: Prevent overflow from MeasureSpec.adjust; measure cache fix
* commit 'c8b43bc0021aea63858044551f13cae86f4e5699':
Prevent overflow from MeasureSpec.adjust; measure cache fix
-rw-r--r-- | core/java/android/view/View.java | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 83610c3..b35e124 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -16499,7 +16499,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } else { long value = mMeasureCache.valueAt(cacheIndex); // Casting a long to int drops the high 32 bits, no mask needed - setMeasuredDimension((int) (value >> 32), (int) value); + setMeasuredDimensionRaw((int) (value >> 32), (int) value); mPrivateFlags3 |= PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT; } @@ -16594,6 +16594,22 @@ public class View implements Drawable.Callback, KeyEvent.Callback, measuredWidth += optical ? opticalWidth : -opticalWidth; measuredHeight += optical ? opticalHeight : -opticalHeight; } + setMeasuredDimensionRaw(measuredWidth, measuredHeight); + } + + /** + * Sets the measured dimension without extra processing for things like optical bounds. + * Useful for reapplying consistent values that have already been cooked with adjustments + * for optical bounds, etc. such as those from the measurement cache. + * + * @param measuredWidth The measured width of this view. May be a complex + * bit mask as defined by {@link #MEASURED_SIZE_MASK} and + * {@link #MEASURED_STATE_TOO_SMALL}. + * @param measuredHeight The measured height of this view. May be a complex + * bit mask as defined by {@link #MEASURED_SIZE_MASK} and + * {@link #MEASURED_STATE_TOO_SMALL}. + */ + private void setMeasuredDimensionRaw(int measuredWidth, int measuredHeight) { mMeasuredWidth = measuredWidth; mMeasuredHeight = measuredHeight; @@ -18361,7 +18377,18 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } static int adjust(int measureSpec, int delta) { - return makeMeasureSpec(getSize(measureSpec + delta), getMode(measureSpec)); + final int mode = getMode(measureSpec); + if (mode == UNSPECIFIED) { + // No need to adjust size for UNSPECIFIED mode. + return makeMeasureSpec(0, UNSPECIFIED); + } + int size = getSize(measureSpec) + delta; + if (size < 0) { + Log.e(VIEW_LOG_TAG, "MeasureSpec.adjust: new size would be negative! (" + size + + ") spec: " + toString(measureSpec) + " delta: " + delta); + size = 0; + } + return makeMeasureSpec(size, mode); } /** |