Skip to content

Commit 016456e

Browse files
author
Fabrice Di Meglio
committed
Fix padding resolution
Change-Id: I2181a0a4057be0d20744b1512dbc1fbc53490d81
1 parent a9108a2 commit 016456e

File tree

1 file changed

+37
-50
lines changed

1 file changed

+37
-50
lines changed

core/java/android/view/View.java

Lines changed: 37 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2766,13 +2766,6 @@ static class TransformationInfo {
27662766
@ViewDebug.ExportedProperty(category = "padding")
27672767
protected int mUserPaddingLeft;
27682768

2769-
/**
2770-
* Cache if the user padding is relative.
2771-
*
2772-
*/
2773-
@ViewDebug.ExportedProperty(category = "padding")
2774-
boolean mUserPaddingRelative;
2775-
27762769
/**
27772770
* Cache the paddingStart set by the user to append to the scrollbar's size.
27782771
*
@@ -2787,6 +2780,11 @@ static class TransformationInfo {
27872780
@ViewDebug.ExportedProperty(category = "padding")
27882781
int mUserPaddingEnd;
27892782

2783+
/**
2784+
* Default undefined padding
2785+
*/
2786+
private static final int UNDEFINED_PADDING = Integer.MIN_VALUE;
2787+
27902788
/**
27912789
* @hide
27922790
*/
@@ -3098,9 +3096,8 @@ public View(Context context) {
30983096
(IMPORTANT_FOR_ACCESSIBILITY_DEFAULT << IMPORTANT_FOR_ACCESSIBILITY_SHIFT);
30993097
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
31003098
setOverScrollMode(OVER_SCROLL_IF_CONTENT_SCROLLS);
3101-
mUserPaddingStart = -1;
3102-
mUserPaddingEnd = -1;
3103-
mUserPaddingRelative = false;
3099+
mUserPaddingStart = UNDEFINED_PADDING;
3100+
mUserPaddingEnd = UNDEFINED_PADDING;
31043101
}
31053102

31063103
/**
@@ -3166,8 +3163,8 @@ public View(Context context, AttributeSet attrs, int defStyle) {
31663163
int topPadding = -1;
31673164
int rightPadding = -1;
31683165
int bottomPadding = -1;
3169-
int startPadding = -1;
3170-
int endPadding = -1;
3166+
int startPadding = UNDEFINED_PADDING;
3167+
int endPadding = UNDEFINED_PADDING;
31713168

31723169
int padding = -1;
31733170

@@ -3214,10 +3211,10 @@ public View(Context context, AttributeSet attrs, int defStyle) {
32143211
bottomPadding = a.getDimensionPixelSize(attr, -1);
32153212
break;
32163213
case com.android.internal.R.styleable.View_paddingStart:
3217-
startPadding = a.getDimensionPixelSize(attr, -1);
3214+
startPadding = a.getDimensionPixelSize(attr, UNDEFINED_PADDING);
32183215
break;
32193216
case com.android.internal.R.styleable.View_paddingEnd:
3220-
endPadding = a.getDimensionPixelSize(attr, -1);
3217+
endPadding = a.getDimensionPixelSize(attr, UNDEFINED_PADDING);
32213218
break;
32223219
case com.android.internal.R.styleable.View_scrollX:
32233220
x = a.getDimensionPixelOffset(attr, 0);
@@ -3494,16 +3491,14 @@ public void onClick(View v) {
34943491

34953492
setOverScrollMode(overScrollMode);
34963493

3497-
if (background != null) {
3498-
setBackground(background);
3499-
}
3500-
35013494
// Cache user padding as we cannot fully resolve padding here (we dont have yet the resolved
35023495
// layout direction). Those cached values will be used later during padding resolution.
35033496
mUserPaddingStart = startPadding;
35043497
mUserPaddingEnd = endPadding;
35053498

3506-
updateUserPaddingRelative();
3499+
if (background != null) {
3500+
setBackground(background);
3501+
}
35073502

35083503
if (padding >= 0) {
35093504
leftPadding = padding;
@@ -3516,7 +3511,7 @@ public void onClick(View v) {
35163511
// android:paddingLeft/Top/Right/Bottom), use this padding, otherwise
35173512
// use the default padding or the padding from the background drawable
35183513
// (stored at this point in mPadding*)
3519-
setPadding(leftPadding >= 0 ? leftPadding : mPaddingLeft,
3514+
internalSetPadding(leftPadding >= 0 ? leftPadding : mPaddingLeft,
35203515
topPadding >= 0 ? topPadding : mPaddingTop,
35213516
rightPadding >= 0 ? rightPadding : mPaddingRight,
35223517
bottomPadding >= 0 ? bottomPadding : mPaddingBottom);
@@ -3551,10 +3546,6 @@ public void onClick(View v) {
35513546
computeOpaqueFlags();
35523547
}
35533548

3554-
private void updateUserPaddingRelative() {
3555-
mUserPaddingRelative = (mUserPaddingStart >= 0 || mUserPaddingEnd >= 0);
3556-
}
3557-
35583549
/**
35593550
* Non-public constructor for use in testing
35603551
*/
@@ -5261,9 +5252,8 @@ public boolean isShown() {
52615252
*/
52625253
protected boolean fitSystemWindows(Rect insets) {
52635254
if ((mViewFlags & FITS_SYSTEM_WINDOWS) == FITS_SYSTEM_WINDOWS) {
5264-
mUserPaddingStart = -1;
5265-
mUserPaddingEnd = -1;
5266-
mUserPaddingRelative = false;
5255+
mUserPaddingStart = UNDEFINED_PADDING;
5256+
mUserPaddingEnd = UNDEFINED_PADDING;
52675257
if ((mViewFlags & OPTIONAL_FITS_SYSTEM_WINDOWS) == 0
52685258
|| mAttachInfo == null
52695259
|| (mAttachInfo.mSystemUiVisibility & SYSTEM_UI_LAYOUT_FLAGS) == 0) {
@@ -5537,6 +5527,7 @@ public void setLayoutDirection(int layoutDirection) {
55375527
// Set the new layout direction (filtered) and ask for a layout pass
55385528
mPrivateFlags2 |=
55395529
((layoutDirection << LAYOUT_DIRECTION_MASK_SHIFT) & LAYOUT_DIRECTION_MASK);
5530+
resolvePadding();
55405531
requestLayout();
55415532
}
55425533
}
@@ -10668,7 +10659,7 @@ public void setVerticalScrollBarEnabled(boolean verticalScrollBarEnabled) {
1066810659
* @hide
1066910660
*/
1067010661
protected void recomputePadding() {
10671-
setPadding(mUserPaddingLeft, mPaddingTop, mUserPaddingRight, mUserPaddingBottom);
10662+
internalSetPadding(mUserPaddingLeft, mPaddingTop, mUserPaddingRight, mUserPaddingBottom);
1067210663
}
1067310664

1067410665
/**
@@ -11283,8 +11274,6 @@ public void resolveLayoutDirection() {
1128311274
// Set to resolved
1128411275
mPrivateFlags2 |= LAYOUT_DIRECTION_RESOLVED;
1128511276
onResolvedLayoutDirectionChanged();
11286-
// Resolve padding
11287-
resolvePadding();
1128811277
}
1128911278

1129011279
/**
@@ -11309,14 +11298,16 @@ public void resolvePadding() {
1130911298
// Start user padding override Right user padding. Otherwise, if Right user
1131011299
// padding is not defined, use the default Right padding. If Right user padding
1131111300
// is defined, just use it.
11312-
if (mUserPaddingStart >= 0) {
11301+
if (mUserPaddingStart != UNDEFINED_PADDING) {
1131311302
mUserPaddingRight = mUserPaddingStart;
11314-
} else if (mUserPaddingRight < 0) {
11303+
}
11304+
if (mUserPaddingRight == UNDEFINED_PADDING) {
1131511305
mUserPaddingRight = mPaddingRight;
1131611306
}
11317-
if (mUserPaddingEnd >= 0) {
11307+
if (mUserPaddingEnd != UNDEFINED_PADDING) {
1131811308
mUserPaddingLeft = mUserPaddingEnd;
11319-
} else if (mUserPaddingLeft < 0) {
11309+
}
11310+
if (mUserPaddingLeft == UNDEFINED_PADDING) {
1132011311
mUserPaddingLeft = mPaddingLeft;
1132111312
}
1132211313
break;
@@ -11325,25 +11316,23 @@ public void resolvePadding() {
1132511316
// Start user padding override Left user padding. Otherwise, if Left user
1132611317
// padding is not defined, use the default left padding. If Left user padding
1132711318
// is defined, just use it.
11328-
if (mUserPaddingStart >= 0) {
11319+
if (mUserPaddingStart != UNDEFINED_PADDING) {
1132911320
mUserPaddingLeft = mUserPaddingStart;
11330-
} else if (mUserPaddingLeft < 0) {
11321+
}
11322+
if (mUserPaddingLeft == UNDEFINED_PADDING) {
1133111323
mUserPaddingLeft = mPaddingLeft;
1133211324
}
11333-
if (mUserPaddingEnd >= 0) {
11325+
if (mUserPaddingEnd != UNDEFINED_PADDING) {
1133411326
mUserPaddingRight = mUserPaddingEnd;
11335-
} else if (mUserPaddingRight < 0) {
11327+
}
11328+
if (mUserPaddingRight == UNDEFINED_PADDING) {
1133611329
mUserPaddingRight = mPaddingRight;
1133711330
}
1133811331
}
1133911332

1134011333
mUserPaddingBottom = (mUserPaddingBottom >= 0) ? mUserPaddingBottom : mPaddingBottom;
1134111334

11342-
if(isPaddingRelative()) {
11343-
setPaddingRelative(mUserPaddingStart, mPaddingTop, mUserPaddingEnd, mUserPaddingBottom);
11344-
} else {
11345-
recomputePadding();
11346-
}
11335+
internalSetPadding(mUserPaddingLeft, mPaddingTop, mUserPaddingRight, mUserPaddingBottom);
1134711336
onPaddingChanged(resolvedLayoutDirection);
1134811337
}
1134911338

@@ -14014,11 +14003,11 @@ public void setBackgroundDrawable(Drawable background) {
1401414003
if (background.getPadding(padding)) {
1401514004
switch (background.getLayoutDirection()) {
1401614005
case LAYOUT_DIRECTION_RTL:
14017-
setPadding(padding.right, padding.top, padding.left, padding.bottom);
14006+
internalSetPadding(padding.right, padding.top, padding.left, padding.bottom);
1401814007
break;
1401914008
case LAYOUT_DIRECTION_LTR:
1402014009
default:
14021-
setPadding(padding.left, padding.top, padding.right, padding.bottom);
14010+
internalSetPadding(padding.left, padding.top, padding.right, padding.bottom);
1402214011
}
1402314012
}
1402414013

@@ -14108,9 +14097,8 @@ public Drawable getBackground() {
1410814097
* @param bottom the bottom padding in pixels
1410914098
*/
1411014099
public void setPadding(int left, int top, int right, int bottom) {
14111-
mUserPaddingStart = -1;
14112-
mUserPaddingEnd = -1;
14113-
mUserPaddingRelative = false;
14100+
mUserPaddingStart = UNDEFINED_PADDING;
14101+
mUserPaddingEnd = UNDEFINED_PADDING;
1411414102

1411514103
internalSetPadding(left, top, right, bottom);
1411614104
}
@@ -14192,7 +14180,6 @@ private void internalSetPadding(int left, int top, int right, int bottom) {
1419214180
public void setPaddingRelative(int start, int top, int end, int bottom) {
1419314181
mUserPaddingStart = start;
1419414182
mUserPaddingEnd = end;
14195-
mUserPaddingRelative = true;
1419614183

1419714184
switch(getResolvedLayoutDirection()) {
1419814185
case LAYOUT_DIRECTION_RTL:
@@ -14279,7 +14266,7 @@ public int getPaddingEnd() {
1427914266
* @return true if the padding is relative or false if it is not.
1428014267
*/
1428114268
public boolean isPaddingRelative() {
14282-
return mUserPaddingRelative;
14269+
return (mUserPaddingStart != UNDEFINED_PADDING || mUserPaddingEnd != UNDEFINED_PADDING);
1428314270
}
1428414271

1428514272
/**

0 commit comments

Comments
 (0)