• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
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.deprecated.languageswitcher;
18 
19 import com.android.inputmethod.compat.SharedPreferencesCompat;
20 import com.android.inputmethod.latin.LatinIME;
21 import com.android.inputmethod.latin.LatinImeLogger;
22 import com.android.inputmethod.latin.LocaleUtils;
23 import com.android.inputmethod.latin.Settings;
24 
25 import android.content.SharedPreferences;
26 import android.content.SharedPreferences.Editor;
27 import android.content.res.Configuration;
28 import android.text.TextUtils;
29 import android.util.Log;
30 
31 import java.util.ArrayList;
32 import java.util.Locale;
33 
34 /**
35  * Keeps track of list of selected input languages and the current
36  * input language that the user has selected.
37  */
38 public class LanguageSwitcher {
39     private static final String TAG = LanguageSwitcher.class.getSimpleName();
40 
41     @SuppressWarnings("unused")
42     private static final String KEYBOARD_MODE = "keyboard";
43     private static final String[] EMPTY_STIRNG_ARRAY = new String[0];
44 
45     private final ArrayList<Locale> mLocales = new ArrayList<Locale>();
46     private final LatinIME mIme;
47     private String[] mSelectedLanguageArray = EMPTY_STIRNG_ARRAY;
48     private String   mSelectedLanguages;
49     private int      mCurrentIndex = 0;
50     private String   mDefaultInputLanguage;
51     private Locale   mDefaultInputLocale;
52     private Locale   mSystemLocale;
53 
LanguageSwitcher(LatinIME ime)54     public LanguageSwitcher(LatinIME ime) {
55         mIme = ime;
56     }
57 
getLocaleCount()58     public int getLocaleCount() {
59         return mLocales.size();
60     }
61 
onConfigurationChanged(Configuration conf, SharedPreferences prefs)62     public void onConfigurationChanged(Configuration conf, SharedPreferences prefs) {
63         final Locale newLocale = conf.locale;
64         if (!getSystemLocale().toString().equals(newLocale.toString())) {
65             loadLocales(prefs, newLocale);
66         }
67     }
68 
69     /**
70      * Loads the currently selected input languages from shared preferences.
71      * @param sp shared preference for getting the current input language and enabled languages
72      * @param systemLocale the current system locale, stored for changing the current input language
73      * based on the system current system locale.
74      * @return whether there was any change
75      */
loadLocales(SharedPreferences sp, Locale systemLocale)76     public boolean loadLocales(SharedPreferences sp, Locale systemLocale) {
77         if (LatinImeLogger.sDBG) {
78             Log.d(TAG, "load locales");
79         }
80         if (systemLocale != null) {
81             setSystemLocale(systemLocale);
82         }
83         String selectedLanguages = sp.getString(Settings.PREF_SELECTED_LANGUAGES, null);
84         String currentLanguage   = sp.getString(Settings.PREF_INPUT_LANGUAGE, null);
85         if (TextUtils.isEmpty(selectedLanguages)) {
86             mSelectedLanguageArray = EMPTY_STIRNG_ARRAY;
87             mSelectedLanguages = null;
88             loadDefaults();
89             if (mLocales.size() == 0) {
90                 return false;
91             }
92             mLocales.clear();
93             return true;
94         }
95         if (selectedLanguages.equals(mSelectedLanguages)) {
96             return false;
97         }
98         mSelectedLanguageArray = selectedLanguages.split(",");
99         mSelectedLanguages = selectedLanguages; // Cache it for comparison later
100         constructLocales();
101         mCurrentIndex = 0;
102         if (currentLanguage != null) {
103             // Find the index
104             mCurrentIndex = 0;
105             for (int i = 0; i < mLocales.size(); i++) {
106                 if (mSelectedLanguageArray[i].equals(currentLanguage)) {
107                     mCurrentIndex = i;
108                     break;
109                 }
110             }
111             // If we didn't find the index, use the first one
112         }
113         return true;
114     }
115 
loadDefaults()116     private void loadDefaults() {
117         if (LatinImeLogger.sDBG) {
118             Log.d(TAG, "load default locales:");
119         }
120         mDefaultInputLocale = mIme.getResources().getConfiguration().locale;
121         String country = mDefaultInputLocale.getCountry();
122         mDefaultInputLanguage = mDefaultInputLocale.getLanguage() +
123                 (TextUtils.isEmpty(country) ? "" : "_" + country);
124     }
125 
constructLocales()126     private void constructLocales() {
127         mLocales.clear();
128         for (final String lang : mSelectedLanguageArray) {
129             final Locale locale = LocaleUtils.constructLocaleFromString(lang);
130             mLocales.add(locale);
131         }
132     }
133 
134     /**
135      * Returns the currently selected input language code, or the display language code if
136      * no specific locale was selected for input.
137      */
getInputLanguage()138     public String getInputLanguage() {
139         if (getLocaleCount() == 0) return mDefaultInputLanguage;
140 
141         return mSelectedLanguageArray[mCurrentIndex];
142     }
143 
144     /**
145      * Returns the list of enabled language codes.
146      */
getEnabledLanguages(boolean allowImplicitlySelectedLanguages)147     public String[] getEnabledLanguages(boolean allowImplicitlySelectedLanguages) {
148         if (mSelectedLanguageArray.length == 0 && allowImplicitlySelectedLanguages) {
149             return new String[] { mDefaultInputLanguage };
150         }
151         return mSelectedLanguageArray;
152     }
153 
154     /**
155      * Returns the currently selected input locale, or the display locale if no specific
156      * locale was selected for input.
157      */
getInputLocale()158     public Locale getInputLocale() {
159         if (getLocaleCount() == 0) return mDefaultInputLocale;
160 
161         return mLocales.get(mCurrentIndex);
162     }
163 
nextLocaleIndex()164     private int nextLocaleIndex() {
165         final int size = mLocales.size();
166         return (mCurrentIndex + 1) % size;
167     }
168 
prevLocaleIndex()169     private int prevLocaleIndex() {
170         final int size = mLocales.size();
171         return (mCurrentIndex - 1 + size) % size;
172     }
173 
174     /**
175      * Returns the next input locale in the list. Wraps around to the beginning of the
176      * list if we're at the end of the list.
177      */
getNextInputLocale()178     public Locale getNextInputLocale() {
179         if (getLocaleCount() == 0) return mDefaultInputLocale;
180         return mLocales.get(nextLocaleIndex());
181     }
182 
183     /**
184      * Sets the system locale (display UI) used for comparing with the input language.
185      * @param locale the locale of the system
186      */
setSystemLocale(Locale locale)187     private void setSystemLocale(Locale locale) {
188         mSystemLocale = locale;
189     }
190 
191     /**
192      * Returns the system locale.
193      * @return the system locale
194      */
getSystemLocale()195     private Locale getSystemLocale() {
196         return mSystemLocale;
197     }
198 
199     /**
200      * Returns the previous input locale in the list. Wraps around to the end of the
201      * list if we're at the beginning of the list.
202      */
getPrevInputLocale()203     public Locale getPrevInputLocale() {
204         if (getLocaleCount() == 0) return mDefaultInputLocale;
205         return mLocales.get(prevLocaleIndex());
206     }
207 
reset()208     public void reset() {
209         mCurrentIndex = 0;
210     }
211 
next()212     public void next() {
213         mCurrentIndex = nextLocaleIndex();
214     }
215 
prev()216     public void prev() {
217         mCurrentIndex = prevLocaleIndex();
218     }
219 
setLocale(String localeStr)220     public void setLocale(String localeStr) {
221         final int N = mLocales.size();
222         for (int i = 0; i < N; ++i) {
223             if (mLocales.get(i).toString().equals(localeStr)) {
224                 mCurrentIndex = i;
225             }
226         }
227     }
228 
persist(SharedPreferences prefs)229     public void persist(SharedPreferences prefs) {
230         Editor editor = prefs.edit();
231         editor.putString(Settings.PREF_INPUT_LANGUAGE, getInputLanguage());
232         SharedPreferencesCompat.apply(editor);
233     }
234 }
235