1e077d2b607032fb66a4a046aa4b46945d32d281esatok/* 2e077d2b607032fb66a4a046aa4b46945d32d281esatok * Copyright (C) 2011 The Android Open Source Project 3e077d2b607032fb66a4a046aa4b46945d32d281esatok * 4e077d2b607032fb66a4a046aa4b46945d32d281esatok * Licensed under the Apache License, Version 2.0 (the "License"); 5e077d2b607032fb66a4a046aa4b46945d32d281esatok * you may not use this file except in compliance with the License. 6e077d2b607032fb66a4a046aa4b46945d32d281esatok * You may obtain a copy of the License at 7e077d2b607032fb66a4a046aa4b46945d32d281esatok * 8e077d2b607032fb66a4a046aa4b46945d32d281esatok * http://www.apache.org/licenses/LICENSE-2.0 9e077d2b607032fb66a4a046aa4b46945d32d281esatok * 10e077d2b607032fb66a4a046aa4b46945d32d281esatok * Unless required by applicable law or agreed to in writing, software 11e077d2b607032fb66a4a046aa4b46945d32d281esatok * distributed under the License is distributed on an "AS IS" BASIS, 12e077d2b607032fb66a4a046aa4b46945d32d281esatok * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e077d2b607032fb66a4a046aa4b46945d32d281esatok * See the License for the specific language governing permissions and 14e077d2b607032fb66a4a046aa4b46945d32d281esatok * limitations under the License. 15e077d2b607032fb66a4a046aa4b46945d32d281esatok */ 16e077d2b607032fb66a4a046aa4b46945d32d281esatok 17e077d2b607032fb66a4a046aa4b46945d32d281esatokpackage com.android.settings.inputmethod; 18e077d2b607032fb66a4a046aa4b46945d32d281esatok 19a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satokimport android.app.AlertDialog; 20c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatokimport android.content.Context; 21a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satokimport android.content.DialogInterface; 22a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satokimport android.content.pm.ApplicationInfo; 23e077d2b607032fb66a4a046aa4b46945d32d281esatokimport android.os.Bundle; 2439b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference; 2542123f70c5f9f1b8a7f5f78a5a4d60a1e4dd04bfJason Monkimport android.support.v7.preference.Preference.OnPreferenceChangeListener; 2639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference.OnPreferenceClickListener; 2739b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceScreen; 28ef283b41b09aaca9e1f5005133ecf317e37a4959satokimport android.util.Log; 29e077d2b607032fb66a4a046aa4b46945d32d281esatokimport android.view.textservice.SpellCheckerInfo; 30cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaokaimport android.view.textservice.SpellCheckerSubtype; 31c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatokimport android.view.textservice.TextServicesManager; 32cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaokaimport android.widget.Switch; 33e077d2b607032fb66a4a046aa4b46945d32d281esatok 349d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent; 3547f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaokaimport com.android.settings.R; 36cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaokaimport com.android.settings.SettingsActivity; 3747f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaokaimport com.android.settings.SettingsPreferenceFragment; 38cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaokaimport com.android.settings.widget.SwitchBar; 39cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaokaimport com.android.settings.widget.SwitchBar.OnSwitchChangeListener; 40ffc731207f2ed42f6e00541cdebc7e89ec6e9616satok 41e077d2b607032fb66a4a046aa4b46945d32d281esatokpublic class SpellCheckersSettings extends SettingsPreferenceFragment 4242123f70c5f9f1b8a7f5f78a5a4d60a1e4dd04bfJason Monk implements OnSwitchChangeListener, OnPreferenceClickListener, OnPreferenceChangeListener { 43ef283b41b09aaca9e1f5005133ecf317e37a4959satok private static final String TAG = SpellCheckersSettings.class.getSimpleName(); 44ef283b41b09aaca9e1f5005133ecf317e37a4959satok private static final boolean DBG = false; 45e077d2b607032fb66a4a046aa4b46945d32d281esatok 46cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka private static final String KEY_SPELL_CHECKER_LANGUAGE = "spellchecker_language"; 47176b28663b4fb62f1863669ed6bf9d9ce99dfe3aJulia Reynolds private static final String KEY_DEFAULT_SPELL_CHECKER = "default_spellchecker"; 48cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka private static final int ITEM_ID_USE_SYSTEM_LANGUAGE = 0; 49cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka 50cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka private SwitchBar mSwitchBar; 51cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka private Preference mSpellCheckerLanaguagePref; 52a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok private AlertDialog mDialog = null; 53e077d2b607032fb66a4a046aa4b46945d32d281esatok private SpellCheckerInfo mCurrentSci; 54e077d2b607032fb66a4a046aa4b46945d32d281esatok private SpellCheckerInfo[] mEnabledScis; 55c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatok private TextServicesManager mTsm; 56e077d2b607032fb66a4a046aa4b46945d32d281esatok 57e077d2b607032fb66a4a046aa4b46945d32d281esatok @Override 588a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 599d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren return MetricsEvent.INPUTMETHOD_SPELL_CHECKERS; 608a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 618a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 628a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 6347f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka public void onCreate(final Bundle icicle) { 64e077d2b607032fb66a4a046aa4b46945d32d281esatok super.onCreate(icicle); 65cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka 66e077d2b607032fb66a4a046aa4b46945d32d281esatok addPreferencesFromResource(R.xml.spellchecker_prefs); 67cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka mSpellCheckerLanaguagePref = findPreference(KEY_SPELL_CHECKER_LANGUAGE); 68cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka mSpellCheckerLanaguagePref.setOnPreferenceClickListener(this); 69cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka 70cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka mTsm = (TextServicesManager) getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE); 71cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka mCurrentSci = mTsm.getCurrentSpellChecker(); 72cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka mEnabledScis = mTsm.getEnabledSpellCheckers(); 73cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka populatePreferenceScreen(); 74e077d2b607032fb66a4a046aa4b46945d32d281esatok } 75e077d2b607032fb66a4a046aa4b46945d32d281esatok 76cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka private void populatePreferenceScreen() { 7742123f70c5f9f1b8a7f5f78a5a4d60a1e4dd04bfJason Monk final SpellCheckerPreference pref = new SpellCheckerPreference(getPrefContext(), 7842123f70c5f9f1b8a7f5f78a5a4d60a1e4dd04bfJason Monk mEnabledScis); 7942123f70c5f9f1b8a7f5f78a5a4d60a1e4dd04bfJason Monk pref.setTitle(R.string.default_spell_checker); 801ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa final int count = (mEnabledScis == null) ? 0 : mEnabledScis.length; 811ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa if (count > 0) { 821ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa pref.setSummary("%s"); 831ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa } else { 841ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa pref.setSummary(R.string.spell_checker_not_selected); 851ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa } 86176b28663b4fb62f1863669ed6bf9d9ce99dfe3aJulia Reynolds pref.setKey(KEY_DEFAULT_SPELL_CHECKER); 8742123f70c5f9f1b8a7f5f78a5a4d60a1e4dd04bfJason Monk pref.setOnPreferenceChangeListener(this); 881ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa getPreferenceScreen().addPreference(pref); 89e077d2b607032fb66a4a046aa4b46945d32d281esatok } 90e077d2b607032fb66a4a046aa4b46945d32d281esatok 91e077d2b607032fb66a4a046aa4b46945d32d281esatok @Override 92e077d2b607032fb66a4a046aa4b46945d32d281esatok public void onResume() { 93c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatok super.onResume(); 94cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka mSwitchBar = ((SettingsActivity)getActivity()).getSwitchBar(); 95cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka mSwitchBar.show(); 96cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka mSwitchBar.addOnSwitchChangeListener(this); 97cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka updatePreferenceScreen(); 98e077d2b607032fb66a4a046aa4b46945d32d281esatok } 99e077d2b607032fb66a4a046aa4b46945d32d281esatok 100cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka @Override 101cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka public void onPause() { 102cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka super.onPause(); 103cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka mSwitchBar.removeOnSwitchChangeListener(this); 104e077d2b607032fb66a4a046aa4b46945d32d281esatok } 105e077d2b607032fb66a4a046aa4b46945d32d281esatok 106cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka @Override 107cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka public void onSwitchChanged(final Switch switchView, final boolean isChecked) { 108cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka mTsm.setSpellCheckerEnabled(isChecked); 109cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka updatePreferenceScreen(); 110cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka } 111cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka 112cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka private void updatePreferenceScreen() { 11347f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka mCurrentSci = mTsm.getCurrentSpellChecker(); 114cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka final boolean isSpellCheckerEnabled = mTsm.isSpellCheckerEnabled(); 115cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka mSwitchBar.setChecked(isSpellCheckerEnabled); 116cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka 1171ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa final SpellCheckerSubtype currentScs; 118de251d9713ec5349d97c1e84dc0c54d2dc7b728cKeisuke Kuroyanagi if (mCurrentSci != null) { 1191ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa currentScs = mTsm.getCurrentSpellCheckerSubtype( 1201ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa false /* allowImplicitlySelectedSubtype */); 1211ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa } else { 1221ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa currentScs = null; 1231ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa } 124cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka mSpellCheckerLanaguagePref.setSummary(getSpellCheckerSubtypeLabel(mCurrentSci, currentScs)); 125cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka 126cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka final PreferenceScreen screen = getPreferenceScreen(); 127cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka final int count = screen.getPreferenceCount(); 128cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka for (int index = 0; index < count; index++) { 129cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka final Preference preference = screen.getPreference(index); 130cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka preference.setEnabled(isSpellCheckerEnabled); 131cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka if (preference instanceof SpellCheckerPreference) { 132cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka final SpellCheckerPreference pref = (SpellCheckerPreference)preference; 13342123f70c5f9f1b8a7f5f78a5a4d60a1e4dd04bfJason Monk pref.setSelected(mCurrentSci); 134cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka } 135e077d2b607032fb66a4a046aa4b46945d32d281esatok } 1361ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa mSpellCheckerLanaguagePref.setEnabled(isSpellCheckerEnabled && mCurrentSci != null); 137cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka } 138cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka 139cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka private CharSequence getSpellCheckerSubtypeLabel(final SpellCheckerInfo sci, 140cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka final SpellCheckerSubtype subtype) { 141cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka if (sci == null) { 1421ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa return getString(R.string.spell_checker_not_selected); 143ffc731207f2ed42f6e00541cdebc7e89ec6e9616satok } 144cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka if (subtype == null) { 145cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka return getString(R.string.use_system_language_to_select_input_method_subtypes); 146cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka } 147cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka return subtype.getDisplayName( 148cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka getActivity(), sci.getPackageName(), sci.getServiceInfo().applicationInfo); 149ffc731207f2ed42f6e00541cdebc7e89ec6e9616satok } 150ffc731207f2ed42f6e00541cdebc7e89ec6e9616satok 151ffc731207f2ed42f6e00541cdebc7e89ec6e9616satok @Override 15247f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka public boolean onPreferenceClick(final Preference pref) { 153cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka if (pref == mSpellCheckerLanaguagePref) { 154cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka showChooseLanguageDialog(); 155cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka return true; 156cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka } 157cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka return false; 158cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka } 159cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka 160cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka @Override 16142123f70c5f9f1b8a7f5f78a5a4d60a1e4dd04bfJason Monk public boolean onPreferenceChange(Preference preference, Object newValue) { 16242123f70c5f9f1b8a7f5f78a5a4d60a1e4dd04bfJason Monk final SpellCheckerInfo sci = (SpellCheckerInfo) newValue; 163cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka final boolean isSystemApp = 164cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka (sci.getServiceInfo().applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; 165cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka if (isSystemApp) { 166cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka changeCurrentSpellChecker(sci); 16742123f70c5f9f1b8a7f5f78a5a4d60a1e4dd04bfJason Monk return true; 168cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka } else { 16942123f70c5f9f1b8a7f5f78a5a4d60a1e4dd04bfJason Monk showSecurityWarnDialog(sci); 17042123f70c5f9f1b8a7f5f78a5a4d60a1e4dd04bfJason Monk return false; 171cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka } 172cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka } 173cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka 174cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka private static int convertSubtypeIndexToDialogItemId(final int index) { return index + 1; } 175cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka private static int convertDialogItemIdToSubtypeIndex(final int item) { return item - 1; } 176cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka 177cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka private void showChooseLanguageDialog() { 178cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka if (mDialog != null && mDialog.isShowing()) { 179cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka mDialog.dismiss(); 180cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka } 181cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka final SpellCheckerInfo currentSci = mTsm.getCurrentSpellChecker(); 1821ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa if (currentSci == null) { 1831ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa // This can happen in some situations. One example is that the package that the current 1841ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa // spell checker belongs to was uninstalled or being in background. 1851ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa return; 1861ea368b5d5e353110eb131579b8eda00b4e35c59Yohei Yukawa } 187cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka final SpellCheckerSubtype currentScs = mTsm.getCurrentSpellCheckerSubtype( 188cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka false /* allowImplicitlySelectedSubtype */); 189cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 190cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka builder.setTitle(R.string.phone_language); 191cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka final int subtypeCount = currentSci.getSubtypeCount(); 192cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka final CharSequence[] items = new CharSequence[subtypeCount + 1 /* default */ ]; 193cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka items[ITEM_ID_USE_SYSTEM_LANGUAGE] = getSpellCheckerSubtypeLabel(currentSci, null); 194cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka int checkedItemId = ITEM_ID_USE_SYSTEM_LANGUAGE; 195cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka for (int index = 0; index < subtypeCount; ++index) { 196cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka final SpellCheckerSubtype subtype = currentSci.getSubtypeAt(index); 197cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka final int itemId = convertSubtypeIndexToDialogItemId(index); 198cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka items[itemId] = getSpellCheckerSubtypeLabel(currentSci, subtype); 199cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka if (subtype.equals(currentScs)) { 200cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka checkedItemId = itemId; 201cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka } 202cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka } 203cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka builder.setSingleChoiceItems(items, checkedItemId, new AlertDialog.OnClickListener() { 204cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka @Override 205cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka public void onClick(final DialogInterface dialog, final int item) { 206cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka if (item == ITEM_ID_USE_SYSTEM_LANGUAGE) { 207cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka mTsm.setSpellCheckerSubtype(null); 20847f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka } else { 209cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka final int index = convertDialogItemIdToSubtypeIndex(item); 210cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka mTsm.setSpellCheckerSubtype(currentSci.getSubtypeAt(index)); 211cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka } 212cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka if (DBG) { 213cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka final SpellCheckerSubtype subtype = mTsm.getCurrentSpellCheckerSubtype( 214cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka true /* allowImplicitlySelectedSubtype */); 215cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka Log.d(TAG, "Current spell check locale is " 216cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka + subtype == null ? "null" : subtype.getLocale()); 21747f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka } 218cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka dialog.dismiss(); 219cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka updatePreferenceScreen(); 220a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok } 221cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka }); 222cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka mDialog = builder.create(); 223cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka mDialog.show(); 224a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok } 225a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok 22642123f70c5f9f1b8a7f5f78a5a4d60a1e4dd04bfJason Monk private void showSecurityWarnDialog(final SpellCheckerInfo sci) { 227a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok if (mDialog != null && mDialog.isShowing()) { 228a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok mDialog.dismiss(); 229a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok } 23047f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 23147f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka builder.setTitle(android.R.string.dialog_alert_title); 23242123f70c5f9f1b8a7f5f78a5a4d60a1e4dd04bfJason Monk builder.setMessage(getString(R.string.spellchecker_security_warning, 23342123f70c5f9f1b8a7f5f78a5a4d60a1e4dd04bfJason Monk sci.loadLabel(getPackageManager()))); 23447f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka builder.setCancelable(true); 23547f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 23647f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka @Override 23747f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka public void onClick(final DialogInterface dialog, final int which) { 238cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka changeCurrentSpellChecker(sci); 23947f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka } 24047f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka }); 24147f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { 24247f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka @Override 24347f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka public void onClick(final DialogInterface dialog, final int which) { 24447f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka } 24547f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka }); 24647f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka mDialog = builder.create(); 247a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok mDialog.show(); 248a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok } 249a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok 250cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka private void changeCurrentSpellChecker(final SpellCheckerInfo sci) { 251cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka mTsm.setCurrentSpellChecker(sci); 252ef283b41b09aaca9e1f5005133ecf317e37a4959satok if (DBG) { 25347f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka Log.d(TAG, "Current spell check is " + mTsm.getCurrentSpellChecker().getId()); 254ef283b41b09aaca9e1f5005133ecf317e37a4959satok } 255cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka updatePreferenceScreen(); 256e077d2b607032fb66a4a046aa4b46945d32d281esatok } 257e077d2b607032fb66a4a046aa4b46945d32d281esatok} 258