From c087e35d7f9a968ea035e931aa318cf36a3e1b90 Mon Sep 17 00:00:00 2001 From: Jean Chalard Date: Wed, 11 May 2011 20:38:40 +0900 Subject: [PATCH] Enable showing the user dictionary in several locales. Bug: 3479738 Change-Id: Ic57a5675c44c36ad255f9927da151ad6a2a8c44c --- res/xml/language_settings.xml | 21 ++++--- .../settings/UserDictionarySettings.java | 14 +++-- .../InputMethodAndLanguageSettings.java | 59 +++++++++++++++++++ 3 files changed, 77 insertions(+), 17 deletions(-) diff --git a/res/xml/language_settings.xml b/res/xml/language_settings.xml index b7934e613dd..c63bed4f913 100644 --- a/res/xml/language_settings.xml +++ b/res/xml/language_settings.xml @@ -19,19 +19,18 @@ android:title="@string/language_keyboard_settings_title"> + android:title="@string/language_settings_category"> - - + + - - + + + diff --git a/src/com/android/settings/UserDictionarySettings.java b/src/com/android/settings/UserDictionarySettings.java index b13126a89a4..d0ab4724bc1 100644 --- a/src/com/android/settings/UserDictionarySettings.java +++ b/src/com/android/settings/UserDictionarySettings.java @@ -101,7 +101,10 @@ public class UserDictionarySettings extends ListFragment implements DialogCreata public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - mCursor = createCursor(); + final Intent intent = getActivity().getIntent(); + final String locale = intent.getStringExtra("locale"); + + mCursor = createCursor(null != locale ? locale : Locale.getDefault().toString()); TextView emptyView = (TextView)mView.findViewById(R.id.empty); emptyView.setText(R.string.user_dict_settings_empty_text); @@ -117,12 +120,12 @@ public class UserDictionarySettings extends ListFragment implements DialogCreata mAddedWordAlready = savedInstanceState.getBoolean(INSTANCE_KEY_ADDED_WORD, false); } } - + @Override public void onResume() { super.onResume(); final Intent intent = getActivity().getIntent(); - if (!mAddedWordAlready + if (!mAddedWordAlready && intent.getAction().equals("com.android.settings.USER_DICTIONARY_INSERT")) { final String word = intent.getStringExtra(EXTRA_WORD); mAutoReturn = true; @@ -139,11 +142,10 @@ public class UserDictionarySettings extends ListFragment implements DialogCreata outState.putBoolean(INSTANCE_KEY_ADDED_WORD, mAddedWordAlready); } - private Cursor createCursor() { - String currentLocale = Locale.getDefault().toString(); + private Cursor createCursor(final String locale) { // Case-insensitive sort return getActivity().managedQuery(UserDictionary.Words.CONTENT_URI, QUERY_PROJECTION, - QUERY_SELECTION, new String[] { currentLocale }, + QUERY_SELECTION, new String[] { locale }, "UPPER(" + UserDictionary.Words.WORD + ")"); } diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java index a4808b078c6..611da4f6242 100644 --- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java +++ b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java @@ -21,14 +21,22 @@ import com.android.settings.SettingsPreferenceFragment; import com.android.settings.Utils; import com.android.settings.VoiceInputOutputSettings; +import android.app.Activity; import android.content.Context; +import android.content.Intent; import android.content.res.Configuration; +import android.database.Cursor; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; +import android.preference.PreferenceGroup; import android.preference.PreferenceScreen; import android.provider.Settings; import android.view.inputmethod.InputMethodManager; +import android.provider.UserDictionary; + +import java.util.Locale; +import java.util.TreeMap; public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment implements Preference.OnPreferenceChangeListener{ @@ -36,6 +44,9 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment private static final String KEY_PHONE_LANGUAGE = "phone_language"; private static final String KEY_CURRENT_INPUT_METHOD = "current_input_method"; private static final String KEY_INPUT_METHOD_SELECTOR = "input_method_selector"; + private static final String KEY_LANGUAGE_SETTINGS_CATEGORY = "language_settings_category"; + private static final String USER_DICTIONARY_SETTINGS_INTENT_ACTION = + "android.settings.USER_DICTIONARY_SETTINGS"; private int mDefaultInputMethodSelectorVisibility = 0; private ListPreference mShowInputMethodSelectorPref; @@ -59,6 +70,9 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment } else { mLanguagePref = findPreference(KEY_PHONE_LANGUAGE); } + + createUserDictSettings((PreferenceGroup) findPreference(KEY_LANGUAGE_SETTINGS_CATEGORY)); + mShowInputMethodSelectorPref = (ListPreference)findPreference( KEY_INPUT_METHOD_SELECTOR); mShowInputMethodSelectorPref.setOnPreferenceChangeListener(this); @@ -77,6 +91,51 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment } } + /** + * Creates the entries that allow the user to go into the user dictionary for each locale. + * @param userDictGroup The group to put the settings in. + */ + protected void createUserDictSettings(PreferenceGroup userDictGroup) { + final Activity activity = getActivity(); + final Cursor locales = activity.managedQuery(UserDictionary.Words.CONTENT_URI, + new String[] { UserDictionary.Words.LOCALE }, + null, null, null); + final TreeMap prefs = new TreeMap(); + int order = findPreference(KEY_PHONE_LANGUAGE).getOrder(); + if (!locales.moveToFirst()) { + prefs.put("", createUserDictionaryPreference(null, activity, ++order)); + } else { + final int columnIndex = locales.getColumnIndex(UserDictionary.Words.LOCALE); + do { + final String locale = locales.getString(columnIndex); + if (!prefs.containsKey(locale)) + prefs.put(locale, createUserDictionaryPreference(locale, activity, ++order)); + } while (locales.moveToNext()); + } + for (final Preference p : prefs.values()) { + userDictGroup.addPreference(p); + } + } + + /** + * Create a single User Dictionary Preference object, with its parameters set. + * @param locale The locale for which this user dictionary is for. + * @return The corresponding preference. + */ + protected Preference createUserDictionaryPreference(String locale, Activity activity, + int order) { + final Preference newPref = new Preference(getActivity()); + newPref.setOrder(order); + newPref.setTitle(activity.getString(R.string.user_dict_settings_title)); + final Intent intent = new Intent(USER_DICTIONARY_SETTINGS_INTENT_ACTION); + if (null != locale) { + newPref.setSummary(new Locale(locale).getDisplayName()); + intent.putExtra("locale", locale); + } + newPref.setIntent(intent); + return newPref; + } + @Override public void onResume() { super.onResume();