From 7e7786a4d11351519d8047cd60f59a43d460ee9e Mon Sep 17 00:00:00 2001 From: Fabrice Di Meglio Date: Tue, 11 Sep 2012 13:34:15 -0700 Subject: [PATCH] Fix bug #7146516 Padding can be "over" resolved - need to cache the initial User padding and use it for restoring to the initial state of padding before doing padding resolution Change-Id: I4efdaea7ba21930537bf5032e80e70d70bf38b5b --- core/java/android/view/View.java | 47 ++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 236adaba9cb4b..a1a75b8d5bb44 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -2798,18 +2798,18 @@ public class View implements Drawable.Callback, KeyEvent.Callback, int mUserPaddingEnd; /** - * Whether a left padding has been defined during layout inflation. + * Cache initial left padding. * * @hide */ - boolean mUserPaddingLeftDefined = false; + int mUserPaddingLeftInitial = UNDEFINED_PADDING; /** - * Whether a right padding has been defined during layout inflation. + * Cache initial right padding. * * @hide */ - boolean mUserPaddingRightDefined = false; + int mUserPaddingRightInitial = UNDEFINED_PADDING; /** * Default undefined padding @@ -3231,19 +3231,19 @@ public class View implements Drawable.Callback, KeyEvent.Callback, break; case com.android.internal.R.styleable.View_padding: padding = a.getDimensionPixelSize(attr, -1); - mUserPaddingLeftDefined = true; - mUserPaddingRightDefined = true; + mUserPaddingLeftInitial = padding; + mUserPaddingRightInitial = padding; break; case com.android.internal.R.styleable.View_paddingLeft: leftPadding = a.getDimensionPixelSize(attr, -1); - mUserPaddingLeftDefined = true; + mUserPaddingLeftInitial = leftPadding; break; case com.android.internal.R.styleable.View_paddingTop: topPadding = a.getDimensionPixelSize(attr, -1); break; case com.android.internal.R.styleable.View_paddingRight: rightPadding = a.getDimensionPixelSize(attr, -1); - mUserPaddingRightDefined = true; + mUserPaddingRightInitial = rightPadding; break; case com.android.internal.R.styleable.View_paddingBottom: bottomPadding = a.getDimensionPixelSize(attr, -1); @@ -3542,15 +3542,19 @@ public class View implements Drawable.Callback, KeyEvent.Callback, topPadding = padding; rightPadding = padding; bottomPadding = padding; + mUserPaddingLeftInitial = padding; + mUserPaddingRightInitial = padding; } // If the user specified the padding (either with android:padding or // android:paddingLeft/Top/Right/Bottom), use this padding, otherwise // use the default padding or the padding from the background drawable // (stored at this point in mPadding*) - internalSetPadding(leftPadding >= 0 ? leftPadding : mPaddingLeft, + mUserPaddingLeftInitial = leftPadding >= 0 ? leftPadding : mPaddingLeft; + mUserPaddingRightInitial = rightPadding >= 0 ? rightPadding : mPaddingRight; + internalSetPadding(mUserPaddingLeftInitial, topPadding >= 0 ? topPadding : mPaddingTop, - rightPadding >= 0 ? rightPadding : mPaddingRight, + mUserPaddingRightInitial, bottomPadding >= 0 ? bottomPadding : mPaddingBottom); if (viewFlagMasks != 0) { @@ -11463,10 +11467,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // left / right padding are used if defined. If they are not defined and start / end // padding are defined (e.g. in Frameworks resources), then we use start / end and // resolve them as left / right (layout direction is not taken into account). - if (!mUserPaddingLeftDefined && mUserPaddingStart != UNDEFINED_PADDING) { + if (mUserPaddingLeftInitial == UNDEFINED_PADDING && + mUserPaddingStart != UNDEFINED_PADDING) { mUserPaddingLeft = mUserPaddingStart; } - if (!mUserPaddingRightDefined && mUserPaddingEnd != UNDEFINED_PADDING) { + if (mUserPaddingRightInitial == UNDEFINED_PADDING + && mUserPaddingEnd != UNDEFINED_PADDING) { mUserPaddingRight = mUserPaddingEnd; } @@ -11480,6 +11486,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // left / right or right / left depending on the resolved layout direction. // If start / end padding are not defined, use the left / right ones. int resolvedLayoutDirection = getResolvedLayoutDirection(); + // Set user padding to initial values ... + mUserPaddingLeft = (mUserPaddingLeftInitial == UNDEFINED_PADDING) ? + 0 : mUserPaddingLeftInitial; + mUserPaddingRight = (mUserPaddingRightInitial == UNDEFINED_PADDING) ? + 0 : mUserPaddingRightInitial; + // ... then resolve it. switch (resolvedLayoutDirection) { case LAYOUT_DIRECTION_RTL: if (mUserPaddingStart != UNDEFINED_PADDING) { @@ -14243,10 +14255,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mPrivateFlags2 &= ~PFLAG2_PADDING_RESOLVED; switch (background.getLayoutDirection()) { case LAYOUT_DIRECTION_RTL: + mUserPaddingLeftInitial = padding.right; + mUserPaddingRightInitial = padding.left; internalSetPadding(padding.right, padding.top, padding.left, padding.bottom); break; case LAYOUT_DIRECTION_LTR: default: + mUserPaddingLeftInitial = padding.left; + mUserPaddingRightInitial = padding.right; internalSetPadding(padding.left, padding.top, padding.right, padding.bottom); } } @@ -14343,6 +14359,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mUserPaddingStart = UNDEFINED_PADDING; mUserPaddingEnd = UNDEFINED_PADDING; + mUserPaddingLeftInitial = left; + mUserPaddingRightInitial = right; + internalSetPadding(left, top, right, bottom); } @@ -14432,10 +14451,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback, switch(getResolvedLayoutDirection()) { case LAYOUT_DIRECTION_RTL: + mUserPaddingLeftInitial = end; + mUserPaddingRightInitial = start; internalSetPadding(end, top, start, bottom); break; case LAYOUT_DIRECTION_LTR: default: + mUserPaddingLeftInitial = start; + mUserPaddingRightInitial = end; internalSetPadding(start, top, end, bottom); } }