am 95263ef3: am 4d931acd: Merge "Fix for bug #7417949 TextView / EditText error Drawable is not put on the left in RTL mode" into jb-mr1.1-dev

* commit '95263ef3cf4c0df65950d2cddda843aabac6fa48':
  Fix for bug #7417949 TextView / EditText error Drawable is not put on the left in RTL mode
This commit is contained in:
Fabrice Di Meglio
2012-11-20 14:42:13 -08:00
committed by Android Git Automerger
22 changed files with 178 additions and 73 deletions

View File

@@ -309,13 +309,15 @@ public class Editor {
}
private void setErrorIcon(Drawable icon) {
final Drawables dr = mTextView.mDrawables;
if (dr != null) {
mTextView.setCompoundDrawables(dr.mDrawableLeft, dr.mDrawableTop, icon,
dr.mDrawableBottom);
} else {
mTextView.setCompoundDrawables(null, null, icon, null);
Drawables dr = mTextView.mDrawables;
if (dr == null) {
mTextView.mDrawables = dr = new Drawables();
}
dr.setErrorDrawable(icon, mTextView);
mTextView.resetResolvedDrawables();
mTextView.invalidate();
mTextView.requestLayout();
}
private void hideError() {
@@ -329,7 +331,7 @@ public class Editor {
}
/**
* Returns the Y offset to make the pointy top of the error point
* Returns the X offset to make the pointy top of the error point
* at the middle of the error icon.
*/
private int getErrorX() {
@@ -340,8 +342,23 @@ public class Editor {
final float scale = mTextView.getResources().getDisplayMetrics().density;
final Drawables dr = mTextView.mDrawables;
return mTextView.getWidth() - mErrorPopup.getWidth() - mTextView.getPaddingRight() -
(dr != null ? dr.mDrawableSizeRight : 0) / 2 + (int) (25 * scale + 0.5f);
final int layoutDirection = mTextView.getLayoutDirection();
int errorX;
int offset;
switch (layoutDirection) {
default:
case View.LAYOUT_DIRECTION_LTR:
offset = - (dr != null ? dr.mDrawableSizeRight : 0) / 2 + (int) (25 * scale + 0.5f);
errorX = mTextView.getWidth() - mErrorPopup.getWidth() -
mTextView.getPaddingRight() + offset;
break;
case View.LAYOUT_DIRECTION_RTL:
offset = (dr != null ? dr.mDrawableSizeLeft : 0) / 2 - (int) (25 * scale + 0.5f);
errorX = mTextView.getPaddingLeft() + offset;
break;
}
return errorX;
}
/**
@@ -358,16 +375,27 @@ public class Editor {
mTextView.getCompoundPaddingBottom() - compoundPaddingTop;
final Drawables dr = mTextView.mDrawables;
int icontop = compoundPaddingTop +
(vspace - (dr != null ? dr.mDrawableHeightRight : 0)) / 2;
final int layoutDirection = mTextView.getLayoutDirection();
int height;
switch (layoutDirection) {
default:
case View.LAYOUT_DIRECTION_LTR:
height = (dr != null ? dr.mDrawableHeightRight : 0);
break;
case View.LAYOUT_DIRECTION_RTL:
height = (dr != null ? dr.mDrawableHeightLeft : 0);
break;
}
int icontop = compoundPaddingTop + (vspace - height) / 2;
/*
* The "2" is the distance between the point and the top edge
* of the background.
*/
final float scale = mTextView.getResources().getDisplayMetrics().density;
return icontop + (dr != null ? dr.mDrawableHeightRight : 0) - mTextView.getHeight() -
(int) (2 * scale + 0.5f);
return icontop + height - mTextView.getHeight() - (int) (2 * scale + 0.5f);
}
void createInputContentTypeIfNeeded() {
@@ -3726,7 +3754,7 @@ public class Editor {
super(v, width, height);
mView = v;
// Make sure the TextView has a background set as it will be used the first time it is
// shown and positionned. Initialized with below background, which should have
// shown and positioned. Initialized with below background, which should have
// dimensions identical to the above version for this to work (and is more likely).
mPopupInlineErrorBackgroundId = getResourceId(mPopupInlineErrorBackgroundId,
com.android.internal.R.styleable.Theme_errorMessageBackground);

View File

@@ -284,15 +284,144 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
private TextUtils.TruncateAt mEllipsize;
static class Drawables {
final static int DRAWABLE_NONE = -1;
final static int DRAWABLE_RIGHT = 0;
final static int DRAWABLE_LEFT = 1;
final Rect mCompoundRect = new Rect();
Drawable mDrawableTop, mDrawableBottom, mDrawableLeft, mDrawableRight,
mDrawableStart, mDrawableEnd;
mDrawableStart, mDrawableEnd, mDrawableError, mDrawableTemp;
int mDrawableSizeTop, mDrawableSizeBottom, mDrawableSizeLeft, mDrawableSizeRight,
mDrawableSizeStart, mDrawableSizeEnd;
mDrawableSizeStart, mDrawableSizeEnd, mDrawableSizeError, mDrawableSizeTemp;
int mDrawableWidthTop, mDrawableWidthBottom, mDrawableHeightLeft, mDrawableHeightRight,
mDrawableHeightStart, mDrawableHeightEnd;
mDrawableHeightStart, mDrawableHeightEnd, mDrawableHeightError, mDrawableHeightTemp;
int mDrawablePadding;
int mDrawableSaved = DRAWABLE_NONE;
public void resolveWithLayoutDirection(int layoutDirection) {
switch(layoutDirection) {
case LAYOUT_DIRECTION_RTL:
if (mDrawableStart != null) {
mDrawableRight = mDrawableStart;
mDrawableSizeRight = mDrawableSizeStart;
mDrawableHeightRight = mDrawableHeightStart;
}
if (mDrawableEnd != null) {
mDrawableLeft = mDrawableEnd;
mDrawableSizeLeft = mDrawableSizeEnd;
mDrawableHeightLeft = mDrawableHeightEnd;
}
break;
case LAYOUT_DIRECTION_LTR:
default:
if (mDrawableStart != null) {
mDrawableLeft = mDrawableStart;
mDrawableSizeLeft = mDrawableSizeStart;
mDrawableHeightLeft = mDrawableHeightStart;
}
if (mDrawableEnd != null) {
mDrawableRight = mDrawableEnd;
mDrawableSizeRight = mDrawableSizeEnd;
mDrawableHeightRight = mDrawableHeightEnd;
}
break;
}
applyErrorDrawableIfNeeded(layoutDirection);
updateDrawablesLayoutDirection(layoutDirection);
}
private void updateDrawablesLayoutDirection(int layoutDirection) {
if (mDrawableLeft != null) {
mDrawableLeft.setLayoutDirection(layoutDirection);
}
if (mDrawableRight != null) {
mDrawableRight.setLayoutDirection(layoutDirection);
}
if (mDrawableTop != null) {
mDrawableTop.setLayoutDirection(layoutDirection);
}
if (mDrawableBottom != null) {
mDrawableBottom.setLayoutDirection(layoutDirection);
}
}
public void setErrorDrawable(Drawable dr, TextView tv) {
if (mDrawableError != dr && mDrawableError != null) {
mDrawableError.setCallback(null);
}
mDrawableError = dr;
final Rect compoundRect = mCompoundRect;
int[] state = tv.getDrawableState();
if (mDrawableError != null) {
mDrawableError.setState(state);
mDrawableError.copyBounds(compoundRect);
mDrawableError.setCallback(tv);
mDrawableSizeError = compoundRect.width();
mDrawableHeightError = compoundRect.height();
} else {
mDrawableSizeError = mDrawableHeightError = 0;
}
}
private void applyErrorDrawableIfNeeded(int layoutDirection) {
// first restore the initial state if needed
switch (mDrawableSaved) {
case DRAWABLE_LEFT:
mDrawableLeft = mDrawableTemp;
mDrawableSizeLeft = mDrawableSizeTemp;
mDrawableHeightLeft = mDrawableHeightTemp;
break;
case DRAWABLE_RIGHT:
mDrawableRight = mDrawableTemp;
mDrawableSizeRight = mDrawableSizeTemp;
mDrawableHeightRight = mDrawableHeightTemp;
break;
case DRAWABLE_NONE:
default:
}
// then, if needed, assign the Error drawable to the correct location
if (mDrawableError != null) {
switch(layoutDirection) {
case LAYOUT_DIRECTION_RTL:
mDrawableSaved = DRAWABLE_LEFT;
mDrawableTemp = mDrawableLeft;
mDrawableSizeTemp = mDrawableSizeLeft;
mDrawableHeightTemp = mDrawableHeightLeft;
mDrawableLeft = mDrawableError;
mDrawableSizeLeft = mDrawableSizeError;
mDrawableHeightLeft = mDrawableHeightError;
break;
case LAYOUT_DIRECTION_LTR:
default:
mDrawableSaved = DRAWABLE_RIGHT;
mDrawableTemp = mDrawableRight;
mDrawableSizeTemp = mDrawableSizeRight;
mDrawableHeightTemp = mDrawableHeightRight;
mDrawableRight = mDrawableError;
mDrawableSizeRight = mDrawableSizeError;
mDrawableHeightRight = mDrawableHeightError;
break;
}
}
}
}
Drawables mDrawables;
private CharWrapper mCharWrapper;
@@ -8263,63 +8392,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return;
}
mLastLayoutDirection = layoutDirection;
// No drawable to resolve
if (mDrawables == null) {
return;
}
// No relative drawable to resolve
if (mDrawables.mDrawableStart == null && mDrawables.mDrawableEnd == null) {
return;
}
Drawables dr = mDrawables;
switch(layoutDirection) {
case LAYOUT_DIRECTION_RTL:
if (dr.mDrawableStart != null) {
dr.mDrawableRight = dr.mDrawableStart;
dr.mDrawableSizeRight = dr.mDrawableSizeStart;
dr.mDrawableHeightRight = dr.mDrawableHeightStart;
}
if (dr.mDrawableEnd != null) {
dr.mDrawableLeft = dr.mDrawableEnd;
dr.mDrawableSizeLeft = dr.mDrawableSizeEnd;
dr.mDrawableHeightLeft = dr.mDrawableHeightEnd;
}
break;
case LAYOUT_DIRECTION_LTR:
default:
if (dr.mDrawableStart != null) {
dr.mDrawableLeft = dr.mDrawableStart;
dr.mDrawableSizeLeft = dr.mDrawableSizeStart;
dr.mDrawableHeightLeft = dr.mDrawableHeightStart;
}
if (dr.mDrawableEnd != null) {
dr.mDrawableRight = dr.mDrawableEnd;
dr.mDrawableSizeRight = dr.mDrawableSizeEnd;
dr.mDrawableHeightRight = dr.mDrawableHeightEnd;
}
break;
}
updateDrawablesLayoutDirection(dr, layoutDirection);
}
private void updateDrawablesLayoutDirection(Drawables dr, int layoutDirection) {
if (dr.mDrawableLeft != null) {
dr.mDrawableLeft.setLayoutDirection(layoutDirection);
}
if (dr.mDrawableRight != null) {
dr.mDrawableRight.setLayoutDirection(layoutDirection);
}
if (dr.mDrawableTop != null) {
dr.mDrawableTop.setLayoutDirection(layoutDirection);
}
if (dr.mDrawableBottom != null) {
dr.mDrawableBottom.setLayoutDirection(layoutDirection);
// Resolve drawables
if (mDrawables != null) {
mDrawables.resolveWithLayoutDirection(layoutDirection);
}
}
@@ -8327,6 +8403,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* @hide
*/
protected void resetResolvedDrawables() {
super.resetResolvedDrawables();
mLastLayoutDirection = -1;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 940 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 932 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 915 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 919 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 646 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 626 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 622 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB