Home | History | Annotate | Download | only in latin
      1 /*
      2  * Copyright (C) 2008-2009 Google Inc.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
      5  * use this file except in compliance with the License. You may obtain a copy of
      6  * the License at
      7  *
      8  * http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
     12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
     13  * License for the specific language governing permissions and limitations under
     14  * the License.
     15  */
     16 
     17 package com.android.inputmethod.latin;
     18 
     19 import android.content.SharedPreferences;
     20 import android.content.SharedPreferences.Editor;
     21 import android.content.res.Configuration;
     22 import android.content.res.Resources;
     23 import android.os.Bundle;
     24 import android.preference.CheckBoxPreference;
     25 import android.preference.PreferenceActivity;
     26 import android.preference.PreferenceGroup;
     27 import android.preference.PreferenceManager;
     28 import android.text.TextUtils;
     29 
     30 import java.text.Collator;
     31 import java.util.ArrayList;
     32 import java.util.Arrays;
     33 import java.util.Locale;
     34 
     35 public class InputLanguageSelection extends PreferenceActivity {
     36 
     37     private String mSelectedLanguages;
     38     private ArrayList<Loc> mAvailableLanguages = new ArrayList<Loc>();
     39 
     40     private static final String[] WHITELIST_LANGUAGES = {
     41         "cs", "da", "de", "en_GB", "en_US", "es", "es_US", "fr", "it", "nb", "nl", "pl", "pt",
     42         "ru", "tr",
     43     };
     44 
     45     private static boolean isWhitelisted(String lang) {
     46         for (String s : WHITELIST_LANGUAGES) {
     47             if (s.equalsIgnoreCase(lang)) {
     48                 return true;
     49             }
     50         }
     51         return false;
     52     }
     53 
     54     private static class Loc implements Comparable<Object> {
     55         static Collator sCollator = Collator.getInstance();
     56 
     57         String label;
     58         Locale locale;
     59 
     60         public Loc(String label, Locale locale) {
     61             this.label = label;
     62             this.locale = locale;
     63         }
     64 
     65         @Override
     66         public String toString() {
     67             return this.label;
     68         }
     69 
     70         public int compareTo(Object o) {
     71             return sCollator.compare(this.label, ((Loc) o).label);
     72         }
     73     }
     74 
     75     @Override
     76     protected void onCreate(Bundle icicle) {
     77         super.onCreate(icicle);
     78         addPreferencesFromResource(R.xml.language_prefs);
     79         // Get the settings preferences
     80         SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
     81         mSelectedLanguages = sp.getString(LatinIME.PREF_SELECTED_LANGUAGES, "");
     82         String[] languageList = mSelectedLanguages.split(",");
     83         mAvailableLanguages = getUniqueLocales();
     84         PreferenceGroup parent = getPreferenceScreen();
     85         for (int i = 0; i < mAvailableLanguages.size(); i++) {
     86             CheckBoxPreference pref = new CheckBoxPreference(this);
     87             Locale locale = mAvailableLanguages.get(i).locale;
     88             pref.setTitle(LanguageSwitcher.toTitleCase(locale.getDisplayName(locale), locale));
     89             boolean checked = isLocaleIn(locale, languageList);
     90             pref.setChecked(checked);
     91             if (hasDictionary(locale)) {
     92                 pref.setSummary(R.string.has_dictionary);
     93             }
     94             parent.addPreference(pref);
     95         }
     96     }
     97 
     98     private boolean isLocaleIn(Locale locale, String[] list) {
     99         String lang = get5Code(locale);
    100         for (int i = 0; i < list.length; i++) {
    101             if (lang.equalsIgnoreCase(list[i])) return true;
    102         }
    103         return false;
    104     }
    105 
    106     private boolean hasDictionary(Locale locale) {
    107         Resources res = getResources();
    108         Configuration conf = res.getConfiguration();
    109         Locale saveLocale = conf.locale;
    110         boolean haveDictionary = false;
    111         conf.locale = locale;
    112         res.updateConfiguration(conf, res.getDisplayMetrics());
    113 
    114         int[] dictionaries = LatinIME.getDictionary(res);
    115         BinaryDictionary bd = new BinaryDictionary(this, dictionaries, Suggest.DIC_MAIN);
    116 
    117         // Is the dictionary larger than a placeholder? Arbitrarily chose a lower limit of
    118         // 4000-5000 words, whereas the LARGE_DICTIONARY is about 20000+ words.
    119         if (bd.getSize() > Suggest.LARGE_DICTIONARY_THRESHOLD / 4) {
    120             haveDictionary = true;
    121         }
    122         bd.close();
    123         conf.locale = saveLocale;
    124         res.updateConfiguration(conf, res.getDisplayMetrics());
    125         return haveDictionary;
    126     }
    127 
    128     private String get5Code(Locale locale) {
    129         String country = locale.getCountry();
    130         return locale.getLanguage()
    131                 + (TextUtils.isEmpty(country) ? "" : "_" + country);
    132     }
    133 
    134     @Override
    135     protected void onResume() {
    136         super.onResume();
    137     }
    138 
    139     @Override
    140     protected void onPause() {
    141         super.onPause();
    142         // Save the selected languages
    143         String checkedLanguages = "";
    144         PreferenceGroup parent = getPreferenceScreen();
    145         int count = parent.getPreferenceCount();
    146         for (int i = 0; i < count; i++) {
    147             CheckBoxPreference pref = (CheckBoxPreference) parent.getPreference(i);
    148             if (pref.isChecked()) {
    149                 Locale locale = mAvailableLanguages.get(i).locale;
    150                 checkedLanguages += get5Code(locale) + ",";
    151             }
    152         }
    153         if (checkedLanguages.length() < 1) checkedLanguages = null; // Save null
    154         SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
    155         Editor editor = sp.edit();
    156         editor.putString(LatinIME.PREF_SELECTED_LANGUAGES, checkedLanguages);
    157         SharedPreferencesCompat.apply(editor);
    158     }
    159 
    160     ArrayList<Loc> getUniqueLocales() {
    161         String[] locales = getAssets().getLocales();
    162         Arrays.sort(locales);
    163         ArrayList<Loc> uniqueLocales = new ArrayList<Loc>();
    164 
    165         final int origSize = locales.length;
    166         Loc[] preprocess = new Loc[origSize];
    167         int finalSize = 0;
    168         for (int i = 0 ; i < origSize; i++ ) {
    169             String s = locales[i];
    170             int len = s.length();
    171             final Locale l;
    172             final String language;
    173             if (len == 5) {
    174                 language = s.substring(0, 2);
    175                 String country = s.substring(3, 5);
    176                 l = new Locale(language, country);
    177             } else if (len == 2) {
    178                 language = s;
    179                 l = new Locale(language);
    180             } else {
    181                 continue;
    182             }
    183             // Exclude languages that are not relevant to LatinIME
    184             if (!isWhitelisted(s)) continue;
    185 
    186             if (finalSize == 0) {
    187                 preprocess[finalSize++] =
    188                         new Loc(LanguageSwitcher.toTitleCase(l.getDisplayName(l), l), l);
    189             } else {
    190                 // check previous entry:
    191                 //  same lang and a country -> upgrade to full name and
    192                 //    insert ours with full name
    193                 //  diff lang -> insert ours with lang-only name
    194                 if (preprocess[finalSize-1].locale.getLanguage().equals(
    195                         language)) {
    196                     preprocess[finalSize-1].label = LanguageSwitcher.toTitleCase(
    197                             preprocess[finalSize-1].locale.getDisplayName(),
    198                             preprocess[finalSize-1].locale);
    199                     preprocess[finalSize++] =
    200                             new Loc(LanguageSwitcher.toTitleCase(l.getDisplayName(), l), l);
    201                 } else {
    202                     String displayName;
    203                     if (s.equals("zz_ZZ")) {
    204                     } else {
    205                         displayName = LanguageSwitcher.toTitleCase(l.getDisplayName(l), l);
    206                         preprocess[finalSize++] = new Loc(displayName, l);
    207                     }
    208                 }
    209             }
    210         }
    211         for (int i = 0; i < finalSize ; i++) {
    212             uniqueLocales.add(preprocess[i]);
    213         }
    214         return uniqueLocales;
    215     }
    216 }
    217