Fix bug #7241988 Padding is mostly set to "0"
- make RTL compatibility mode more straighforward. Done only in constructor
and resolved() is only done for real RTL case.
- fix also issue concerning needRtlPropertiesResolution(): we were missing
padding and drawables bits.
Change-Id: Ic0569f7542a0d66244e8c4bd35ae85949e39c559
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 12eb800..750badd 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -2150,7 +2150,10 @@
* Group of bits indicating that RTL properties resolution is done.
*/
static final int ALL_RTL_PROPERTIES_RESOLVED = PFLAG2_LAYOUT_DIRECTION_RESOLVED |
- PFLAG2_TEXT_DIRECTION_RESOLVED | PFLAG2_TEXT_ALIGNMENT_RESOLVED;
+ PFLAG2_TEXT_DIRECTION_RESOLVED |
+ PFLAG2_TEXT_ALIGNMENT_RESOLVED |
+ PFLAG2_PADDING_RESOLVED |
+ PFLAG2_DRAWABLE_RESOLVED;
// There are a couple of flags left in mPrivateFlags2
@@ -3299,6 +3302,11 @@
int overScrollMode = mOverScrollMode;
boolean initializeScrollbars = false;
+ boolean leftPaddingDefined = false;
+ boolean rightPaddingDefined = false;
+ boolean startPaddingDefined = false;
+ boolean endPaddingDefined = false;
+
final int targetSdkVersion = context.getApplicationInfo().targetSdkVersion;
final int N = a.getIndexCount();
@@ -3312,10 +3320,13 @@
padding = a.getDimensionPixelSize(attr, -1);
mUserPaddingLeftInitial = padding;
mUserPaddingRightInitial = padding;
+ leftPaddingDefined = true;
+ rightPaddingDefined = true;
break;
case com.android.internal.R.styleable.View_paddingLeft:
leftPadding = a.getDimensionPixelSize(attr, -1);
mUserPaddingLeftInitial = leftPadding;
+ leftPaddingDefined = true;
break;
case com.android.internal.R.styleable.View_paddingTop:
topPadding = a.getDimensionPixelSize(attr, -1);
@@ -3323,15 +3334,18 @@
case com.android.internal.R.styleable.View_paddingRight:
rightPadding = a.getDimensionPixelSize(attr, -1);
mUserPaddingRightInitial = rightPadding;
+ rightPaddingDefined = true;
break;
case com.android.internal.R.styleable.View_paddingBottom:
bottomPadding = a.getDimensionPixelSize(attr, -1);
break;
case com.android.internal.R.styleable.View_paddingStart:
startPadding = a.getDimensionPixelSize(attr, UNDEFINED_PADDING);
+ startPaddingDefined = true;
break;
case com.android.internal.R.styleable.View_paddingEnd:
endPadding = a.getDimensionPixelSize(attr, UNDEFINED_PADDING);
+ endPaddingDefined = true;
break;
case com.android.internal.R.styleable.View_scrollX:
x = a.getDimensionPixelOffset(attr, 0);
@@ -3629,10 +3643,24 @@
mUserPaddingRightInitial = padding;
}
+ // RTL compatibility mode: pre Jelly Bean MR1 case OR no RTL support case.
+ // left / right padding are used if defined (meaning here nothing to do). 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 (isRtlCompatibilityMode()) {
+ if (!leftPaddingDefined && startPaddingDefined) {
+ leftPadding = startPadding;
+ }
+ if (!rightPaddingDefined && endPaddingDefined) {
+ rightPadding = endPadding;
+ }
+ }
+
// 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*)
+ // (stored at this point in mPadding*). Padding resolution will happen later if
+ // RTL is supported.
mUserPaddingLeftInitial = leftPadding >= 0 ? leftPadding : mPaddingLeft;
mUserPaddingRightInitial = rightPadding >= 0 ? rightPadding : mPaddingRight;
internalSetPadding(
@@ -11569,6 +11597,15 @@
}
/**
+ * Return true if we are in RTL compatibility mode (either before Jelly Bean MR1 or
+ * RTL not supported)
+ */
+ private boolean isRtlCompatibilityMode() {
+ final int targetSdkVersion = getContext().getApplicationInfo().targetSdkVersion;
+ return targetSdkVersion < JELLY_BEAN_MR1 || !hasRtlSupport();
+ }
+
+ /**
* @return true if RTL properties need resolution.
*/
private boolean needRtlPropertiesResolution() {
@@ -11693,26 +11730,7 @@
* @hide
*/
public void resolvePadding() {
- final int targetSdkVersion = getContext().getApplicationInfo().targetSdkVersion;
- if (targetSdkVersion < JELLY_BEAN_MR1 || !hasRtlSupport()) {
- // Pre Jelly Bean MR1 case (compatibility mode) OR no RTL support case:
- // 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 (mUserPaddingLeftInitial == UNDEFINED_PADDING &&
- mUserPaddingStart != UNDEFINED_PADDING) {
- mUserPaddingLeft = mUserPaddingStart;
- }
- if (mUserPaddingRightInitial == UNDEFINED_PADDING &&
- mUserPaddingEnd != UNDEFINED_PADDING) {
- mUserPaddingRight = mUserPaddingEnd;
- }
-
- mUserPaddingBottom = (mUserPaddingBottom >= 0) ? mUserPaddingBottom : mPaddingBottom;
-
- internalSetPadding(mUserPaddingLeft, mPaddingTop, mUserPaddingRight,
- mUserPaddingBottom);
- } else {
+ if (!isRtlCompatibilityMode()) {
// Post Jelly Bean MR1 case: we need to take the resolved layout direction into account.
// If start / end padding are defined, they will be resolved (hence overriding) to
// left / right or right / left depending on the resolved layout direction.