am 07ce0ca2: Merge "Fix bug #7419054 TextView Drawables resolution is broken in RTL mode" into jb-mr1-dev

* commit '07ce0ca265274c5ba95e6ec3e0950e38b8ce97ea':
  Fix bug #7419054 TextView Drawables resolution is broken in RTL mode
This commit is contained in:
Fabrice Di Meglio
2012-10-26 15:31:43 -07:00
committed by Android Git Automerger
4 changed files with 29 additions and 20 deletions

View File

@ -14197,11 +14197,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @hide
*/
protected void resolveDrawables() {
if (mBackground != null) {
mBackground.setLayoutDirection(getLayoutDirection());
if (canResolveLayoutDirection()) {
if (mBackground != null) {
mBackground.setLayoutDirection(getLayoutDirection());
}
mPrivateFlags2 |= PFLAG2_DRAWABLE_RESOLVED;
onResolveDrawables(getLayoutDirection());
}
mPrivateFlags2 |= PFLAG2_DRAWABLE_RESOLVED;
onResolveDrawables(getLayoutDirection());
}
/**

View File

@ -3384,7 +3384,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
if (child.isLayoutDirectionInherited()) {
child.resetRtlProperties();
child.resolveRtlPropertiesIfNeeded();
}
onViewAdded(child);

View File

@ -144,6 +144,8 @@ public class Editor {
CharSequence mError;
boolean mErrorWasChanged;
ErrorPopup mErrorPopup;
private int mLastLayoutDirection = -1;
/**
* This flag is set if the TextView tries to display an error before it
* is attached to the window (so its position is still unknown).
@ -288,23 +290,30 @@ public class Editor {
public void setError(CharSequence error, Drawable icon) {
mError = TextUtils.stringOrSpannedString(error);
mErrorWasChanged = true;
final Drawables dr = mTextView.mDrawables;
if (dr != null) {
switch (mTextView.getLayoutDirection()) {
final int layoutDirection = mTextView.getLayoutDirection();
if (mLastLayoutDirection != layoutDirection) {
final Drawables dr = mTextView.mDrawables;
switch (layoutDirection) {
default:
case View.LAYOUT_DIRECTION_LTR:
mTextView.setCompoundDrawables(dr.mDrawableLeft, dr.mDrawableTop, icon,
dr.mDrawableBottom);
if (dr != null) {
mTextView.setCompoundDrawables(dr.mDrawableLeft, dr.mDrawableTop, icon,
dr.mDrawableBottom);
} else {
mTextView.setCompoundDrawables(null, null, icon, null);
}
break;
case View.LAYOUT_DIRECTION_RTL:
mTextView.setCompoundDrawables(icon, dr.mDrawableTop, dr.mDrawableRight,
dr.mDrawableBottom);
if (dr != null) {
mTextView.setCompoundDrawables(icon, dr.mDrawableTop, dr.mDrawableRight,
dr.mDrawableBottom);
} else {
mTextView.setCompoundDrawables(icon, null, null, null);
}
break;
}
} else {
mTextView.setCompoundDrawables(null, null, icon, null);
mLastLayoutDirection = layoutDirection;
}
if (mError == null) {
if (mErrorPopup != null) {
if (mErrorPopup.isShowing()) {

View File

@ -306,7 +306,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
private Layout.Alignment mLayoutAlignment;
private int mResolvedTextAlignment;
private boolean mResolvedDrawables;
private int mLastLayoutDirection = -1;
/**
* On some devices the fading edges add a performance penalty if used
@ -8260,16 +8260,16 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
@Override
public void onResolveDrawables(int layoutDirection) {
// No need to resolve twice
if (mResolvedDrawables) {
if (mLastLayoutDirection == layoutDirection) {
return;
}
mLastLayoutDirection = layoutDirection;
// No drawable to resolve
if (mDrawables == null) {
return;
}
// No relative drawable to resolve
if (mDrawables.mDrawableStart == null && mDrawables.mDrawableEnd == null) {
mResolvedDrawables = true;
return;
}
@ -8307,7 +8307,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
break;
}
updateDrawablesLayoutDirection(dr, layoutDirection);
mResolvedDrawables = true;
}
private void updateDrawablesLayoutDirection(Drawables dr, int layoutDirection) {
@ -8329,7 +8328,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* @hide
*/
protected void resetResolvedDrawables() {
mResolvedDrawables = false;
mLastLayoutDirection = -1;
}
/**