diff options
author | Fabrice Di Meglio <fdimeglio@google.com> | 2011-08-24 18:26:14 -0700 |
---|---|---|
committer | Fabrice Di Meglio <fdimeglio@google.com> | 2011-08-25 18:43:37 -0700 |
commit | 7810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73 (patch) | |
tree | 044c603b00cf5c90ee2f85d8f5884e58976d40f1 /core/java/android | |
parent | a646145c335ba821f01d9e4f8be2583eb9fd7266 (diff) | |
download | frameworks_base-7810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73.zip frameworks_base-7810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73.tar.gz frameworks_base-7810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73.tar.bz2 |
Fix bug #5199577 TextView with android:password="true" is showing the "dots" on the left even if the password chars are RTL
- force TextView to LOCALE text heuristic when in "password" mode
- remove TEXT_LAYOUT_DIRECTION_UNKNOWN_DO_NOT_USE
- LocaleUtils.getLayoutDirectionFromLocale() returns "LTR" is locale is NULL or ROOT
Change-Id: I182c46aaf2d73c8b18967fffa230bfabec91ed06
Diffstat (limited to 'core/java/android')
-rw-r--r-- | core/java/android/content/res/Configuration.java | 1 | ||||
-rw-r--r-- | core/java/android/text/TextDirectionHeuristics.java | 28 | ||||
-rw-r--r-- | core/java/android/util/LocaleUtil.java | 30 | ||||
-rw-r--r-- | core/java/android/widget/TextView.java | 5 |
4 files changed, 44 insertions, 20 deletions
diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java index a00f790..5c3a17a 100644 --- a/core/java/android/content/res/Configuration.java +++ b/core/java/android/content/res/Configuration.java @@ -345,7 +345,6 @@ public final class Configuration implements Parcelable, Comparable<Configuration sb.append(" (no locale)"); } switch (textLayoutDirection) { - case LocaleUtil.TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE: sb.append(" ?layoutdir"); break; case LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE: sb.append(" rtl"); break; default: sb.append(" layoutdir="); sb.append(textLayoutDirection); break; } diff --git a/core/java/android/text/TextDirectionHeuristics.java b/core/java/android/text/TextDirectionHeuristics.java index 6debc6b..18b4040 100644 --- a/core/java/android/text/TextDirectionHeuristics.java +++ b/core/java/android/text/TextDirectionHeuristics.java @@ -17,6 +17,10 @@ package android.text; +import java.util.Locale; + +import android.util.LocaleUtil; + /** * Some objects that implement TextDirectionHeuristic. * @hide @@ -75,6 +79,11 @@ public class TextDirectionHeuristics { public static final TextDirectionHeuristic CHARCOUNT_RTL = new TextDirectionHeuristicInternal(CharCount.INSTANCE_DEFAULT, true); + /** + * Force the paragraph direction to the Locale direction. Falls back to left to right. + */ + public static final TextDirectionHeuristic LOCALE = TextDirectionHeuristicLocale.INSTANCE; + private static enum TriState { TRUE, FALSE, UNKNOWN; } @@ -300,4 +309,23 @@ public class TextDirectionHeuristics { public static final float DEFAULT_THRESHOLD = 0.6f; public static final CharCount INSTANCE_DEFAULT = new CharCount(DEFAULT_THRESHOLD); } + + /** + * Algorithm that uses the Locale direction to force the direction of a paragraph. + */ + public static class TextDirectionHeuristicLocale extends TextDirectionHeuristicImpl { + + public TextDirectionHeuristicLocale() { + super(null); + } + + @Override + protected boolean defaultIsRtl() { + final int dir = LocaleUtil.getLayoutDirectionFromLocale(java.util.Locale.getDefault()); + return (dir == LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE); + } + + public static final TextDirectionHeuristicLocale INSTANCE = + new TextDirectionHeuristicLocale(); + } } diff --git a/core/java/android/util/LocaleUtil.java b/core/java/android/util/LocaleUtil.java index 74a930f..763af73 100644 --- a/core/java/android/util/LocaleUtil.java +++ b/core/java/android/util/LocaleUtil.java @@ -32,11 +32,6 @@ public class LocaleUtil { /** * @hide Do not use. Implementation not finished. */ - public static final int TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE = -1; - - /** - * @hide Do not use. Implementation not finished. - */ public static final int TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE = 0; /** @@ -54,7 +49,6 @@ public class LocaleUtil { * * @param locale the Locale for which we want the layout direction. Can be null. * @return the layout direction. This may be one of: - * {@link #TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE} or * {@link #TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE} or * {@link #TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE}. * @@ -63,17 +57,16 @@ public class LocaleUtil { * @hide */ public static int getLayoutDirectionFromLocale(Locale locale) { - if (locale == null || locale.equals(Locale.ROOT)) { - return TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE; - } - - final String scriptSubtag = ICU.getScript(ICU.addLikelySubtags(locale.toString())); - if (scriptSubtag == null) return getLayoutDirectionFromFirstChar(locale); + if (locale != null && !locale.equals(Locale.ROOT)) { + final String scriptSubtag = ICU.getScript(ICU.addLikelySubtags(locale.toString())); + if (scriptSubtag == null) return getLayoutDirectionFromFirstChar(locale); - if (scriptSubtag.equalsIgnoreCase(ARAB_SCRIPT_SUBTAG) || - scriptSubtag.equalsIgnoreCase(HEBR_SCRIPT_SUBTAG)) { - return TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE; + if (scriptSubtag.equalsIgnoreCase(ARAB_SCRIPT_SUBTAG) || + scriptSubtag.equalsIgnoreCase(HEBR_SCRIPT_SUBTAG)) { + return TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE; + } } + return TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE; } @@ -84,7 +77,6 @@ public class LocaleUtil { * * @param locale * @return the layout direction. This may be one of: - * {@link #TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE} or * {@link #TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE} or * {@link #TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE}. * @@ -94,13 +86,13 @@ public class LocaleUtil { */ private static int getLayoutDirectionFromFirstChar(Locale locale) { switch(Character.getDirectionality(locale.getDisplayName(locale).charAt(0))) { - case Character.DIRECTIONALITY_LEFT_TO_RIGHT: - return TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE; case Character.DIRECTIONALITY_RIGHT_TO_LEFT: case Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC: return TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE; + + case Character.DIRECTIONALITY_LEFT_TO_RIGHT: default: - return TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE; + return TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE; } } } diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index a3e67cc..d830f20 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -10701,6 +10701,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener @Override protected void resolveTextDirection() { + if (hasPasswordTransformationMethod()) { + mTextDir = TextDirectionHeuristics.LOCALE; + return; + } + // Always need to resolve layout direction first final boolean defaultIsRtl = (getResolvedLayoutDirection() == LAYOUT_DIRECTION_RTL); |