151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
22c87ad3a45cecf9e344487cad1abfdebe79f2c7cNarayan Kamath * Copyright (C) 2014 The Android Open Source Project
36e42190c7f7d7cf3d8b787c918de0d797c6ddbbaPaul Duffin * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code).
1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions.
2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (C) Copyright Taligent, Inc. 1996-1998 -  All Rights Reserved
2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (C) Copyright IBM Corp. 1996-1998 - All Rights Reserved
3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   The original version of this source code and documentation is copyrighted
3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and owned by Taligent, Inc., a wholly-owned subsidiary of IBM. These
3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * materials are provided under terms of a License Agreement between Taligent
3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and Sun. This technology is protected by multiple US and International
3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * patents. This notice and attribution to Taligent may not be removed.
3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   Taligent is a registered trademark of Taligent, Inc.
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.text;
4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Locale;
4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
441ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmeraimport libcore.icu.ICU;
4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/**
4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The <code>Collator</code> class performs locale-sensitive
4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>String</code> comparison. You use this class to build
4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * searching and sorting routines for natural language text.
5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>
5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Collator</code> is an abstract base class. Subclasses
5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implement specific collation strategies. One subclass,
5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>RuleBasedCollator</code>, is currently provided with
5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the Java Platform and is applicable to a wide set of languages. Other
5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * subclasses may be created to handle more specialized needs.
5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>
5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Like other locale-sensitive classes, you can use the static
6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * factory method, <code>getInstance</code>, to obtain the appropriate
6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Collator</code> object for a given locale. You will only need
6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to look at the subclasses of <code>Collator</code> if you need
6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to understand the details of a particular collation strategy or
6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * if you need to modify that strategy.
6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>
6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The following example shows how to compare two strings using
6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the <code>Collator</code> for the default locale.
6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <blockquote>
706e42190c7f7d7cf3d8b787c918de0d797c6ddbbaPaul Duffin * <pre>{@code
7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * // Compare two strings in the default locale
7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Collator myCollator = Collator.getInstance();
7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * if( myCollator.compare("abc", "ABC") < 0 )
7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     System.out.println("abc is less than ABC");
7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * else
7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     System.out.println("abc is greater than or equal to ABC");
776e42190c7f7d7cf3d8b787c918de0d797c6ddbbaPaul Duffin * }</pre>
7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </blockquote>
7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>
8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You can set a <code>Collator</code>'s <em>strength</em> property
8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to determine the level of difference considered significant in
8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * comparisons. Four strengths are provided: <code>PRIMARY</code>,
8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>SECONDARY</code>, <code>TERTIARY</code>, and <code>IDENTICAL</code>.
8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The exact assignment of strengths to language features is
8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * locale dependant.  For example, in Czech, "e" and "f" are considered
8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * primary differences, while "e" and "&#283;" are secondary differences,
8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * "e" and "E" are tertiary differences and "e" and "e" are identical.
8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The following shows how both case and accents could be ignored for
9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * US English.
9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <blockquote>
9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre>
9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * //Get the Collator for US English and set its strength to PRIMARY
9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Collator usCollator = Collator.getInstance(Locale.US);
9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * usCollator.setStrength(Collator.PRIMARY);
9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * if( usCollator.compare("abc", "ABC") == 0 ) {
9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     System.out.println("Strings are equivalent");
9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * }
9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre>
10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </blockquote>
10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>
10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * For comparing <code>String</code>s exactly once, the <code>compare</code>
10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method provides the best performance. When sorting a list of
10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>String</code>s however, it is generally necessary to compare each
10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>String</code> multiple times. In this case, <code>CollationKey</code>s
10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * provide better performance. The <code>CollationKey</code> class converts
10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a <code>String</code> to a series of bits that can be compared bitwise
10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * against other <code>CollationKey</code>s. A <code>CollationKey</code> is
10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * created by a <code>Collator</code> object for a given <code>String</code>.
11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <br>
11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <strong>Note:</strong> <code>CollationKey</code>s from different
11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Collator</code>s can not be compared. See the class description
11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for {@link CollationKey}
11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for an example using <code>CollationKey</code>s.
11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see         RuleBasedCollator
11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see         CollationKey
11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see         CollationElementIterator
11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see         Locale
12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author      Helena Shih, Laura Werner, Richard Gillam
12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic abstract class Collator
1244c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    implements java.util.Comparator<Object>, Cloneable
1254c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin{
12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Collator strength value.  When set, only PRIMARY differences are
12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * considered significant during comparison. The assignment of strengths
12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to language features is locale dependant. A common example is for
13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * different base letters ("a" vs "b") to be considered a PRIMARY difference.
13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#setStrength
13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#getStrength
13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int PRIMARY = 0;
13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Collator strength value.  When set, only SECONDARY and above differences are
13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * considered significant during comparison. The assignment of strengths
13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to language features is locale dependant. A common example is for
13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * different accented forms of the same base letter ("a" vs "\u00E4") to be
14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * considered a SECONDARY difference.
14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#setStrength
14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#getStrength
14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int SECONDARY = 1;
14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Collator strength value.  When set, only TERTIARY and above differences are
14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * considered significant during comparison. The assignment of strengths
14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to language features is locale dependant. A common example is for
14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * case differences ("a" vs "A") to be considered a TERTIARY difference.
15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#setStrength
15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#getStrength
15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int TERTIARY = 2;
15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Collator strength value.  When set, all differences are
15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * considered significant during comparison. The assignment of strengths
15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to language features is locale dependant. A common example is for control
15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * characters ("&#092;u0001" vs "&#092;u0002") to be considered equal at the
16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * PRIMARY, SECONDARY, and TERTIARY levels but different at the IDENTICAL
16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * level.  Additionally, differences between pre-composed accents such as
16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * "&#092;u00C0" (A-grave) and combining accents such as "A&#092;u0300"
16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * (A, combining-grave) will be considered significant at the IDENTICAL
16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * level if decomposition is set to NO_DECOMPOSITION.
16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int IDENTICAL = 3;
16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Decomposition mode value. With NO_DECOMPOSITION
17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * set, accented characters will not be decomposed for collation. This
17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is the default setting and provides the fastest collation but
17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * will only produce correct results for languages that do not use accents.
17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#getDecomposition
17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#setDecomposition
17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int NO_DECOMPOSITION = 0;
17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Decomposition mode value. With CANONICAL_DECOMPOSITION
18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * set, characters that are canonical variants according to Unicode
18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * standard will be decomposed for collation. This should be used to get
18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * correct collation of accented characters.
18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * CANONICAL_DECOMPOSITION corresponds to Normalization Form D as
18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * described in
18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <a href="http://www.unicode.org/unicode/reports/tr15/tr15-23.html">Unicode
18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Technical Report #15</a>.
18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#getDecomposition
18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#setDecomposition
19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int CANONICAL_DECOMPOSITION = 1;
19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Decomposition mode value. With FULL_DECOMPOSITION
19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * set, both Unicode canonical variants and Unicode compatibility variants
19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * will be decomposed for collation.  This causes not only accented
19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * characters to be collated, but also characters that have special formats
19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to be collated with their norminal form. For example, the half-width and
19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * full-width ASCII and Katakana characters are then collated together.
20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * FULL_DECOMPOSITION is the most complete and therefore the slowest
20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * decomposition mode.
20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * FULL_DECOMPOSITION corresponds to Normalization Form KD as
20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * described in
20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <a href="http://www.unicode.org/unicode/reports/tr15/tr15-23.html">Unicode
20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Technical Report #15</a>.
20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#getDecomposition
20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#setDecomposition
20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int FULL_DECOMPOSITION = 2;
21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Gets the Collator for the current default locale.
21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The default locale is determined by java.util.Locale.getDefault.
21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the Collator for the default locale.(for example, en_US)
21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.util.Locale#getDefault
21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static synchronized Collator getInstance() {
21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return getInstance(Locale.getDefault());
22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Gets the Collator for the desired locale.
22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param desiredLocale the desired locale.
22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the Collator for the desired locale.
22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.util.Locale
22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.util.ResourceBundle
22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
229fb7057723ccbfb9412fdf3159eb6c5403397efbfJoachim Sauer    // Android-changed: Switched to ICU.
230fb7057723ccbfb9412fdf3159eb6c5403397efbfJoachim Sauer    public static synchronized Collator getInstance(Locale desiredLocale)
2314c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    {
232595b4de8f2f9744cba2d73a5e7e50278d86ec65fPiotr Jastrzebski        if (desiredLocale == null) {
233595b4de8f2f9744cba2d73a5e7e50278d86ec65fPiotr Jastrzebski            throw new NullPointerException("locale == null");
23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
2351ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera        return new RuleBasedCollator((android.icu.text.RuleBasedCollator)
2361ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera                android.icu.text.Collator.getInstance(desiredLocale));
2371ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera    }
2381ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera
2391ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera    /**
24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Compares the source string to the target string according to the
24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * collation rules for this Collator.  Returns an integer less than,
24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * equal to or greater than zero depending on whether the source String is
24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * less than, equal to or greater than the target string.  See the Collator
24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * class description for an example of use.
24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * For a one time comparison, this method has the best performance. If a
24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * given String will be involved in multiple comparisons, CollationKey.compareTo
24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * has the best performance. See the Collator class description for an example
24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * using CollationKeys.
25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param source the source string.
25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param target the target string.
25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return Returns an integer value. Value is less than zero if source is less than
25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * target, value is zero if source and target are equal, value is greater than zero
25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * if source is greater than target.
25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.CollationKey
25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#getCollationKey
25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public abstract int compare(String source, String target);
25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Compares its two arguments for order.  Returns a negative integer,
26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * zero, or a positive integer as the first argument is less than, equal
26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to, or greater than the second.
26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This implementation merely returns
2664c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     *  <code> compare((String)o1, (String)o2) </code>.
26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a negative integer, zero, or a positive integer as the
2694c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     *         first argument is less than, equal to, or greater than the
2704c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     *         second.
2714c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * @exception ClassCastException the arguments cannot be cast to Strings.
27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.util.Comparator
2734c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * @since   1.2
27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
2754c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    @Override
27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int compare(Object o1, Object o2) {
2774c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    return compare((String)o1, (String)o2);
27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Transforms the String into a series of bits that can be compared bitwise
28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to other CollationKeys. CollationKeys provide better performance than
28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Collator.compare when Strings are involved in multiple comparisons.
28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * See the Collator class description for an example using CollationKeys.
28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param source the string to be transformed into a collation key.
28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the CollationKey for the given String based on this Collator's collation
28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * rules. If the source String is null, a null CollationKey is returned.
28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.CollationKey
28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#compare
29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public abstract CollationKey getCollationKey(String source);
29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Convenience method for comparing the equality of two strings based on
29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * this Collator's collation rules.
29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param source the source string to be compared with.
29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param target the target string to be compared with.
29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return true if the strings are equal according to the collation
29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * rules.  false, otherwise.
30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#compare
30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
3024c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    public boolean equals(String source, String target)
3034c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    {
304fb7057723ccbfb9412fdf3159eb6c5403397efbfJoachim Sauer        // Android-changed: remove use of unnecessary EQUAL constant.
3051ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera        return (compare(source, target) == 0);
30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns this Collator's strength property.  The strength property determines
31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the minimum level of difference considered significant during comparison.
31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * See the Collator class description for an example of use.
31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return this Collator's current strength property.
31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#setStrength
31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#PRIMARY
31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#SECONDARY
31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#TERTIARY
31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#IDENTICAL
31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
3194c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    public synchronized int getStrength()
3204c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    {
32192924f23a03635bb194b6481c4a950e6414ca4e4Neil Fuller        // Android-changed: Switched to ICU.
3221ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera        // The value for IDENTICAL in ICU differs from that used in this class.
3231ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera        int value = icuColl.getStrength();
3241ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera        return (value == android.icu.text.Collator.IDENTICAL) ? IDENTICAL : value;
32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets this Collator's strength property.  The strength property determines
32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the minimum level of difference considered significant during comparison.
33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * See the Collator class description for an example of use.
3314c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * @param newStrength  the new strength value.
3324c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * @see java.text.Collator#getStrength
3334c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * @see java.text.Collator#PRIMARY
3344c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * @see java.text.Collator#SECONDARY
3354c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * @see java.text.Collator#TERTIARY
3364c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * @see java.text.Collator#IDENTICAL
3374c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * @exception  IllegalArgumentException If the new strength value is not one of
3384c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * PRIMARY, SECONDARY, TERTIARY or IDENTICAL.
33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public synchronized void setStrength(int newStrength) {
34192924f23a03635bb194b6481c4a950e6414ca4e4Neil Fuller        // Android-changed: Switched to ICU.
3421ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera        // The ICU value for IDENTICAL differs from that defined in this class.
3431ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera        if (newStrength == IDENTICAL) {
3441ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera            newStrength = android.icu.text.Collator.IDENTICAL;
345595b4de8f2f9744cba2d73a5e7e50278d86ec65fPiotr Jastrzebski        }
3461ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera        icuColl.setStrength(newStrength);
34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Get the decomposition mode of this Collator. Decomposition mode
35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * determines how Unicode composed characters are handled. Adjusting
35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * decomposition mode allows the user to select between faster and more
35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * complete collation behavior.
35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>The three values for decomposition mode are:
35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <UL>
35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <LI>NO_DECOMPOSITION,
35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <LI>CANONICAL_DECOMPOSITION
35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <LI>FULL_DECOMPOSITION.
35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * </UL>
36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * See the documentation for these three constants for a description
36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * of their meaning.
36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the decomposition mode
36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#setDecomposition
36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#NO_DECOMPOSITION
36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#CANONICAL_DECOMPOSITION
36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#FULL_DECOMPOSITION
36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
3684c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    public synchronized int getDecomposition()
3694c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    {
37092924f23a03635bb194b6481c4a950e6414ca4e4Neil Fuller        // Android-changed: Switched to ICU.
371595b4de8f2f9744cba2d73a5e7e50278d86ec65fPiotr Jastrzebski        return decompositionMode_ICU_Java(icuColl.getDecomposition());
372595b4de8f2f9744cba2d73a5e7e50278d86ec65fPiotr Jastrzebski    }
37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Set the decomposition mode of this Collator. See getDecomposition
37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * for a description of decomposition mode.
3764c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * @param decompositionMode  the new decomposition mode.
37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#getDecomposition
37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#NO_DECOMPOSITION
37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#CANONICAL_DECOMPOSITION
38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.Collator#FULL_DECOMPOSITION
3814c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * @exception IllegalArgumentException If the given value is not a valid decomposition
3824c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * mode.
38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public synchronized void setDecomposition(int decompositionMode) {
38592924f23a03635bb194b6481c4a950e6414ca4e4Neil Fuller        // Android-changed: Switched to ICU.
386595b4de8f2f9744cba2d73a5e7e50278d86ec65fPiotr Jastrzebski        icuColl.setDecomposition(decompositionMode_Java_ICU(decompositionMode));
387595b4de8f2f9744cba2d73a5e7e50278d86ec65fPiotr Jastrzebski    }
388595b4de8f2f9744cba2d73a5e7e50278d86ec65fPiotr Jastrzebski
38992924f23a03635bb194b6481c4a950e6414ca4e4Neil Fuller    // Android-changed: Removed references to CollatorProvider.
3904c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    /**
3914c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * Returns an array of all locales for which the
3924c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * <code>getInstance</code> methods of this class can return
3934c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * localized instances.
3944c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     *
3954c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * @return An array of locales for which localized
3964c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     *         <code>Collator</code> instances are available.
3974c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     */
3984c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    public static synchronized Locale[] getAvailableLocales() {
39992924f23a03635bb194b6481c4a950e6414ca4e4Neil Fuller        // Android-changed: Removed reference to CollatorProvider. Switched to ICU.
4004c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin        return ICU.getAvailableCollatorLocales();
4014c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    }
4024c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin
403fb7057723ccbfb9412fdf3159eb6c5403397efbfJoachim Sauer    // BEGIN Android-added: conversion method for decompositionMode constants.
404595b4de8f2f9744cba2d73a5e7e50278d86ec65fPiotr Jastrzebski    private int decompositionMode_Java_ICU(int mode) {
405595b4de8f2f9744cba2d73a5e7e50278d86ec65fPiotr Jastrzebski        switch (mode) {
4061ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera            case Collator.CANONICAL_DECOMPOSITION:
4071ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera                return android.icu.text.Collator.CANONICAL_DECOMPOSITION;
4081ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera            case Collator.NO_DECOMPOSITION:
4091ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera                return android.icu.text.Collator.NO_DECOMPOSITION;
410595b4de8f2f9744cba2d73a5e7e50278d86ec65fPiotr Jastrzebski        }
411595b4de8f2f9744cba2d73a5e7e50278d86ec65fPiotr Jastrzebski        throw new IllegalArgumentException("Bad mode: " + mode);
41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4141ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera    private int decompositionMode_ICU_Java(int mode) {
4151ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera        int javaMode = mode;
4161ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera        switch (mode) {
4171ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera            case android.icu.text.Collator.NO_DECOMPOSITION:
4181ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera                javaMode = Collator.NO_DECOMPOSITION;
4191ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera                break;
4201ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera            case android.icu.text.Collator.CANONICAL_DECOMPOSITION:
4211ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera                javaMode = Collator.CANONICAL_DECOMPOSITION;
4221ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera                break;
42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
4241ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera        return javaMode;
42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
426fb7057723ccbfb9412fdf3159eb6c5403397efbfJoachim Sauer    // END Android-added: conversion method for decompositionMode constants.
42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
428fb7057723ccbfb9412fdf3159eb6c5403397efbfJoachim Sauer    // Android-changed: improve documentation.
42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
4304c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * Returns a new collator with the same decomposition mode and
4314c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * strength value as this collator.
4321ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera     *
4334c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * @return a shallow copy of this collator.
4344c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * @see java.lang.Cloneable
4354c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     */
4364c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    @Override
4374c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    public Object clone()
4384c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    {
4394c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin        try {
44092924f23a03635bb194b6481c4a950e6414ca4e4Neil Fuller            // Android-changed: Switched to ICU.
4414c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin            Collator clone = (Collator) super.clone();
4424c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin            clone.icuColl = (android.icu.text.Collator) icuColl.clone();
4434c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin            return clone;
4444c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin        } catch (CloneNotSupportedException e) {
4454c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin            throw new AssertionError(e);
4464c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin        }
4474c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    }
4484c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin
4494c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    /**
4504c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * Compares the equality of two Collators.
45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param that the Collator to be compared with this.
45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return true if this Collator is the same as that Collator;
45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * false otherwise.
45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
4554c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    @Override
4564c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    public boolean equals(Object that)
4574c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    {
4586e42190c7f7d7cf3d8b787c918de0d797c6ddbbaPaul Duffin        if (this == that) {
4596e42190c7f7d7cf3d8b787c918de0d797c6ddbbaPaul Duffin            return true;
4606e42190c7f7d7cf3d8b787c918de0d797c6ddbbaPaul Duffin        }
4616e42190c7f7d7cf3d8b787c918de0d797c6ddbbaPaul Duffin        if (that == null) {
4626e42190c7f7d7cf3d8b787c918de0d797c6ddbbaPaul Duffin            return false;
4636e42190c7f7d7cf3d8b787c918de0d797c6ddbbaPaul Duffin        }
4646e42190c7f7d7cf3d8b787c918de0d797c6ddbbaPaul Duffin        if (getClass() != that.getClass()) {
4656e42190c7f7d7cf3d8b787c918de0d797c6ddbbaPaul Duffin            return false;
4666e42190c7f7d7cf3d8b787c918de0d797c6ddbbaPaul Duffin        }
46751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        Collator other = (Collator) that;
46892924f23a03635bb194b6481c4a950e6414ca4e4Neil Fuller        // Android-changed: Switched to ICU.
469595b4de8f2f9744cba2d73a5e7e50278d86ec65fPiotr Jastrzebski        return icuColl == null ? other.icuColl == null : icuColl.equals(other.icuColl);
47051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
47151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
47251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
47351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Generates the hash code for this Collator.
47451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
4754c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    @Override
47651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    abstract public int hashCode();
4774c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin
4784c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    /**
4794c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * Default constructor.  This constructor is
4804c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * protected so subclasses can get access to it. Users typically create
4814c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * a Collator sub-class by calling the factory method getInstance.
4824c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     * @see java.text.Collator#getInstance
4834c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin     */
4844c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    protected Collator()
4854c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    {
48692924f23a03635bb194b6481c4a950e6414ca4e4Neil Fuller        // Android-changed: Switched to ICU.
4874c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin        icuColl = android.icu.text.RuleBasedCollator.getInstance(Locale.getDefault());
4884c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    }
4894c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin
490fb7057723ccbfb9412fdf3159eb6c5403397efbfJoachim Sauer    // Android-added: ICU Collator this delegates to.
4914c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    android.icu.text.Collator icuColl;
4924c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin
493fb7057723ccbfb9412fdf3159eb6c5403397efbfJoachim Sauer    // Android-added: protected constructor taking a Collator.
4944c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    Collator(android.icu.text.Collator icuColl) {
4954c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin        this.icuColl = icuColl;
4964c8d6d2a84cffba9a34ea03d534d77027fb1974ePaul Duffin    }
497fb7057723ccbfb9412fdf3159eb6c5403397efbfJoachim Sauer
498fb7057723ccbfb9412fdf3159eb6c5403397efbfJoachim Sauer    // Android-removed: Fields and constants.
4991ee1fbedc2e3f810a69d7a73a07f3f9a8388b488Shubham Ajmera}
500