diff --git a/res/values/strings.xml b/res/values/strings.xml index 98d78c0d134..5538a11c865 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7197,6 +7197,12 @@ @*android:string/gigabyteShort + + Default spell checker + + + Choose spell checker + (none) diff --git a/src/com/android/settings/inputmethod/SpellCheckerPreference.java b/src/com/android/settings/inputmethod/SpellCheckerPreference.java index daa26fb708a..c730bcc01d7 100644 --- a/src/com/android/settings/inputmethod/SpellCheckerPreference.java +++ b/src/com/android/settings/inputmethod/SpellCheckerPreference.java @@ -16,20 +16,20 @@ package com.android.settings.inputmethod; +import android.app.AlertDialog.Builder; import android.content.ActivityNotFoundException; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; -import android.support.v7.preference.Preference; +import android.support.v7.preference.ListPreference; import android.support.v7.preference.PreferenceViewHolder; import android.text.TextUtils; import android.view.View; import android.view.View.OnClickListener; import android.view.textservice.SpellCheckerInfo; -import android.widget.RadioButton; -import android.widget.Toast; +import com.android.settings.CustomListPreference; import com.android.settings.R; -import com.android.settings.Utils; /** * Spell checker service preference. @@ -38,115 +38,92 @@ import com.android.settings.Utils; * button on the left side is used to choose the current spell checker service. 2) A settings * icon on the right side is used to invoke the setting activity of the spell checker service. */ -class SpellCheckerPreference extends Preference implements OnClickListener { - interface OnRadioButtonPreferenceListener { - /** - * Called when this preference needs to be saved its state. - * - * Note that this preference is non-persistent and needs explicitly to be saved its state. - * Because changing one IME state may change other IMEs' state, this is a place to update - * other IMEs' state as well. - * - * @param pref This preference. - */ - public void onRadioButtonClicked(SpellCheckerPreference pref); +class SpellCheckerPreference extends CustomListPreference { + + private final SpellCheckerInfo[] mScis; + private Intent mIntent; + + public SpellCheckerPreference(final Context context, final SpellCheckerInfo[] scis) { + super(context, null); + mScis = scis; + setWidgetLayoutResource(R.layout.preference_widget_settings); + CharSequence[] labels = new CharSequence[scis.length]; + CharSequence[] values = new CharSequence[scis.length]; + for (int i = 0 ; i < scis.length; i++) { + labels[i] = scis[i].loadLabel(context.getPackageManager()); + // Use values as indexing since ListPreference doesn't support generic objects. + values[i] = String.valueOf(i); + } + setEntries(labels); + setEntryValues(values); } - private final SpellCheckerInfo mSci; - private final OnRadioButtonPreferenceListener mOnRadioButtonListener; + @Override + protected void onPrepareDialogBuilder(Builder builder, + DialogInterface.OnClickListener listener) { + builder.setTitle(R.string.choose_spell_checker); + builder.setSingleChoiceItems(getEntries(), findIndexOfValue(getValue()), listener); + } - private RadioButton mRadioButton; - private View mPrefLeftButton; - private View mSettingsButton; - private boolean mSelected; - - public SpellCheckerPreference(final Context context, final SpellCheckerInfo sci, - final OnRadioButtonPreferenceListener onRadioButtonListener) { - super(context, null, 0); - setPersistent(false); - setLayoutResource(R.layout.preference_spellchecker); - setWidgetLayoutResource(R.layout.preference_spellchecker_widget); - mSci = sci; - mOnRadioButtonListener = onRadioButtonListener; - setKey(sci.getId()); - setTitle(sci.loadLabel(context.getPackageManager())); - final String settingsActivity = mSci.getSettingsActivity(); - if (TextUtils.isEmpty(settingsActivity)) { - setIntent(null); - } else { - final Intent intent = new Intent(Intent.ACTION_MAIN); - intent.setClassName(mSci.getPackageName(), settingsActivity); - setIntent(intent); + public void setSelected(SpellCheckerInfo currentSci) { + if (currentSci == null) { + setValue(null); + return; } + for (int i = 0; i < mScis.length; i++) { + if (mScis[i].getId().equals(currentSci.getId())) { + setValueIndex(i); + return; + } + } + } + + @Override + public void setValue(String value) { + super.setValue(value); + int index = value != null ? Integer.parseInt(value) : -1; + if (index == -1) { + mIntent = null; + return; + } + SpellCheckerInfo sci = mScis[index]; + final String settingsActivity = sci.getSettingsActivity(); + if (TextUtils.isEmpty(settingsActivity)) { + mIntent = null; + } else { + mIntent = new Intent(Intent.ACTION_MAIN); + mIntent.setClassName(sci.getPackageName(), settingsActivity); + } + } + + @Override + public boolean callChangeListener(Object newValue) { + newValue = newValue != null ? mScis[Integer.parseInt((String) newValue)] : null; + return super.callChangeListener(newValue); } @Override public void onBindViewHolder(PreferenceViewHolder view) { super.onBindViewHolder(view); - mRadioButton = (RadioButton)view.findViewById(R.id.pref_radio); - mPrefLeftButton = view.findViewById(R.id.pref_left_button); - mPrefLeftButton.setOnClickListener(this); - mSettingsButton = view.findViewById(R.id.pref_right_button); - mSettingsButton.setOnClickListener(this); - updateSelectedState(mSelected); - } - - @Override - public void onClick(final View v) { - if (v == mPrefLeftButton) { - mOnRadioButtonListener.onRadioButtonClicked(this); - return; - } - if (v == mSettingsButton) { - onSettingsButtonClicked(); - return; - } + View settingsButton = view.findViewById(R.id.settings_button); + settingsButton.setVisibility(mIntent != null ? View.VISIBLE : View.INVISIBLE); + settingsButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + onSettingsButtonClicked(); + } + }); } private void onSettingsButtonClicked() { final Context context = getContext(); try { - final Intent intent = getIntent(); + final Intent intent = mIntent; if (intent != null) { // Invoke a settings activity of an spell checker. context.startActivity(intent); } } catch (final ActivityNotFoundException e) { - final String message = context.getString(R.string.failed_to_open_app_settings_toast, - mSci.loadLabel(context.getPackageManager())); - Toast.makeText(context, message, Toast.LENGTH_LONG).show(); - } - } - - public SpellCheckerInfo getSpellCheckerInfo() { - return mSci; - } - - public void setSelected(final boolean selected) { - mSelected = selected; - updateSelectedState(selected); - } - - private void updateSelectedState(final boolean selected) { - if (mRadioButton != null) { - mRadioButton.setChecked(selected); - enableSettingsButton(isEnabled() && selected); - } - } - - private void enableSettingsButton(final boolean enabled) { - if (mSettingsButton == null) { - return; - } - if (getIntent() == null) { - mSettingsButton.setVisibility(View.GONE); - } else { - mSettingsButton.setEnabled(enabled); - mSettingsButton.setClickable(enabled); - mSettingsButton.setFocusable(enabled); - if (!enabled) { - mSettingsButton.setAlpha(Utils.DISABLED_ALPHA); - } } } } diff --git a/src/com/android/settings/inputmethod/SpellCheckersSettings.java b/src/com/android/settings/inputmethod/SpellCheckersSettings.java index abece21796e..ad6a17b867f 100644 --- a/src/com/android/settings/inputmethod/SpellCheckersSettings.java +++ b/src/com/android/settings/inputmethod/SpellCheckersSettings.java @@ -22,6 +22,7 @@ import android.content.DialogInterface; import android.content.pm.ApplicationInfo; import android.os.Bundle; import android.support.v7.preference.Preference; +import android.support.v7.preference.Preference.OnPreferenceChangeListener; import android.support.v7.preference.Preference.OnPreferenceClickListener; import android.support.v7.preference.PreferenceScreen; import android.util.Log; @@ -34,13 +35,11 @@ import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.SettingsPreferenceFragment; -import com.android.settings.inputmethod.SpellCheckerPreference.OnRadioButtonPreferenceListener; import com.android.settings.widget.SwitchBar; import com.android.settings.widget.SwitchBar.OnSwitchChangeListener; public class SpellCheckersSettings extends SettingsPreferenceFragment - implements OnSwitchChangeListener, OnPreferenceClickListener, - OnRadioButtonPreferenceListener { + implements OnSwitchChangeListener, OnPreferenceClickListener, OnPreferenceChangeListener { private static final String TAG = SpellCheckersSettings.class.getSimpleName(); private static final boolean DBG = false; @@ -77,13 +76,16 @@ public class SpellCheckersSettings extends SettingsPreferenceFragment final PreferenceScreen screen = getPreferenceScreen(); final Context context = getActivity(); final int count = (mEnabledScis == null) ? 0 : mEnabledScis.length; + for (int index = 0; index < count; ++index) { final SpellCheckerInfo sci = mEnabledScis[index]; - final SpellCheckerPreference pref = new SpellCheckerPreference(getPrefContext(), sci, - this); - screen.addPreference(pref); - InputMethodAndSubtypeUtil.removeUnnecessaryNonPersistentPreference(pref); } + final SpellCheckerPreference pref = new SpellCheckerPreference(getPrefContext(), + mEnabledScis); + pref.setTitle(R.string.default_spell_checker); + pref.setSummary("%s"); + pref.setOnPreferenceChangeListener(this); + screen.addPreference(pref); } @Override @@ -123,8 +125,7 @@ public class SpellCheckersSettings extends SettingsPreferenceFragment preference.setEnabled(isSpellCheckerEnabled); if (preference instanceof SpellCheckerPreference) { final SpellCheckerPreference pref = (SpellCheckerPreference)preference; - final SpellCheckerInfo sci = pref.getSpellCheckerInfo(); - pref.setSelected(mCurrentSci != null && mCurrentSci.getId().equals(sci.getId())); + pref.setSelected(mCurrentSci); } } } @@ -151,14 +152,16 @@ public class SpellCheckersSettings extends SettingsPreferenceFragment } @Override - public void onRadioButtonClicked(final SpellCheckerPreference pref) { - final SpellCheckerInfo sci = pref.getSpellCheckerInfo(); + public boolean onPreferenceChange(Preference preference, Object newValue) { + final SpellCheckerInfo sci = (SpellCheckerInfo) newValue; final boolean isSystemApp = (sci.getServiceInfo().applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; if (isSystemApp) { changeCurrentSpellChecker(sci); + return true; } else { - showSecurityWarnDialog(pref); + showSecurityWarnDialog(sci); + return false; } } @@ -209,14 +212,14 @@ public class SpellCheckersSettings extends SettingsPreferenceFragment mDialog.show(); } - private void showSecurityWarnDialog(final SpellCheckerPreference pref) { + private void showSecurityWarnDialog(final SpellCheckerInfo sci) { if (mDialog != null && mDialog.isShowing()) { mDialog.dismiss(); } - final SpellCheckerInfo sci = pref.getSpellCheckerInfo(); final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(android.R.string.dialog_alert_title); - builder.setMessage(getString(R.string.spellchecker_security_warning, pref.getTitle())); + builder.setMessage(getString(R.string.spellchecker_security_warning, + sci.loadLabel(getPackageManager()))); builder.setCancelable(true); builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override