summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/widget/Editor.java2
-rw-r--r--core/java/android/widget/TextView.java111
2 files changed, 78 insertions, 35 deletions
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index dc305a55c644..0aeef63020c7 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -316,7 +316,7 @@ public class Editor {
private void setErrorIcon(Drawable icon) {
Drawables dr = mTextView.mDrawables;
if (dr == null) {
- mTextView.mDrawables = dr = new Drawables();
+ mTextView.mDrawables = dr = new Drawables(mTextView.getContext());
}
dr.setErrorDrawable(icon, mTextView);
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index b084ac437f77..1ab9943f26e1 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -136,6 +136,8 @@ import java.util.ArrayList;
import java.util.Locale;
import java.util.concurrent.locks.ReentrantLock;
+import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
+
/**
* Displays text to the user and optionally allows them to edit it. A TextView
* is a complete text editor, however the basic class is configured to not
@@ -294,6 +296,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
Drawable mDrawableTop, mDrawableBottom, mDrawableLeft, mDrawableRight,
mDrawableStart, mDrawableEnd, mDrawableError, mDrawableTemp;
+ Drawable mDrawableLeftInitial, mDrawableRightInitial;
+ boolean mIsRtlCompatibilityMode;
+ boolean mOverride;
+
int mDrawableSizeTop, mDrawableSizeBottom, mDrawableSizeLeft, mDrawableSizeRight,
mDrawableSizeStart, mDrawableSizeEnd, mDrawableSizeError, mDrawableSizeTemp;
@@ -304,38 +310,64 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
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;
+ public Drawables(Context context) {
+ final int targetSdkVersion = context.getApplicationInfo().targetSdkVersion;
+ mIsRtlCompatibilityMode = (targetSdkVersion < JELLY_BEAN_MR1 ||
+ !context.getApplicationInfo().hasRtlSupport());
+ mOverride = false;
+ }
- mDrawableSizeLeft = mDrawableSizeEnd;
- mDrawableHeightLeft = mDrawableHeightEnd;
- }
- break;
+ public void resolveWithLayoutDirection(int layoutDirection) {
+ // First reset "left" and "right" drawables to their initial values
+ mDrawableLeft = mDrawableLeftInitial;
+ mDrawableRight = mDrawableRightInitial;
+
+ if (mIsRtlCompatibilityMode) {
+ // Use "start" drawable as "left" drawable if the "left" drawable was not defined
+ if (mDrawableStart != null && mDrawableLeft == null) {
+ mDrawableLeft = mDrawableStart;
+ mDrawableSizeLeft = mDrawableSizeStart;
+ mDrawableHeightLeft = mDrawableHeightStart;
+ }
+ // Use "end" drawable as "right" drawable if the "right" drawable was not defined
+ if (mDrawableEnd != null && mDrawableRight == null) {
+ mDrawableRight = mDrawableEnd;
+ mDrawableSizeRight = mDrawableSizeEnd;
+ mDrawableHeightRight = mDrawableHeightEnd;
+ }
+ } else {
+ // JB-MR1+ normal case: "start" / "end" drawables are overriding "left" / "right"
+ // drawable if and only if they have been defined
+ switch(layoutDirection) {
+ case LAYOUT_DIRECTION_RTL:
+ if (mOverride) {
+ mDrawableRight = mDrawableStart;
+ mDrawableSizeRight = mDrawableSizeStart;
+ mDrawableHeightRight = mDrawableHeightStart;
+ }
- case LAYOUT_DIRECTION_LTR:
- default:
- if (mDrawableStart != null) {
- mDrawableLeft = mDrawableStart;
+ if (mOverride) {
+ mDrawableLeft = mDrawableEnd;
+ mDrawableSizeLeft = mDrawableSizeEnd;
+ mDrawableHeightLeft = mDrawableHeightEnd;
+ }
+ break;
- mDrawableSizeLeft = mDrawableSizeStart;
- mDrawableHeightLeft = mDrawableHeightStart;
- }
- if (mDrawableEnd != null) {
- mDrawableRight = mDrawableEnd;
+ case LAYOUT_DIRECTION_LTR:
+ default:
+ if (mOverride) {
+ mDrawableLeft = mDrawableStart;
+ mDrawableSizeLeft = mDrawableSizeStart;
+ mDrawableHeightLeft = mDrawableHeightStart;
+ }
- mDrawableSizeRight = mDrawableSizeEnd;
- mDrawableHeightRight = mDrawableHeightEnd;
- }
- break;
+ if (mOverride) {
+ mDrawableRight = mDrawableEnd;
+ mDrawableSizeRight = mDrawableSizeEnd;
+ mDrawableHeightRight = mDrawableHeightEnd;
+ }
+ break;
+ }
}
applyErrorDrawableIfNeeded(layoutDirection);
updateDrawablesLayoutDirection(layoutDirection);
@@ -1154,6 +1186,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
bufferType = BufferType.SPANNABLE;
}
+ // This call will save the initial left/right drawables
setCompoundDrawablesWithIntrinsicBounds(
drawableLeft, drawableTop, drawableRight, drawableBottom);
setRelativeDrawablesIfNeeded(drawableStart, drawableEnd);
@@ -1302,8 +1335,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
if (hasRelativeDrawables) {
Drawables dr = mDrawables;
if (dr == null) {
- mDrawables = dr = new Drawables();
+ mDrawables = dr = new Drawables(getContext());
}
+ mDrawables.mOverride = true;
final Rect compoundRect = dr.mCompoundRect;
int[] state = getDrawableState();
if (start != null) {
@@ -1876,9 +1910,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
} else {
if (dr == null) {
- mDrawables = dr = new Drawables();
+ mDrawables = dr = new Drawables(getContext());
}
+ mDrawables.mOverride = false;
+
if (dr.mDrawableLeft != left && dr.mDrawableLeft != null) {
dr.mDrawableLeft.setCallback(null);
}
@@ -1945,6 +1981,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
}
+ // Save initial left/right drawables
+ if (dr != null) {
+ dr.mDrawableLeftInitial = left;
+ dr.mDrawableRightInitial = right;
+ }
+
invalidate();
requestLayout();
}
@@ -2045,9 +2087,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
} else {
if (dr == null) {
- mDrawables = dr = new Drawables();
+ mDrawables = dr = new Drawables(getContext());
}
+ mDrawables.mOverride = true;
+
if (dr.mDrawableStart != start && dr.mDrawableStart != null) {
dr.mDrawableStart.setCallback(null);
}
@@ -2114,6 +2158,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
}
+ resetResolvedDrawables();
resolveDrawables();
invalidate();
requestLayout();
@@ -2138,7 +2183,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
@android.view.RemotableViewMethod
public void setCompoundDrawablesRelativeWithIntrinsicBounds(int start, int top, int end,
int bottom) {
- resetResolvedDrawables();
final Resources resources = getContext().getResources();
setCompoundDrawablesRelativeWithIntrinsicBounds(
start != 0 ? resources.getDrawable(start) : null,
@@ -2161,7 +2205,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
public void setCompoundDrawablesRelativeWithIntrinsicBounds(Drawable start, Drawable top,
Drawable end, Drawable bottom) {
- resetResolvedDrawables();
if (start != null) {
start.setBounds(0, 0, start.getIntrinsicWidth(), start.getIntrinsicHeight());
}
@@ -2230,7 +2273,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
} else {
if (dr == null) {
- mDrawables = dr = new Drawables();
+ mDrawables = dr = new Drawables(getContext());
}
dr.mDrawablePadding = pad;
}