@@ -2814,18 +2814,18 @@ static class TransformationInfo {
28142814 int mUserPaddingEnd;
28152815
28162816 /**
2817- * Whether a left padding has been defined during layout inflation .
2817+ * Cache initial left padding.
28182818 *
28192819 * @hide
28202820 */
2821- boolean mUserPaddingLeftDefined = false ;
2821+ int mUserPaddingLeftInitial = UNDEFINED_PADDING ;
28222822
28232823 /**
2824- * Whether a right padding has been defined during layout inflation .
2824+ * Cache initial right padding.
28252825 *
28262826 * @hide
28272827 */
2828- boolean mUserPaddingRightDefined = false ;
2828+ int mUserPaddingRightInitial = UNDEFINED_PADDING ;
28292829
28302830 /**
28312831 * Default undefined padding
@@ -3247,19 +3247,19 @@ public View(Context context, AttributeSet attrs, int defStyle) {
32473247 break;
32483248 case com.android.internal.R.styleable.View_padding:
32493249 padding = a.getDimensionPixelSize(attr, -1);
3250- mUserPaddingLeftDefined = true ;
3251- mUserPaddingRightDefined = true ;
3250+ mUserPaddingLeftInitial = padding ;
3251+ mUserPaddingRightInitial = padding ;
32523252 break;
32533253 case com.android.internal.R.styleable.View_paddingLeft:
32543254 leftPadding = a.getDimensionPixelSize(attr, -1);
3255- mUserPaddingLeftDefined = true ;
3255+ mUserPaddingLeftInitial = leftPadding ;
32563256 break;
32573257 case com.android.internal.R.styleable.View_paddingTop:
32583258 topPadding = a.getDimensionPixelSize(attr, -1);
32593259 break;
32603260 case com.android.internal.R.styleable.View_paddingRight:
32613261 rightPadding = a.getDimensionPixelSize(attr, -1);
3262- mUserPaddingRightDefined = true ;
3262+ mUserPaddingRightInitial = rightPadding ;
32633263 break;
32643264 case com.android.internal.R.styleable.View_paddingBottom:
32653265 bottomPadding = a.getDimensionPixelSize(attr, -1);
@@ -3561,15 +3561,19 @@ public void onClick(View v) {
35613561 topPadding = padding;
35623562 rightPadding = padding;
35633563 bottomPadding = padding;
3564+ mUserPaddingLeftInitial = padding;
3565+ mUserPaddingRightInitial = padding;
35643566 }
35653567
35663568 // If the user specified the padding (either with android:padding or
35673569 // android:paddingLeft/Top/Right/Bottom), use this padding, otherwise
35683570 // use the default padding or the padding from the background drawable
35693571 // (stored at this point in mPadding*)
3570- internalSetPadding(leftPadding >= 0 ? leftPadding : mPaddingLeft,
3572+ mUserPaddingLeftInitial = leftPadding >= 0 ? leftPadding : mPaddingLeft;
3573+ mUserPaddingRightInitial = rightPadding >= 0 ? rightPadding : mPaddingRight;
3574+ internalSetPadding(mUserPaddingLeftInitial,
35713575 topPadding >= 0 ? topPadding : mPaddingTop,
3572- rightPadding >= 0 ? rightPadding : mPaddingRight ,
3576+ mUserPaddingRightInitial ,
35733577 bottomPadding >= 0 ? bottomPadding : mPaddingBottom);
35743578
35753579 if (viewFlagMasks != 0) {
@@ -11540,10 +11544,12 @@ public void resolvePadding() {
1154011544 // left / right padding are used if defined. If they are not defined and start / end
1154111545 // padding are defined (e.g. in Frameworks resources), then we use start / end and
1154211546 // resolve them as left / right (layout direction is not taken into account).
11543- if (!mUserPaddingLeftDefined && mUserPaddingStart != UNDEFINED_PADDING) {
11547+ if (mUserPaddingLeftInitial == UNDEFINED_PADDING &&
11548+ mUserPaddingStart != UNDEFINED_PADDING) {
1154411549 mUserPaddingLeft = mUserPaddingStart;
1154511550 }
11546- if (!mUserPaddingRightDefined && mUserPaddingEnd != UNDEFINED_PADDING) {
11551+ if (mUserPaddingRightInitial == UNDEFINED_PADDING
11552+ && mUserPaddingEnd != UNDEFINED_PADDING) {
1154711553 mUserPaddingRight = mUserPaddingEnd;
1154811554 }
1154911555
@@ -11557,6 +11563,12 @@ public void resolvePadding() {
1155711563 // left / right or right / left depending on the resolved layout direction.
1155811564 // If start / end padding are not defined, use the left / right ones.
1155911565 int resolvedLayoutDirection = getResolvedLayoutDirection();
11566+ // Set user padding to initial values ...
11567+ mUserPaddingLeft = (mUserPaddingLeftInitial == UNDEFINED_PADDING) ?
11568+ 0 : mUserPaddingLeftInitial;
11569+ mUserPaddingRight = (mUserPaddingRightInitial == UNDEFINED_PADDING) ?
11570+ 0 : mUserPaddingRightInitial;
11571+ // ... then resolve it.
1156011572 switch (resolvedLayoutDirection) {
1156111573 case LAYOUT_DIRECTION_RTL:
1156211574 if (mUserPaddingStart != UNDEFINED_PADDING) {
@@ -14322,10 +14334,14 @@ public void setBackgroundDrawable(Drawable background) {
1432214334 mPrivateFlags2 &= ~PFLAG2_PADDING_RESOLVED;
1432314335 switch (background.getLayoutDirection()) {
1432414336 case LAYOUT_DIRECTION_RTL:
14337+ mUserPaddingLeftInitial = padding.right;
14338+ mUserPaddingRightInitial = padding.left;
1432514339 internalSetPadding(padding.right, padding.top, padding.left, padding.bottom);
1432614340 break;
1432714341 case LAYOUT_DIRECTION_LTR:
1432814342 default:
14343+ mUserPaddingLeftInitial = padding.left;
14344+ mUserPaddingRightInitial = padding.right;
1432914345 internalSetPadding(padding.left, padding.top, padding.right, padding.bottom);
1433014346 }
1433114347 }
@@ -14422,6 +14438,9 @@ public void setPadding(int left, int top, int right, int bottom) {
1442214438 mUserPaddingStart = UNDEFINED_PADDING;
1442314439 mUserPaddingEnd = UNDEFINED_PADDING;
1442414440
14441+ mUserPaddingLeftInitial = left;
14442+ mUserPaddingRightInitial = right;
14443+
1442514444 internalSetPadding(left, top, right, bottom);
1442614445 }
1442714446
@@ -14511,10 +14530,14 @@ public void setPaddingRelative(int start, int top, int end, int bottom) {
1451114530
1451214531 switch(getResolvedLayoutDirection()) {
1451314532 case LAYOUT_DIRECTION_RTL:
14533+ mUserPaddingLeftInitial = end;
14534+ mUserPaddingRightInitial = start;
1451414535 internalSetPadding(end, top, start, bottom);
1451514536 break;
1451614537 case LAYOUT_DIRECTION_LTR:
1451714538 default:
14539+ mUserPaddingLeftInitial = start;
14540+ mUserPaddingRightInitial = end;
1451814541 internalSetPadding(start, top, end, bottom);
1451914542 }
1452014543 }
0 commit comments