Skip to content

Commit 7e7786a

Browse files
author
Fabrice Di Meglio
committed
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
1 parent e11dc0d commit 7e7786a

File tree

1 file changed

+35
-12
lines changed

1 file changed

+35
-12
lines changed

core/java/android/view/View.java

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2798,18 +2798,18 @@ static class TransformationInfo {
27982798
int mUserPaddingEnd;
27992799

28002800
/**
2801-
* Whether a left padding has been defined during layout inflation.
2801+
* Cache initial left padding.
28022802
*
28032803
* @hide
28042804
*/
2805-
boolean mUserPaddingLeftDefined = false;
2805+
int mUserPaddingLeftInitial = UNDEFINED_PADDING;
28062806

28072807
/**
2808-
* Whether a right padding has been defined during layout inflation.
2808+
* Cache initial right padding.
28092809
*
28102810
* @hide
28112811
*/
2812-
boolean mUserPaddingRightDefined = false;
2812+
int mUserPaddingRightInitial = UNDEFINED_PADDING;
28132813

28142814
/**
28152815
* Default undefined padding
@@ -3231,19 +3231,19 @@ public View(Context context, AttributeSet attrs, int defStyle) {
32313231
break;
32323232
case com.android.internal.R.styleable.View_padding:
32333233
padding = a.getDimensionPixelSize(attr, -1);
3234-
mUserPaddingLeftDefined = true;
3235-
mUserPaddingRightDefined = true;
3234+
mUserPaddingLeftInitial = padding;
3235+
mUserPaddingRightInitial = padding;
32363236
break;
32373237
case com.android.internal.R.styleable.View_paddingLeft:
32383238
leftPadding = a.getDimensionPixelSize(attr, -1);
3239-
mUserPaddingLeftDefined = true;
3239+
mUserPaddingLeftInitial = leftPadding;
32403240
break;
32413241
case com.android.internal.R.styleable.View_paddingTop:
32423242
topPadding = a.getDimensionPixelSize(attr, -1);
32433243
break;
32443244
case com.android.internal.R.styleable.View_paddingRight:
32453245
rightPadding = a.getDimensionPixelSize(attr, -1);
3246-
mUserPaddingRightDefined = true;
3246+
mUserPaddingRightInitial = rightPadding;
32473247
break;
32483248
case com.android.internal.R.styleable.View_paddingBottom:
32493249
bottomPadding = a.getDimensionPixelSize(attr, -1);
@@ -3542,15 +3542,19 @@ public void onClick(View v) {
35423542
topPadding = padding;
35433543
rightPadding = padding;
35443544
bottomPadding = padding;
3545+
mUserPaddingLeftInitial = padding;
3546+
mUserPaddingRightInitial = padding;
35453547
}
35463548

35473549
// If the user specified the padding (either with android:padding or
35483550
// android:paddingLeft/Top/Right/Bottom), use this padding, otherwise
35493551
// use the default padding or the padding from the background drawable
35503552
// (stored at this point in mPadding*)
3551-
internalSetPadding(leftPadding >= 0 ? leftPadding : mPaddingLeft,
3553+
mUserPaddingLeftInitial = leftPadding >= 0 ? leftPadding : mPaddingLeft;
3554+
mUserPaddingRightInitial = rightPadding >= 0 ? rightPadding : mPaddingRight;
3555+
internalSetPadding(mUserPaddingLeftInitial,
35523556
topPadding >= 0 ? topPadding : mPaddingTop,
3553-
rightPadding >= 0 ? rightPadding : mPaddingRight,
3557+
mUserPaddingRightInitial,
35543558
bottomPadding >= 0 ? bottomPadding : mPaddingBottom);
35553559

35563560
if (viewFlagMasks != 0) {
@@ -11463,10 +11467,12 @@ public void resolvePadding() {
1146311467
// left / right padding are used if defined. If they are not defined and start / end
1146411468
// padding are defined (e.g. in Frameworks resources), then we use start / end and
1146511469
// resolve them as left / right (layout direction is not taken into account).
11466-
if (!mUserPaddingLeftDefined && mUserPaddingStart != UNDEFINED_PADDING) {
11470+
if (mUserPaddingLeftInitial == UNDEFINED_PADDING &&
11471+
mUserPaddingStart != UNDEFINED_PADDING) {
1146711472
mUserPaddingLeft = mUserPaddingStart;
1146811473
}
11469-
if (!mUserPaddingRightDefined && mUserPaddingEnd != UNDEFINED_PADDING) {
11474+
if (mUserPaddingRightInitial == UNDEFINED_PADDING
11475+
&& mUserPaddingEnd != UNDEFINED_PADDING) {
1147011476
mUserPaddingRight = mUserPaddingEnd;
1147111477
}
1147211478

@@ -11480,6 +11486,12 @@ public void resolvePadding() {
1148011486
// left / right or right / left depending on the resolved layout direction.
1148111487
// If start / end padding are not defined, use the left / right ones.
1148211488
int resolvedLayoutDirection = getResolvedLayoutDirection();
11489+
// Set user padding to initial values ...
11490+
mUserPaddingLeft = (mUserPaddingLeftInitial == UNDEFINED_PADDING) ?
11491+
0 : mUserPaddingLeftInitial;
11492+
mUserPaddingRight = (mUserPaddingRightInitial == UNDEFINED_PADDING) ?
11493+
0 : mUserPaddingRightInitial;
11494+
// ... then resolve it.
1148311495
switch (resolvedLayoutDirection) {
1148411496
case LAYOUT_DIRECTION_RTL:
1148511497
if (mUserPaddingStart != UNDEFINED_PADDING) {
@@ -14243,10 +14255,14 @@ public void setBackgroundDrawable(Drawable background) {
1424314255
mPrivateFlags2 &= ~PFLAG2_PADDING_RESOLVED;
1424414256
switch (background.getLayoutDirection()) {
1424514257
case LAYOUT_DIRECTION_RTL:
14258+
mUserPaddingLeftInitial = padding.right;
14259+
mUserPaddingRightInitial = padding.left;
1424614260
internalSetPadding(padding.right, padding.top, padding.left, padding.bottom);
1424714261
break;
1424814262
case LAYOUT_DIRECTION_LTR:
1424914263
default:
14264+
mUserPaddingLeftInitial = padding.left;
14265+
mUserPaddingRightInitial = padding.right;
1425014266
internalSetPadding(padding.left, padding.top, padding.right, padding.bottom);
1425114267
}
1425214268
}
@@ -14343,6 +14359,9 @@ public void setPadding(int left, int top, int right, int bottom) {
1434314359
mUserPaddingStart = UNDEFINED_PADDING;
1434414360
mUserPaddingEnd = UNDEFINED_PADDING;
1434514361

14362+
mUserPaddingLeftInitial = left;
14363+
mUserPaddingRightInitial = right;
14364+
1434614365
internalSetPadding(left, top, right, bottom);
1434714366
}
1434814367

@@ -14432,10 +14451,14 @@ public void setPaddingRelative(int start, int top, int end, int bottom) {
1443214451

1443314452
switch(getResolvedLayoutDirection()) {
1443414453
case LAYOUT_DIRECTION_RTL:
14454+
mUserPaddingLeftInitial = end;
14455+
mUserPaddingRightInitial = start;
1443514456
internalSetPadding(end, top, start, bottom);
1443614457
break;
1443714458
case LAYOUT_DIRECTION_LTR:
1443814459
default:
14460+
mUserPaddingLeftInitial = start;
14461+
mUserPaddingRightInitial = end;
1443914462
internalSetPadding(start, top, end, bottom);
1444014463
}
1444114464
}

0 commit comments

Comments
 (0)