SpellCheckersSettings.java revision 9d1bfd1e8de6e46137a9571507c03526880d6a46
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;
2539b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference.OnPreferenceClickListener;
2639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceScreen;
27ef283b41b09aaca9e1f5005133ecf317e37a4959satokimport android.util.Log;
28e077d2b607032fb66a4a046aa4b46945d32d281esatokimport android.view.textservice.SpellCheckerInfo;
29cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaokaimport android.view.textservice.SpellCheckerSubtype;
30c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatokimport android.view.textservice.TextServicesManager;
31cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaokaimport android.widget.Switch;
32e077d2b607032fb66a4a046aa4b46945d32d281esatok
339d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent;
3447f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaokaimport com.android.settings.R;
35cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaokaimport com.android.settings.SettingsActivity;
3647f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaokaimport com.android.settings.SettingsPreferenceFragment;
37cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaokaimport com.android.settings.inputmethod.SpellCheckerPreference.OnRadioButtonPreferenceListener;
38cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaokaimport com.android.settings.widget.SwitchBar;
39cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaokaimport com.android.settings.widget.SwitchBar.OnSwitchChangeListener;
40ffc731207f2ed42f6e00541cdebc7e89ec6e9616satok
41e077d2b607032fb66a4a046aa4b46945d32d281esatokpublic class SpellCheckersSettings extends SettingsPreferenceFragment
42cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        implements OnSwitchChangeListener, OnPreferenceClickListener,
43cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        OnRadioButtonPreferenceListener {
44ef283b41b09aaca9e1f5005133ecf317e37a4959satok    private static final String TAG = SpellCheckersSettings.class.getSimpleName();
45ef283b41b09aaca9e1f5005133ecf317e37a4959satok    private static final boolean DBG = false;
46e077d2b607032fb66a4a046aa4b46945d32d281esatok
47cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka    private static final String KEY_SPELL_CHECKER_LANGUAGE = "spellchecker_language";
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() {
77cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        final PreferenceScreen screen = getPreferenceScreen();
78cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        final Context context = getActivity();
79cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        final int count = (mEnabledScis == null) ? 0 : mEnabledScis.length;
80cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        for (int index = 0; index < count; ++index) {
81cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            final SpellCheckerInfo sci = mEnabledScis[index];
8239b467482d1bf256a111c757e9b7621c6f523271Jason Monk            final SpellCheckerPreference pref = new SpellCheckerPreference(getPrefContext(), sci,
8339b467482d1bf256a111c757e9b7621c6f523271Jason Monk                    this);
84cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            screen.addPreference(pref);
85cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            InputMethodAndSubtypeUtil.removeUnnecessaryNonPersistentPreference(pref);
86cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        }
87e077d2b607032fb66a4a046aa4b46945d32d281esatok    }
88e077d2b607032fb66a4a046aa4b46945d32d281esatok
89e077d2b607032fb66a4a046aa4b46945d32d281esatok    @Override
90e077d2b607032fb66a4a046aa4b46945d32d281esatok    public void onResume() {
91c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatok        super.onResume();
92cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        mSwitchBar = ((SettingsActivity)getActivity()).getSwitchBar();
93cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        mSwitchBar.show();
94cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        mSwitchBar.addOnSwitchChangeListener(this);
95cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        updatePreferenceScreen();
96e077d2b607032fb66a4a046aa4b46945d32d281esatok    }
97e077d2b607032fb66a4a046aa4b46945d32d281esatok
98cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka    @Override
99cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka    public void onPause() {
100cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        super.onPause();
101cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        mSwitchBar.removeOnSwitchChangeListener(this);
102e077d2b607032fb66a4a046aa4b46945d32d281esatok    }
103e077d2b607032fb66a4a046aa4b46945d32d281esatok
104cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka    @Override
105cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka    public void onSwitchChanged(final Switch switchView, final boolean isChecked) {
106cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        mTsm.setSpellCheckerEnabled(isChecked);
107cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        updatePreferenceScreen();
108cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka    }
109cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka
110cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka    private void updatePreferenceScreen() {
11147f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka        mCurrentSci = mTsm.getCurrentSpellChecker();
112cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        final boolean isSpellCheckerEnabled = mTsm.isSpellCheckerEnabled();
113cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        mSwitchBar.setChecked(isSpellCheckerEnabled);
114cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka
115cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        final SpellCheckerSubtype currentScs = mTsm.getCurrentSpellCheckerSubtype(
116cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                false /* allowImplicitlySelectedSubtype */);
117cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        mSpellCheckerLanaguagePref.setSummary(getSpellCheckerSubtypeLabel(mCurrentSci, currentScs));
118cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka
119cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        final PreferenceScreen screen = getPreferenceScreen();
120cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        final int count = screen.getPreferenceCount();
121cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        for (int index = 0; index < count; index++) {
122cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            final Preference preference = screen.getPreference(index);
123cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            preference.setEnabled(isSpellCheckerEnabled);
124cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            if (preference instanceof SpellCheckerPreference) {
125cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                final SpellCheckerPreference pref = (SpellCheckerPreference)preference;
126cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                final SpellCheckerInfo sci = pref.getSpellCheckerInfo();
127cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                pref.setSelected(mCurrentSci != null && mCurrentSci.getId().equals(sci.getId()));
128cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            }
129e077d2b607032fb66a4a046aa4b46945d32d281esatok        }
130cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka    }
131cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka
132cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka    private CharSequence getSpellCheckerSubtypeLabel(final SpellCheckerInfo sci,
133cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            final SpellCheckerSubtype subtype) {
134cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        if (sci == null) {
135cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            return null;
136ffc731207f2ed42f6e00541cdebc7e89ec6e9616satok        }
137cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        if (subtype == null) {
138cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            return getString(R.string.use_system_language_to_select_input_method_subtypes);
139cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        }
140cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        return subtype.getDisplayName(
141cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                getActivity(), sci.getPackageName(), sci.getServiceInfo().applicationInfo);
142ffc731207f2ed42f6e00541cdebc7e89ec6e9616satok    }
143ffc731207f2ed42f6e00541cdebc7e89ec6e9616satok
144ffc731207f2ed42f6e00541cdebc7e89ec6e9616satok    @Override
14547f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka    public boolean onPreferenceClick(final Preference pref) {
146cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        if (pref == mSpellCheckerLanaguagePref) {
147cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            showChooseLanguageDialog();
148cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            return true;
149cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        }
150cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        return false;
151cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka    }
152cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka
153cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka    @Override
154cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka    public void onRadioButtonClicked(final SpellCheckerPreference pref) {
155cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        final SpellCheckerInfo sci = pref.getSpellCheckerInfo();
156cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        final boolean isSystemApp =
157cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                (sci.getServiceInfo().applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
158cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        if (isSystemApp) {
159cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            changeCurrentSpellChecker(sci);
160cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        } else {
161cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            showSecurityWarnDialog(pref);
162cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        }
163cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka    }
164cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka
165cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka    private static int convertSubtypeIndexToDialogItemId(final int index) { return index + 1; }
166cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka    private static int convertDialogItemIdToSubtypeIndex(final int item) { return item - 1; }
167cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka
168cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka    private void showChooseLanguageDialog() {
169cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        if (mDialog != null && mDialog.isShowing()) {
170cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            mDialog.dismiss();
171cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        }
172cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        final SpellCheckerInfo currentSci = mTsm.getCurrentSpellChecker();
173cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        final SpellCheckerSubtype currentScs = mTsm.getCurrentSpellCheckerSubtype(
174cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                false /* allowImplicitlySelectedSubtype */);
175cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
176cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        builder.setTitle(R.string.phone_language);
177cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        final int subtypeCount = currentSci.getSubtypeCount();
178cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        final CharSequence[] items = new CharSequence[subtypeCount + 1 /* default */ ];
179cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        items[ITEM_ID_USE_SYSTEM_LANGUAGE] = getSpellCheckerSubtypeLabel(currentSci, null);
180cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        int checkedItemId = ITEM_ID_USE_SYSTEM_LANGUAGE;
181cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        for (int index = 0; index < subtypeCount; ++index) {
182cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            final SpellCheckerSubtype subtype = currentSci.getSubtypeAt(index);
183cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            final int itemId = convertSubtypeIndexToDialogItemId(index);
184cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            items[itemId] = getSpellCheckerSubtypeLabel(currentSci, subtype);
185cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            if (subtype.equals(currentScs)) {
186cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                checkedItemId = itemId;
187cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            }
188cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        }
189cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        builder.setSingleChoiceItems(items, checkedItemId, new AlertDialog.OnClickListener() {
190cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            @Override
191cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka            public void onClick(final DialogInterface dialog, final int item) {
192cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                if (item == ITEM_ID_USE_SYSTEM_LANGUAGE) {
193cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                    mTsm.setSpellCheckerSubtype(null);
19447f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka                } else {
195cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                    final int index = convertDialogItemIdToSubtypeIndex(item);
196cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                    mTsm.setSpellCheckerSubtype(currentSci.getSubtypeAt(index));
197cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                }
198cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                if (DBG) {
199cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                    final SpellCheckerSubtype subtype = mTsm.getCurrentSpellCheckerSubtype(
200cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                            true /* allowImplicitlySelectedSubtype */);
201cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                    Log.d(TAG, "Current spell check locale is "
202cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                            + subtype == null ? "null" : subtype.getLocale());
20347f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka                }
204cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                dialog.dismiss();
205cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                updatePreferenceScreen();
206a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok            }
207cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        });
208cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        mDialog = builder.create();
209cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        mDialog.show();
210a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok    }
211a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok
212cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka    private void showSecurityWarnDialog(final SpellCheckerPreference pref) {
213a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok        if (mDialog != null && mDialog.isShowing()) {
214a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok            mDialog.dismiss();
215a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok        }
216cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        final SpellCheckerInfo sci = pref.getSpellCheckerInfo();
21747f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
21847f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka        builder.setTitle(android.R.string.dialog_alert_title);
219cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        builder.setMessage(getString(R.string.spellchecker_security_warning, pref.getTitle()));
22047f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka        builder.setCancelable(true);
22147f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka        builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
22247f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka            @Override
22347f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka            public void onClick(final DialogInterface dialog, final int which) {
224cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka                changeCurrentSpellChecker(sci);
22547f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka            }
22647f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka        });
22747f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka        builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
22847f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka            @Override
22947f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka            public void onClick(final DialogInterface dialog, final int which) {
23047f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka            }
23147f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka        });
23247f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka        mDialog = builder.create();
233a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok        mDialog.show();
234a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok    }
235a43dd3962eaf9df8cbd7c8fcf8dab96fcb428b91satok
236cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka    private void changeCurrentSpellChecker(final SpellCheckerInfo sci) {
237cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        mTsm.setCurrentSpellChecker(sci);
238ef283b41b09aaca9e1f5005133ecf317e37a4959satok        if (DBG) {
23947f6f81b729f828914c807aa015e260d57b34ae8Tadashi G. Takaoka            Log.d(TAG, "Current spell check is " + mTsm.getCurrentSpellChecker().getId());
240ef283b41b09aaca9e1f5005133ecf317e37a4959satok        }
241cd6fdead7c7a42f4a18a37523bb4feef230559c0Tadashi G. Takaoka        updatePreferenceScreen();
242e077d2b607032fb66a4a046aa4b46945d32d281esatok    }
243e077d2b607032fb66a4a046aa4b46945d32d281esatok}
244