19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.text;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Abstract class for filtering login-related text (user names and passwords)
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class LoginFilter implements InputFilter {
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mAppendInvalid;  // whether to append or ignore invalid characters
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Base constructor for LoginFilter
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param appendInvalid whether or not to append invalid characters.
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LoginFilter(boolean appendInvalid) {
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAppendInvalid = appendInvalid;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default constructor for LoginFilter doesn't append invalid characters.
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LoginFilter() {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAppendInvalid = false;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method is called when the buffer is going to replace the
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * range <code>dstart &hellip; dend</code> of <code>dest</code>
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with the new text from the range <code>start &hellip; end</code>
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of <code>source</code>.  Returns the CharSequence that we want
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * placed there instead, including an empty string
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if appropriate, or <code>null</code> to accept the original
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * replacement.  Be careful to not to reject 0-length replacements,
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as this is what happens when you delete text.
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence filter(CharSequence source, int start, int end,
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Spanned dest, int dstart, int dend) {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onStart();
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Scan through beginning characters in dest, calling onInvalidCharacter()
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // for each invalid character.
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < dstart; i++) {
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            char c = dest.charAt(i);
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!isAllowed(c)) onInvalidCharacter(c);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Scan through changed characters rejecting disallowed chars
62c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa        SpannableStringBuilder modification = null;
63c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa        int modoff = 0;
64c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = start; i < end; i++) {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            char c = source.charAt(i);
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isAllowed(c)) {
68c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa                // Character allowed.
69c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa                modoff++;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
71c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa                if (mAppendInvalid) {
72c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa                    modoff++;
73c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa                } else {
74c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa                    if (modification == null) {
75c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa                        modification = new SpannableStringBuilder(source, start, end);
76c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa                        modoff = i - start;
77c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa                    }
78c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa
79c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa                    modification.delete(modoff, modoff + 1);
80c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa                }
81c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onInvalidCharacter(c);
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Scan through remaining characters in dest, calling onInvalidCharacter()
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // for each invalid character.
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = dend; i < dest.length(); i++) {
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            char c = dest.charAt(i);
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!isAllowed(c)) onInvalidCharacter(c);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onStop();
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
95c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa        // Either returns null if we made no changes,
96c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa        // or what we wanted to change it to if there were changes.
97c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa        return modification;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when we start processing filter.
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onStart() {
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called whenever we encounter an invalid character.
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param c the invalid character
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onInvalidCharacter(char c) {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when we're done processing filter
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onStop() {
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns whether or not we allow character c.
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Subclasses must override this method.
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract boolean isAllowed(char c);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This filter rejects characters in the user name that are not compatible with GMail
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * account creation. It prevents the user from entering user names with characters other than
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * [a-zA-Z0-9.].
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class UsernameFilterGMail extends LoginFilter {
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public UsernameFilterGMail() {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(false);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public UsernameFilterGMail(boolean appendInvalid) {
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(appendInvalid);
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isAllowed(char c) {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Allow [a-zA-Z0-9@.]
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ('0' <= c && c <= '9')
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ('a' <= c && c <= 'z')
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ('A' <= c && c <= 'Z')
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ('.' == c)
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This filter rejects characters in the user name that are not compatible with Google login.
16130d203050e832c7e3b7ca32cea615cb0825b5a2fFred Quintana     * It is slightly less restrictive than the above filter in that it allows [a-zA-Z0-9._-+].
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class UsernameFilterGeneric extends LoginFilter {
16530d203050e832c7e3b7ca32cea615cb0825b5a2fFred Quintana        private static final String mAllowed = "@_-+."; // Additional characters
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public UsernameFilterGeneric() {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(false);
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public UsernameFilterGeneric(boolean appendInvalid) {
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(appendInvalid);
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isAllowed(char c) {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Allow [a-zA-Z0-9@.]
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ('0' <= c && c <= '9')
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ('a' <= c && c <= 'z')
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ('A' <= c && c <= 'Z')
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mAllowed.indexOf(c) != -1)
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This filter is compatible with GMail passwords which restricts characters to
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the Latin-1 (ISO8859-1) char set.
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class PasswordFilterGMail extends LoginFilter {
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PasswordFilterGMail() {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(false);
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PasswordFilterGMail(boolean appendInvalid) {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(appendInvalid);
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We should reject anything not in the Latin-1 (ISO8859-1) charset
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isAllowed(char c) {
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (32 <= c && c <= 127)
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true; // standard charset
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // if (128 <= c && c <= 159) return true;  // nonstandard (Windows(TM)(R)) charset
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (160 <= c && c <= 255)
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true; // extended charset
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
217