TextDirectionHeuristics.java revision e7beae3f4c9c170c7c6c42cf9b572f0ee1ec9c81
14b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio/*
24b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * Copyright (C) 2011 The Android Open Source Project
34b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio *
44b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * Licensed under the Apache License, Version 2.0 (the "License");
54b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * you may not use this file except in compliance with the License.
64b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * You may obtain a copy of the License at
74b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio *
84b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio *      http://www.apache.org/licenses/LICENSE-2.0
94b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio *
104b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * Unless required by applicable law or agreed to in writing, software
114b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * distributed under the License is distributed on an "AS IS" BASIS,
124b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * See the License for the specific language governing permissions and
144b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * limitations under the License.
154b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio */
16cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
17cb379120456d8065d742021fc5c66748fc8a11a8Doug Feltpackage android.text;
18cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
19cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
207810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglioimport android.util.LocaleUtil;
217810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio
22cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt/**
23cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * Some objects that implement TextDirectionHeuristic.
24cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt */
25cb379120456d8065d742021fc5c66748fc8a11a8Doug Feltpublic class TextDirectionHeuristics {
26cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
27cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    /** Always decides that the direction is left to right. */
28cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    public static final TextDirectionHeuristic LTR =
29cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        new TextDirectionHeuristicInternal(null /* no algorithm */, false);
30cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
31cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    /** Always decides that the direction is right to left. */
32cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    public static final TextDirectionHeuristic RTL =
33cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        new TextDirectionHeuristicInternal(null /* no algorithm */, true);
34cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
35cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    /**
36cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     * Determines the direction based on the first strong directional character,
37cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     * including bidi format chars, falling back to left to right if it
38cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     * finds none.  This is the default behavior of the Unicode Bidirectional
39cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     * Algorithm.
40cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     */
41cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    public static final TextDirectionHeuristic FIRSTSTRONG_LTR =
42cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        new TextDirectionHeuristicInternal(FirstStrong.INSTANCE, false);
43cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
44cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    /**
45cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     * Determines the direction based on the first strong directional character,
46cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     * including bidi format chars, falling back to right to left if it
47cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     * finds none.  This is similar to the default behavior of the Unicode
48cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     * Bidirectional Algorithm, just with different fallback behavior.
49cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     */
50cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    public static final TextDirectionHeuristic FIRSTSTRONG_RTL =
51cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        new TextDirectionHeuristicInternal(FirstStrong.INSTANCE, true);
52cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
53cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    /**
544b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio     * If the text contains any strong right to left non-format character, determines
554b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio     * that the direction is right to left, falling back to left to right if it
564b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio     * finds none.
574b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio     */
584b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio    public static final TextDirectionHeuristic ANYRTL_LTR =
594b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio        new TextDirectionHeuristicInternal(AnyStrong.INSTANCE_RTL, false);
604b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio
614b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio    /**
627810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio     * Force the paragraph direction to the Locale direction. Falls back to left to right.
637810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio     */
647810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio    public static final TextDirectionHeuristic LOCALE = TextDirectionHeuristicLocale.INSTANCE;
657810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio
66cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    private static enum TriState {
67cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        TRUE, FALSE, UNKNOWN;
68cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    }
69cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
70cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    /**
71cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     * Computes the text direction based on an algorithm.  Subclasses implement
72cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     * {@link #defaultIsRtl} to handle cases where the algorithm cannot determine the
73cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     * direction from the text alone.
74cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     */
75e7beae3f4c9c170c7c6c42cf9b572f0ee1ec9c81Fabrice Di Meglio    private static abstract class TextDirectionHeuristicImpl implements TextDirectionHeuristic {
76cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        private final TextDirectionAlgorithm mAlgorithm;
77cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
78cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        public TextDirectionHeuristicImpl(TextDirectionAlgorithm algorithm) {
79cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            mAlgorithm = algorithm;
80cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        }
81cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
82cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        /**
83cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt         * Return true if the default text direction is rtl.
84cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt         */
85cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        abstract protected boolean defaultIsRtl();
86cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
87cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        @Override
88cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        public boolean isRtl(char[] chars, int start, int count) {
89cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            if (chars == null || start < 0 || count < 0 || chars.length - count < start) {
90cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                throw new IllegalArgumentException();
91cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            }
92cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            if (mAlgorithm == null) {
93cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                return defaultIsRtl();
94cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            }
95cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            return doCheck(chars, start, count);
96cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        }
97cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
98cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        private boolean doCheck(char[] chars, int start, int count) {
99cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            switch(mAlgorithm.checkRtl(chars, start, count)) {
100cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                case TRUE:
101cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                    return true;
102cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                case FALSE:
103cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                    return false;
104cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                default:
105cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                    return defaultIsRtl();
106cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            }
107cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        }
108cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    }
109cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
110cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    private static class TextDirectionHeuristicInternal extends TextDirectionHeuristicImpl {
111cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        private final boolean mDefaultIsRtl;
112cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
113cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        private TextDirectionHeuristicInternal(TextDirectionAlgorithm algorithm,
114cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                boolean defaultIsRtl) {
115cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            super(algorithm);
116cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            mDefaultIsRtl = defaultIsRtl;
117cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        }
118cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
119cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        @Override
120cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        protected boolean defaultIsRtl() {
121cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            return mDefaultIsRtl;
122cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        }
123cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    }
124cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
125cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    private static TriState isRtlText(int directionality) {
126cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        switch (directionality) {
127cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            case Character.DIRECTIONALITY_LEFT_TO_RIGHT:
128cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                return TriState.FALSE;
129cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            case Character.DIRECTIONALITY_RIGHT_TO_LEFT:
130cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            case Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC:
131cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                return TriState.TRUE;
132cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            default:
133cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                return TriState.UNKNOWN;
134cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        }
135cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    }
136cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
137cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    private static TriState isRtlTextOrFormat(int directionality) {
138cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        switch (directionality) {
139cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            case Character.DIRECTIONALITY_LEFT_TO_RIGHT:
140cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            case Character.DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING:
141cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            case Character.DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE:
142cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                return TriState.FALSE;
143cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            case Character.DIRECTIONALITY_RIGHT_TO_LEFT:
144cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            case Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC:
145cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            case Character.DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING:
146cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            case Character.DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE:
147cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                return TriState.TRUE;
148cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            default:
149cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                return TriState.UNKNOWN;
150cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        }
151cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    }
152cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
153cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    /**
154cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     * Interface for an algorithm to guess the direction of a paragraph of text.
155cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     *
156cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     */
157e7beae3f4c9c170c7c6c42cf9b572f0ee1ec9c81Fabrice Di Meglio    private static interface TextDirectionAlgorithm {
158cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        /**
159cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt         * Returns whether the range of text is RTL according to the algorithm.
160cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt         *
161cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt         */
162cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        TriState checkRtl(char[] text, int start, int count);
163cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    }
164cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
165cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    /**
166cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     * Algorithm that uses the first strong directional character to determine
167cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     * the paragraph direction.  This is the standard Unicode Bidirectional
168cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     * algorithm.
169cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     *
170cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     */
171e7beae3f4c9c170c7c6c42cf9b572f0ee1ec9c81Fabrice Di Meglio    private static class FirstStrong implements TextDirectionAlgorithm {
172cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        @Override
173cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        public TriState checkRtl(char[] text, int start, int count) {
174cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            TriState result = TriState.UNKNOWN;
175cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            for (int i = start, e = start + count; i < e && result == TriState.UNKNOWN; ++i) {
176cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                result = isRtlTextOrFormat(Character.getDirectionality(text[i]));
177cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            }
178cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            return result;
179cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        }
180cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
181cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        private FirstStrong() {
182cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        }
183cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
184cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        public static final FirstStrong INSTANCE = new FirstStrong();
185cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    }
186cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
187cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    /**
188cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     * Algorithm that uses the presence of any strong directional non-format
189cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     * character (e.g. excludes LRE, LRO, RLE, RLO) to determine the
190cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     * direction of text.
191cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     *
192cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt     */
193e7beae3f4c9c170c7c6c42cf9b572f0ee1ec9c81Fabrice Di Meglio    private static class AnyStrong implements TextDirectionAlgorithm {
194cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        private final boolean mLookForRtl;
195cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
196cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        @Override
197cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        public TriState checkRtl(char[] text, int start, int count) {
198cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            boolean haveUnlookedFor = false;
199cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            for (int i = start, e = start + count; i < e; ++i) {
200cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                switch (isRtlText(Character.getDirectionality(text[i]))) {
201cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                    case TRUE:
202cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                        if (mLookForRtl) {
203cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                            return TriState.TRUE;
204cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                        }
205cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                        haveUnlookedFor = true;
206cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                        break;
207cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                    case FALSE:
208cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                        if (!mLookForRtl) {
209cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                            return TriState.FALSE;
210cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                        }
211cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                        haveUnlookedFor = true;
212cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                        break;
213cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                    default:
214cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                        break;
215cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                }
216cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            }
217cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            if (haveUnlookedFor) {
218cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt                return mLookForRtl ? TriState.FALSE : TriState.TRUE;
219cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            }
220cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            return TriState.UNKNOWN;
221cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        }
222cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
223cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        private AnyStrong(boolean lookForRtl) {
224cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt            this.mLookForRtl = lookForRtl;
225cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        }
226cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
227cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        public static final AnyStrong INSTANCE_RTL = new AnyStrong(true);
228cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt        public static final AnyStrong INSTANCE_LTR = new AnyStrong(false);
229cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    }
230cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt
231cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt    /**
2327810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio     * Algorithm that uses the Locale direction to force the direction of a paragraph.
2337810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio     */
234e7beae3f4c9c170c7c6c42cf9b572f0ee1ec9c81Fabrice Di Meglio    private static class TextDirectionHeuristicLocale extends TextDirectionHeuristicImpl {
2357810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio
2367810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio        public TextDirectionHeuristicLocale() {
2377810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio            super(null);
2387810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio        }
2397810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio
2407810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio        @Override
2417810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio        protected boolean defaultIsRtl() {
2427810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio            final int dir = LocaleUtil.getLayoutDirectionFromLocale(java.util.Locale.getDefault());
2437810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio            return (dir == LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE);
2447810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio        }
2457810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio
2467810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio        public static final TextDirectionHeuristicLocale INSTANCE =
2477810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio                new TextDirectionHeuristicLocale();
2487810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio    }
249cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt}
250