summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java')
-rw-r--r--src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java207
1 files changed, 191 insertions, 16 deletions
diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
index a4808b0..4ccebf0 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
@@ -18,28 +18,61 @@ package com.android.settings.inputmethod;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.UserDictionarySettings;
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.pm.PackageManager;
import android.content.res.Configuration;
import android.os.Bundle;
+import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
+import android.preference.PreferenceCategory;
+import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
import android.provider.Settings;
+import android.provider.Settings.System;
+import android.text.TextUtils;
+import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
implements Preference.OnPreferenceChangeListener{
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_USER_DICTIONARY_SETTINGS = "key_user_dictionary_settings";
+ // false: on ICS or later
+ private static final boolean SHOW_INPUT_METHOD_SWITCHER_SETTINGS = false;
+
+ private static final String[] sSystemSettingNames = {
+ System.TEXT_AUTO_REPLACE, System.TEXT_AUTO_CAPS, System.TEXT_AUTO_PUNCTUATE,
+ };
+
+ private static final String[] sHardKeyboardKeys = {
+ "auto_replace", "auto_caps", "auto_punctuate",
+ };
private int mDefaultInputMethodSelectorVisibility = 0;
private ListPreference mShowInputMethodSelectorPref;
private Preference mLanguagePref;
+ private ArrayList<InputMethodPreference> mInputMethodPreferenceList =
+ new ArrayList<InputMethodPreference>();
+ private boolean mHaveHardKeyboard;
+ private PreferenceCategory mHardKeyboardCategory;
+ private InputMethodManager mImm;
+ private List<InputMethodInfo> mImis;
+ private boolean mIsOnlyImeSettings;
@Override
public void onCreate(Bundle icicle) {
@@ -59,13 +92,26 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
} else {
mLanguagePref = findPreference(KEY_PHONE_LANGUAGE);
}
- mShowInputMethodSelectorPref = (ListPreference)findPreference(
- KEY_INPUT_METHOD_SELECTOR);
- mShowInputMethodSelectorPref.setOnPreferenceChangeListener(this);
- // TODO: Update current input method name on summary
- updateInputMethodSelectorSummary(loadInputMethodSelectorVisibility());
+ if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
+ mShowInputMethodSelectorPref = (ListPreference)findPreference(
+ KEY_INPUT_METHOD_SELECTOR);
+ mShowInputMethodSelectorPref.setOnPreferenceChangeListener(this);
+ // TODO: Update current input method name on summary
+ updateInputMethodSelectorSummary(loadInputMethodSelectorVisibility());
+ }
new VoiceInputOutputSettings(this).onCreate();
+
+ // Hard keyboard
+ final Configuration config = getResources().getConfiguration();
+ mHaveHardKeyboard = (config.keyboard == Configuration.KEYBOARD_QWERTY);
+
+ // IME
+ mIsOnlyImeSettings = Settings.ACTION_INPUT_METHOD_SETTINGS.equals(
+ getActivity().getIntent().getAction());
+ mImm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+ mImis = mImm.getInputMethodList();
+ createImePreferenceHierarchy((PreferenceGroup)findPreference("keyboard_settings_category"));
}
private void updateInputMethodSelectorSummary(int value) {
@@ -77,25 +123,71 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
}
}
+ private void updateUserDictionaryPreference(Preference userDictionaryPreference) {
+ final Activity activity = getActivity();
+ final Set<String> localeList = UserDictionaryList.getUserDictionaryLocalesList(activity);
+ if (localeList.size() <= 1) {
+ userDictionaryPreference.setTitle(R.string.user_dict_single_settings_title);
+ userDictionaryPreference.setFragment(UserDictionarySettings.class.getName());
+ // If the size of localeList is 0, we don't set the locale parameter in the
+ // extras. This will be interpreted by the UserDictionarySettings class as
+ // meaning "the current locale".
+ // Note that with the current code for UserDictionaryList#getUserDictionaryLocalesList()
+ // the locale list always has at least one element, since it always includes the current
+ // locale explicitly. @see UserDictionaryList.getUserDictionaryLocalesList().
+ if (localeList.size() == 1) {
+ final String locale = (String)localeList.toArray()[0];
+ userDictionaryPreference.getExtras().putString("locale", locale);
+ }
+ } else {
+ userDictionaryPreference.setTitle(R.string.user_dict_multiple_settings_title);
+ userDictionaryPreference.setFragment(UserDictionaryList.class.getName());
+ }
+ }
+
@Override
public void onResume() {
super.onResume();
- if (mLanguagePref != null) {
- Configuration conf = getResources().getConfiguration();
- String locale = conf.locale.getDisplayName(conf.locale);
- if (locale != null && locale.length() > 1) {
- locale = Character.toUpperCase(locale.charAt(0)) + locale.substring(1);
- mLanguagePref.setSummary(locale);
+ if (!mIsOnlyImeSettings) {
+ if (mLanguagePref != null) {
+ Configuration conf = getResources().getConfiguration();
+ String locale = conf.locale.getDisplayName(conf.locale);
+ if (locale != null && locale.length() > 1) {
+ locale = Character.toUpperCase(locale.charAt(0)) + locale.substring(1);
+ mLanguagePref.setSummary(locale);
+ }
+ }
+
+ updateUserDictionaryPreference(findPreference(KEY_USER_DICTIONARY_SETTINGS));
+ if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
+ mShowInputMethodSelectorPref.setOnPreferenceChangeListener(this);
+ }
+ }
+
+ // Hard keyboard
+ if (mHaveHardKeyboard) {
+ for (int i = 0; i < sHardKeyboardKeys.length; ++i) {
+ InputMethodPreference chkPref = (InputMethodPreference)
+ mHardKeyboardCategory.findPreference(sHardKeyboardKeys[i]);
+ chkPref.setChecked(
+ System.getInt(getContentResolver(), sSystemSettingNames[i], 1) > 0);
}
}
- mShowInputMethodSelectorPref.setOnPreferenceChangeListener(this);
+ // IME
+ InputMethodAndSubtypeUtil.loadInputMethodSubtypeList(
+ this, getContentResolver(), mImis, null);
+ updateActiveInputMethodsSummary();
}
@Override
public void onPause() {
super.onPause();
- mShowInputMethodSelectorPref.setOnPreferenceChangeListener(null);
+ if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
+ mShowInputMethodSelectorPref.setOnPreferenceChangeListener(null);
+ }
+ InputMethodAndSubtypeUtil.saveInputMethodSubtypeList(
+ this, getContentResolver(), mImis, mHaveHardKeyboard);
}
@Override
@@ -112,6 +204,17 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showInputMethodPicker();
}
+ } else if (preference instanceof CheckBoxPreference) {
+ final CheckBoxPreference chkPref = (CheckBoxPreference) preference;
+ if (mHaveHardKeyboard) {
+ for (int i = 0; i < sHardKeyboardKeys.length; ++i) {
+ if (chkPref == mHardKeyboardCategory.findPreference(sHardKeyboardKeys[i])) {
+ System.putInt(getContentResolver(), sSystemSettingNames[i],
+ chkPref.isChecked() ? 1 : 0);
+ return true;
+ }
+ }
+ }
}
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
@@ -134,12 +237,84 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
@Override
public boolean onPreferenceChange(Preference preference, Object value) {
- if (preference == mShowInputMethodSelectorPref) {
- if (value instanceof String) {
- saveInputMethodSelectorVisibility((String)value);
+ if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
+ if (preference == mShowInputMethodSelectorPref) {
+ if (value instanceof String) {
+ saveInputMethodSelectorVisibility((String)value);
+ }
}
}
return false;
}
+ private void updateActiveInputMethodsSummary() {
+ for (Preference pref : mInputMethodPreferenceList) {
+ if (pref instanceof InputMethodPreference) {
+ ((InputMethodPreference)pref).updateSummary();
+ }
+ }
+ }
+
+ private InputMethodPreference getInputMethodPreference(InputMethodInfo imi, int imiSize) {
+ final PackageManager pm = getPackageManager();
+ final CharSequence label = imi.loadLabel(pm);
+ // IME settings
+ final Intent intent;
+ final String settingsActivity = imi.getSettingsActivity();
+ if (!TextUtils.isEmpty(settingsActivity)) {
+ intent = new Intent(Intent.ACTION_MAIN);
+ intent.setClassName(imi.getPackageName(), settingsActivity);
+ } else {
+ intent = null;
+ }
+
+ // Add a check box for enabling/disabling IME
+ InputMethodPreference pref = new InputMethodPreference(this, intent, mImm, imi, imiSize);
+ pref.setKey(imi.getId());
+ pref.setTitle(label);
+ return pref;
+ }
+
+ private void createImePreferenceHierarchy(PreferenceGroup root) {
+ final Preference hardKeyPref = findPreference("hard_keyboard");
+ if (mIsOnlyImeSettings) {
+ getPreferenceScreen().removeAll();
+ if (hardKeyPref != null && mHaveHardKeyboard) {
+ getPreferenceScreen().addPreference(hardKeyPref);
+ }
+ if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
+ getPreferenceScreen().addPreference(mShowInputMethodSelectorPref);
+ }
+ getPreferenceScreen().addPreference(root);
+ }
+ if (hardKeyPref != null) {
+ if (mHaveHardKeyboard) {
+ mHardKeyboardCategory = (PreferenceCategory) hardKeyPref;
+ } else {
+ getPreferenceScreen().removePreference(hardKeyPref);
+ }
+ }
+ root.removeAll();
+ mInputMethodPreferenceList.clear();
+
+ if (!mIsOnlyImeSettings) {
+ // Current IME selection
+ final PreferenceScreen currentIme = new PreferenceScreen(getActivity(), null);
+ currentIme.setKey(KEY_CURRENT_INPUT_METHOD);
+ currentIme.setTitle(getResources().getString(R.string.current_input_method));
+ root.addPreference(currentIme);
+ }
+
+ final int N = (mImis == null ? 0 : mImis.size());
+ for (int i = 0; i < N; ++i) {
+ final InputMethodInfo imi = mImis.get(i);
+ final InputMethodPreference pref = getInputMethodPreference(imi, N);
+ mInputMethodPreferenceList.add(pref);
+ }
+
+ Collections.sort(mInputMethodPreferenceList);
+ for (int i = 0; i < N; ++i) {
+ root.addPreference(mInputMethodPreferenceList.get(i));
+ }
+ }
}