Fix padding resolution
Change-Id: I2181a0a4057be0d20744b1512dbc1fbc53490d81
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 5bea8f6..043d1d4 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -2767,13 +2767,6 @@
protected int mUserPaddingLeft;
/**
- * Cache if the user padding is relative.
- *
- */
- @ViewDebug.ExportedProperty(category = "padding")
- boolean mUserPaddingRelative;
-
- /**
* Cache the paddingStart set by the user to append to the scrollbar's size.
*
*/
@@ -2788,6 +2781,11 @@
int mUserPaddingEnd;
/**
+ * Default undefined padding
+ */
+ private static final int UNDEFINED_PADDING = Integer.MIN_VALUE;
+
+ /**
* @hide
*/
int mOldWidthMeasureSpec = Integer.MIN_VALUE;
@@ -3098,9 +3096,8 @@
(IMPORTANT_FOR_ACCESSIBILITY_DEFAULT << IMPORTANT_FOR_ACCESSIBILITY_SHIFT);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
setOverScrollMode(OVER_SCROLL_IF_CONTENT_SCROLLS);
- mUserPaddingStart = -1;
- mUserPaddingEnd = -1;
- mUserPaddingRelative = false;
+ mUserPaddingStart = UNDEFINED_PADDING;
+ mUserPaddingEnd = UNDEFINED_PADDING;
}
/**
@@ -3166,8 +3163,8 @@
int topPadding = -1;
int rightPadding = -1;
int bottomPadding = -1;
- int startPadding = -1;
- int endPadding = -1;
+ int startPadding = UNDEFINED_PADDING;
+ int endPadding = UNDEFINED_PADDING;
int padding = -1;
@@ -3214,10 +3211,10 @@
bottomPadding = a.getDimensionPixelSize(attr, -1);
break;
case com.android.internal.R.styleable.View_paddingStart:
- startPadding = a.getDimensionPixelSize(attr, -1);
+ startPadding = a.getDimensionPixelSize(attr, UNDEFINED_PADDING);
break;
case com.android.internal.R.styleable.View_paddingEnd:
- endPadding = a.getDimensionPixelSize(attr, -1);
+ endPadding = a.getDimensionPixelSize(attr, UNDEFINED_PADDING);
break;
case com.android.internal.R.styleable.View_scrollX:
x = a.getDimensionPixelOffset(attr, 0);
@@ -3494,16 +3491,14 @@
setOverScrollMode(overScrollMode);
- if (background != null) {
- setBackground(background);
- }
-
// Cache user padding as we cannot fully resolve padding here (we dont have yet the resolved
// layout direction). Those cached values will be used later during padding resolution.
mUserPaddingStart = startPadding;
mUserPaddingEnd = endPadding;
- updateUserPaddingRelative();
+ if (background != null) {
+ setBackground(background);
+ }
if (padding >= 0) {
leftPadding = padding;
@@ -3516,7 +3511,7 @@
// 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*)
- setPadding(leftPadding >= 0 ? leftPadding : mPaddingLeft,
+ internalSetPadding(leftPadding >= 0 ? leftPadding : mPaddingLeft,
topPadding >= 0 ? topPadding : mPaddingTop,
rightPadding >= 0 ? rightPadding : mPaddingRight,
bottomPadding >= 0 ? bottomPadding : mPaddingBottom);
@@ -3551,10 +3546,6 @@
computeOpaqueFlags();
}
- private void updateUserPaddingRelative() {
- mUserPaddingRelative = (mUserPaddingStart >= 0 || mUserPaddingEnd >= 0);
- }
-
/**
* Non-public constructor for use in testing
*/
@@ -5261,9 +5252,8 @@
*/
protected boolean fitSystemWindows(Rect insets) {
if ((mViewFlags & FITS_SYSTEM_WINDOWS) == FITS_SYSTEM_WINDOWS) {
- mUserPaddingStart = -1;
- mUserPaddingEnd = -1;
- mUserPaddingRelative = false;
+ mUserPaddingStart = UNDEFINED_PADDING;
+ mUserPaddingEnd = UNDEFINED_PADDING;
if ((mViewFlags & OPTIONAL_FITS_SYSTEM_WINDOWS) == 0
|| mAttachInfo == null
|| (mAttachInfo.mSystemUiVisibility & SYSTEM_UI_LAYOUT_FLAGS) == 0) {
@@ -5537,6 +5527,7 @@
// Set the new layout direction (filtered) and ask for a layout pass
mPrivateFlags2 |=
((layoutDirection << LAYOUT_DIRECTION_MASK_SHIFT) & LAYOUT_DIRECTION_MASK);
+ resolvePadding();
requestLayout();
}
}
@@ -10668,7 +10659,7 @@
* @hide
*/
protected void recomputePadding() {
- setPadding(mUserPaddingLeft, mPaddingTop, mUserPaddingRight, mUserPaddingBottom);
+ internalSetPadding(mUserPaddingLeft, mPaddingTop, mUserPaddingRight, mUserPaddingBottom);
}
/**
@@ -11283,8 +11274,6 @@
// Set to resolved
mPrivateFlags2 |= LAYOUT_DIRECTION_RESOLVED;
onResolvedLayoutDirectionChanged();
- // Resolve padding
- resolvePadding();
}
/**
@@ -11309,14 +11298,16 @@
// Start user padding override Right user padding. Otherwise, if Right user
// padding is not defined, use the default Right padding. If Right user padding
// is defined, just use it.
- if (mUserPaddingStart >= 0) {
+ if (mUserPaddingStart != UNDEFINED_PADDING) {
mUserPaddingRight = mUserPaddingStart;
- } else if (mUserPaddingRight < 0) {
+ }
+ if (mUserPaddingRight == UNDEFINED_PADDING) {
mUserPaddingRight = mPaddingRight;
}
- if (mUserPaddingEnd >= 0) {
+ if (mUserPaddingEnd != UNDEFINED_PADDING) {
mUserPaddingLeft = mUserPaddingEnd;
- } else if (mUserPaddingLeft < 0) {
+ }
+ if (mUserPaddingLeft == UNDEFINED_PADDING) {
mUserPaddingLeft = mPaddingLeft;
}
break;
@@ -11325,25 +11316,23 @@
// Start user padding override Left user padding. Otherwise, if Left user
// padding is not defined, use the default left padding. If Left user padding
// is defined, just use it.
- if (mUserPaddingStart >= 0) {
+ if (mUserPaddingStart != UNDEFINED_PADDING) {
mUserPaddingLeft = mUserPaddingStart;
- } else if (mUserPaddingLeft < 0) {
+ }
+ if (mUserPaddingLeft == UNDEFINED_PADDING) {
mUserPaddingLeft = mPaddingLeft;
}
- if (mUserPaddingEnd >= 0) {
+ if (mUserPaddingEnd != UNDEFINED_PADDING) {
mUserPaddingRight = mUserPaddingEnd;
- } else if (mUserPaddingRight < 0) {
+ }
+ if (mUserPaddingRight == UNDEFINED_PADDING) {
mUserPaddingRight = mPaddingRight;
}
}
mUserPaddingBottom = (mUserPaddingBottom >= 0) ? mUserPaddingBottom : mPaddingBottom;
- if(isPaddingRelative()) {
- setPaddingRelative(mUserPaddingStart, mPaddingTop, mUserPaddingEnd, mUserPaddingBottom);
- } else {
- recomputePadding();
- }
+ internalSetPadding(mUserPaddingLeft, mPaddingTop, mUserPaddingRight, mUserPaddingBottom);
onPaddingChanged(resolvedLayoutDirection);
}
@@ -14014,11 +14003,11 @@
if (background.getPadding(padding)) {
switch (background.getLayoutDirection()) {
case LAYOUT_DIRECTION_RTL:
- setPadding(padding.right, padding.top, padding.left, padding.bottom);
+ internalSetPadding(padding.right, padding.top, padding.left, padding.bottom);
break;
case LAYOUT_DIRECTION_LTR:
default:
- setPadding(padding.left, padding.top, padding.right, padding.bottom);
+ internalSetPadding(padding.left, padding.top, padding.right, padding.bottom);
}
}
@@ -14108,9 +14097,8 @@
* @param bottom the bottom padding in pixels
*/
public void setPadding(int left, int top, int right, int bottom) {
- mUserPaddingStart = -1;
- mUserPaddingEnd = -1;
- mUserPaddingRelative = false;
+ mUserPaddingStart = UNDEFINED_PADDING;
+ mUserPaddingEnd = UNDEFINED_PADDING;
internalSetPadding(left, top, right, bottom);
}
@@ -14192,7 +14180,6 @@
public void setPaddingRelative(int start, int top, int end, int bottom) {
mUserPaddingStart = start;
mUserPaddingEnd = end;
- mUserPaddingRelative = true;
switch(getResolvedLayoutDirection()) {
case LAYOUT_DIRECTION_RTL:
@@ -14279,7 +14266,7 @@
* @return true if the padding is relative or false if it is not.
*/
public boolean isPaddingRelative() {
- return mUserPaddingRelative;
+ return (mUserPaddingStart != UNDEFINED_PADDING || mUserPaddingEnd != UNDEFINED_PADDING);
}
/**