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

Commit 38015472 authored by Roozbeh Pournader's avatar Roozbeh Pournader
Browse files

Force direction of phone number fields to (practically) LTR

Previously, phone number fields defaulted to locale direction, which
created problems for apps that were not aware of LTR requirements for
phone numbers.

Now, we look at the direction of the digits for the locale, and use
that to determine the direction of the edit field. (For practically
all major RTL locales, that direction is LTR.)

Test: Manual
Bug: 33643035
Change-Id: I17c70d8462bd403ea6866057971105f1f5772ba3
parent ff5eb06e
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ import android.graphics.RectF;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.graphics.fonts.FontVariationAxis;
import android.icu.text.DecimalFormatSymbols;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.LocaleList;
@@ -11058,6 +11059,26 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
            return TextDirectionHeuristics.LTR;
        }

        if (mEditor != null
                && (mEditor.mInputType & EditorInfo.TYPE_MASK_CLASS)
                    == EditorInfo.TYPE_CLASS_PHONE) {
            // Phone numbers must be in the direction of the locale's digits. Most locales have LTR
            // digits, but some locales, such as those written in the Adlam or N'Ko scripts, have
            // RTL digits.
            final DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(getTextLocale());
            final String zero = symbols.getDigitStrings()[0];
            // In case the zero digit is multi-codepoint, just use the first codepoint to determine
            // direction.
            final int firstCodepoint = zero.codePointAt(0);
            final byte digitDirection = Character.getDirectionality(firstCodepoint);
            if (digitDirection == Character.DIRECTIONALITY_RIGHT_TO_LEFT
                    || digitDirection == Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC) {
                return TextDirectionHeuristics.RTL;
            } else {
                return TextDirectionHeuristics.LTR;
            }
        }

        // Always need to resolve layout direction first
        final boolean defaultIsRtl = (getLayoutDirection() == LAYOUT_DIRECTION_RTL);