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