Home | History | Annotate | Download | only in util
      1 /* GENERATED SOURCE. DO NOT MODIFY. */
      2 //  2016 and later: Unicode, Inc. and others.
      3 // License & terms of use: http://www.unicode.org/copyright.html#License
      4 /*
      5  ********************************************************************************
      6  * Copyright (C) 2003-2016, Google, International Business Machines Corporation
      7  * and others. All Rights Reserved.
      8  ********************************************************************************
      9 */
     10 package android.icu.util;
     11 
     12 import java.util.Arrays;
     13 import java.util.HashMap;
     14 import java.util.List;
     15 import java.util.Locale;
     16 import java.util.Map;
     17 import java.util.MissingResourceException;
     18 
     19 import android.icu.impl.ICUCache;
     20 import android.icu.impl.ICUData;
     21 import android.icu.impl.ICUResourceBundle;
     22 import android.icu.impl.SimpleCache;
     23 
     24 /**
     25  * Provide information about gender in locales based on data in CLDR. Currently supplies gender of lists.
     26  * @author markdavis
     27  * @deprecated This API is ICU internal only.
     28  * @hide Only a subset of ICU is exposed in Android
     29  * @hide draft / provisional / internal are hidden on Android
     30  */
     31 @Deprecated
     32 public class GenderInfo {
     33 
     34     private final ListGenderStyle style; // set based on locale
     35 
     36     /**
     37      * Gender: OTHER means either the information is unavailable, or the person has declined to state MALE or FEMALE.
     38      * @deprecated This API is ICU internal only.
     39      * @hide draft / provisional / internal are hidden on Android
     40      */
     41     @Deprecated
     42     public enum Gender {
     43         /**
     44          * @deprecated This API is ICU internal only.
     45          * @hide draft / provisional / internal are hidden on Android
     46          */
     47         @Deprecated
     48         MALE,
     49         /**
     50          * @deprecated This API is ICU internal only.
     51          * @hide draft / provisional / internal are hidden on Android
     52          */
     53         @Deprecated
     54         FEMALE,
     55         /**
     56          * @deprecated This API is ICU internal only.
     57          * @hide draft / provisional / internal are hidden on Android
     58          */
     59         @Deprecated
     60         OTHER
     61     }
     62 
     63     /**
     64      * Create GenderInfo from a ULocale.
     65      * @param uLocale desired locale
     66      * @deprecated This API is ICU internal only.
     67      * @hide draft / provisional / internal are hidden on Android
     68      */
     69     @Deprecated
     70     public static GenderInfo getInstance(ULocale uLocale) {
     71         return genderInfoCache.get(uLocale);
     72     }
     73 
     74     /**
     75      * Create GenderInfo from a Locale.
     76      * @param locale desired locale
     77      * @deprecated This API is ICU internal only.
     78      * @hide draft / provisional / internal are hidden on Android
     79      */
     80     @Deprecated
     81     public static GenderInfo getInstance(Locale locale) {
     82         return getInstance(ULocale.forLocale(locale));
     83     }
     84 
     85     /**
     86      * Enum only meant for use in CLDR and in testing. Indicates the category for the locale.
     87      * This only affects gender for lists more than one. For lists of 1 item, the gender
     88      * of the list always equals the gender of that sole item.
     89      * @deprecated This API is ICU internal only.
     90      * @hide draft / provisional / internal are hidden on Android
     91      */
     92     @Deprecated
     93     public enum ListGenderStyle {
     94         /**
     95          * For an empty list, returns OTHER;
     96          * For a single item, returns its gender;
     97          * Otherwise always OTHER.
     98          * @deprecated This API is ICU internal only.
     99          * @hide draft / provisional / internal are hidden on Android
    100          */
    101         @Deprecated
    102         NEUTRAL,
    103         /**
    104          * For an empty list, returns OTHER;
    105          * For a single item, returns its gender;
    106          * Otherwise gender(all male) = male, gender(all female) = female, otherwise gender(list) = other.
    107          * So any 'other' value makes the overall gender be 'other'.
    108          * @deprecated This API is ICU internal only.
    109          * @hide draft / provisional / internal are hidden on Android
    110          */
    111         @Deprecated
    112         MIXED_NEUTRAL,
    113         /**
    114          * For an empty list, returns OTHER;
    115          * For a single item, returns its gender;
    116          * Otherwise, gender(all female) = female, otherwise gender(list) = male.
    117          * So for more than one item, any 'other' value makes the overall gender be 'male'.
    118          * @deprecated This API is ICU internal only.
    119          * @hide draft / provisional / internal are hidden on Android
    120          */
    121         @Deprecated
    122         MALE_TAINTS;
    123 
    124         private static Map<String, ListGenderStyle> fromNameMap =
    125             new HashMap<String, ListGenderStyle>(3);
    126 
    127         static {
    128             fromNameMap.put("neutral", NEUTRAL);
    129             fromNameMap.put("maleTaints", MALE_TAINTS);
    130             fromNameMap.put("mixedNeutral", MIXED_NEUTRAL);
    131         }
    132 
    133         /**
    134          * @deprecated This API is ICU internal only.
    135          * @hide draft / provisional / internal are hidden on Android
    136          */
    137         @Deprecated
    138         public static ListGenderStyle fromName(String name) {
    139             ListGenderStyle result = fromNameMap.get(name);
    140             if (result == null) {
    141                 throw new IllegalArgumentException("Unknown gender style name: " + name);
    142             }
    143             return result;
    144         }
    145     }
    146 
    147     /**
    148      * Get the gender of a list, based on locale usage.
    149      * @param genders a list of genders.
    150      * @return the gender of the list.
    151      * @deprecated This API is ICU internal only.
    152      * @hide draft / provisional / internal are hidden on Android
    153      */
    154     @Deprecated
    155     public Gender getListGender(Gender... genders) {
    156         return getListGender(Arrays.asList(genders));
    157     }
    158 
    159     /**
    160      * Get the gender of a list, based on locale usage.
    161      * @param genders a list of genders.
    162      * @return the gender of the list.
    163      * @deprecated This API is ICU internal only.
    164      * @hide draft / provisional / internal are hidden on Android
    165      */
    166     @Deprecated
    167     public Gender getListGender(List<Gender> genders) {
    168         if (genders.size() == 0) {
    169             return Gender.OTHER; // degenerate case
    170         }
    171         if (genders.size() == 1) {
    172             return genders.get(0); // degenerate case
    173         }
    174         switch(style) {
    175         case NEUTRAL:
    176             return Gender.OTHER;
    177         case MIXED_NEUTRAL:
    178             boolean hasFemale = false;
    179             boolean hasMale = false;
    180             for (Gender gender : genders) {
    181                 switch (gender) {
    182                 case FEMALE:
    183                     if (hasMale) {
    184                         return Gender.OTHER;
    185                     }
    186                     hasFemale = true;
    187                     break;
    188                 case MALE:
    189                     if (hasFemale) {
    190                         return Gender.OTHER;
    191                     }
    192                     hasMale = true;
    193                     break;
    194                 case OTHER:
    195                     return Gender.OTHER;
    196                 }
    197             }
    198             return hasMale ? Gender.MALE : Gender.FEMALE;
    199             // Note: any OTHER would have caused a return in the loop, which always happens.
    200         case MALE_TAINTS:
    201             for (Gender gender : genders) {
    202                 if (gender != Gender.FEMALE) {
    203                     return Gender.MALE;
    204                 }
    205             }
    206             return Gender.FEMALE;
    207         default:
    208             return Gender.OTHER;
    209         }
    210     }
    211 
    212     /**
    213      * Only for testing and use with CLDR.
    214      * @param genderStyle gender style
    215      * @deprecated This API is ICU internal only.
    216      * @hide draft / provisional / internal are hidden on Android
    217      */
    218     @Deprecated
    219     public GenderInfo(ListGenderStyle genderStyle) {
    220         style = genderStyle;
    221     }
    222 
    223     private static GenderInfo neutral = new GenderInfo(ListGenderStyle.NEUTRAL);
    224 
    225     private static class Cache {
    226         private final ICUCache<ULocale, GenderInfo> cache =
    227             new SimpleCache<ULocale, GenderInfo>();
    228 
    229         public GenderInfo get(ULocale locale) {
    230             GenderInfo result = cache.get(locale);
    231             if (result == null) {
    232                 result = load(locale);
    233                 if (result == null) {
    234                     ULocale fallback = locale.getFallback();
    235 
    236                     // We call get() recursively so that we can leverage the cache
    237                     // for all fallback locales too. If we get to the root locale,
    238                     // and find no resource assume that list gender style is NEUTRAL.
    239                     result = fallback == null ? neutral : get(fallback);
    240                 }
    241                 cache.put(locale, result);
    242             }
    243             return result;
    244         }
    245 
    246         private static GenderInfo load(ULocale ulocale) {
    247             UResourceBundle rb = UResourceBundle.getBundleInstance(
    248                     ICUData.ICU_BASE_NAME,
    249                     "genderList",
    250                     ICUResourceBundle.ICU_DATA_CLASS_LOADER, true);
    251             UResourceBundle genderList = rb.get("genderList");
    252             try {
    253                 return new GenderInfo(
    254                         ListGenderStyle.fromName(genderList.getString(ulocale.toString())));
    255             } catch (MissingResourceException mre) {
    256                 return null;
    257             }
    258         }
    259     }
    260 
    261     private static Cache genderInfoCache = new Cache();
    262 }
    263