Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d32f27ae authored by Fabrice Di Meglio's avatar Fabrice Di Meglio Committed by Android (Google) Code Review
Browse files

Merge "Fix bug #5199577 TextView with android:password="true" is showing the...

Merge "Fix bug #5199577 TextView with android:password="true" is showing the "dots" on the left even if the password chars are RTL"
parents 2589c937 7810b5f8
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -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;
        }
+28 −0
Original line number Diff line number Diff line
@@ -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();
    }
}
+11 −19
Original line number Diff line number Diff line
@@ -29,11 +29,6 @@ public class LocaleUtil {

    private LocaleUtil() { /* cannot be instantiated */ }

    /**
     * @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.
     */
@@ -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,10 +57,7 @@ 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;
        }

        if (locale != null && !locale.equals(Locale.ROOT)) {
            final String scriptSubtag = ICU.getScript(ICU.addLikelySubtags(locale.toString()));
            if (scriptSubtag == null) return getLayoutDirectionFromFirstChar(locale);

@@ -74,6 +65,8 @@ public class LocaleUtil {
                    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;
        }
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -10886,6 +10886,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);

+2 −3
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import dalvik.annotation.TestLevel;
import dalvik.annotation.TestTargetNew;

import static android.util.LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE;
import static android.util.LocaleUtil.TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE;

public class LocaleUtilTest extends AndroidTestCase {

@@ -33,7 +32,7 @@ public class LocaleUtilTest extends AndroidTestCase {
        args = {Locale.class}
    )
    public void testGetLayoutDirectionFromLocale() {
        assertEquals(TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE,
        assertEquals(TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
                LocaleUtil.getLayoutDirectionFromLocale(null));

        assertEquals(TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
@@ -59,7 +58,7 @@ public class LocaleUtilTest extends AndroidTestCase {
        assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
            LocaleUtil.getLayoutDirectionFromLocale(Locale.US));

        assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE,
        assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
            LocaleUtil.getLayoutDirectionFromLocale(Locale.ROOT));

        assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
Loading