Reorganize spell checkers settings
Bug: 15976603 Bug: 16115751 Change-Id: I3b23d7f01d8d39da27215a5263b12304ac64db0f
This commit is contained in:
@@ -20,104 +20,201 @@ import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Bundle;
|
||||
import android.preference.Preference;
|
||||
import android.preference.Preference.OnPreferenceClickListener;
|
||||
import android.preference.PreferenceScreen;
|
||||
import android.util.Log;
|
||||
import android.view.textservice.SpellCheckerInfo;
|
||||
import android.view.textservice.SpellCheckerSubtype;
|
||||
import android.view.textservice.TextServicesManager;
|
||||
import android.widget.Switch;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SettingsActivity;
|
||||
import com.android.settings.SettingsPreferenceFragment;
|
||||
|
||||
import java.util.ArrayList;
|
||||
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 Preference.OnPreferenceClickListener {
|
||||
implements OnSwitchChangeListener, OnPreferenceClickListener,
|
||||
OnRadioButtonPreferenceListener {
|
||||
private static final String TAG = SpellCheckersSettings.class.getSimpleName();
|
||||
private static final boolean DBG = false;
|
||||
|
||||
private static final String KEY_SPELL_CHECKER_LANGUAGE = "spellchecker_language";
|
||||
private static final int ITEM_ID_USE_SYSTEM_LANGUAGE = 0;
|
||||
|
||||
private SwitchBar mSwitchBar;
|
||||
private Preference mSpellCheckerLanaguagePref;
|
||||
private AlertDialog mDialog = null;
|
||||
private SpellCheckerInfo mCurrentSci;
|
||||
private SpellCheckerInfo[] mEnabledScis;
|
||||
private TextServicesManager mTsm;
|
||||
private final ArrayList<SingleSpellCheckerPreference> mSpellCheckers = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public void onCreate(final Bundle icicle) {
|
||||
super.onCreate(icicle);
|
||||
mTsm = (TextServicesManager) getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
|
||||
|
||||
addPreferencesFromResource(R.xml.spellchecker_prefs);
|
||||
updateScreen();
|
||||
mSpellCheckerLanaguagePref = findPreference(KEY_SPELL_CHECKER_LANGUAGE);
|
||||
mSpellCheckerLanaguagePref.setOnPreferenceClickListener(this);
|
||||
|
||||
mTsm = (TextServicesManager) getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
|
||||
mCurrentSci = mTsm.getCurrentSpellChecker();
|
||||
mEnabledScis = mTsm.getEnabledSpellCheckers();
|
||||
populatePreferenceScreen();
|
||||
}
|
||||
|
||||
// Override the behavior of {@link PreferenceFragment}.
|
||||
@Override
|
||||
public boolean onPreferenceTreeClick(final PreferenceScreen screen,
|
||||
final Preference preference) {
|
||||
return false;
|
||||
private void populatePreferenceScreen() {
|
||||
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(context, sci, this);
|
||||
screen.addPreference(pref);
|
||||
InputMethodAndSubtypeUtil.removeUnnecessaryNonPersistentPreference(pref);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
updateScreen();
|
||||
mSwitchBar = ((SettingsActivity)getActivity()).getSwitchBar();
|
||||
mSwitchBar.show();
|
||||
mSwitchBar.addOnSwitchChangeListener(this);
|
||||
updatePreferenceScreen();
|
||||
}
|
||||
|
||||
private void updateScreen() {
|
||||
getPreferenceScreen().removeAll();
|
||||
updateEnabledSpellCheckers();
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
mSwitchBar.removeOnSwitchChangeListener(this);
|
||||
}
|
||||
|
||||
private void updateEnabledSpellCheckers() {
|
||||
@Override
|
||||
public void onSwitchChanged(final Switch switchView, final boolean isChecked) {
|
||||
mTsm.setSpellCheckerEnabled(isChecked);
|
||||
updatePreferenceScreen();
|
||||
}
|
||||
|
||||
private void updatePreferenceScreen() {
|
||||
mCurrentSci = mTsm.getCurrentSpellChecker();
|
||||
mEnabledScis = mTsm.getEnabledSpellCheckers();
|
||||
if (mCurrentSci == null || mEnabledScis == null) {
|
||||
return;
|
||||
final boolean isSpellCheckerEnabled = mTsm.isSpellCheckerEnabled();
|
||||
mSwitchBar.setChecked(isSpellCheckerEnabled);
|
||||
|
||||
final SpellCheckerSubtype currentScs = mTsm.getCurrentSpellCheckerSubtype(
|
||||
false /* allowImplicitlySelectedSubtype */);
|
||||
mSpellCheckerLanaguagePref.setSummary(getSpellCheckerSubtypeLabel(mCurrentSci, currentScs));
|
||||
|
||||
final PreferenceScreen screen = getPreferenceScreen();
|
||||
final int count = screen.getPreferenceCount();
|
||||
for (int index = 0; index < count; index++) {
|
||||
final Preference preference = screen.getPreference(index);
|
||||
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()));
|
||||
}
|
||||
}
|
||||
final PackageManager pm = getPackageManager();
|
||||
mSpellCheckers.clear();
|
||||
for (int i = 0; i < mEnabledScis.length; ++i) {
|
||||
final SpellCheckerInfo sci = mEnabledScis[i];
|
||||
final SingleSpellCheckerPreference scPref = new SingleSpellCheckerPreference(
|
||||
this, sci, mTsm);
|
||||
mSpellCheckers.add(scPref);
|
||||
scPref.setTitle(sci.loadLabel(pm));
|
||||
scPref.setSelected(mCurrentSci != null && mCurrentSci.getId().equals(sci.getId()));
|
||||
getPreferenceScreen().addPreference(scPref);
|
||||
}
|
||||
|
||||
private CharSequence getSpellCheckerSubtypeLabel(final SpellCheckerInfo sci,
|
||||
final SpellCheckerSubtype subtype) {
|
||||
if (sci == null) {
|
||||
return null;
|
||||
}
|
||||
if (subtype == null) {
|
||||
return getString(R.string.use_system_language_to_select_input_method_subtypes);
|
||||
}
|
||||
return subtype.getDisplayName(
|
||||
getActivity(), sci.getPackageName(), sci.getServiceInfo().applicationInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPreferenceClick(final Preference pref) {
|
||||
for (final SingleSpellCheckerPreference scp : mSpellCheckers) {
|
||||
if (pref.equals(scp)) {
|
||||
if (isSystemApp(scp.getSpellCheckerInfo())) {
|
||||
changeCurrentSpellChecker(scp);
|
||||
} else {
|
||||
showSecurityWarnDialog(scp);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (pref == mSpellCheckerLanaguagePref) {
|
||||
showChooseLanguageDialog();
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
private void showSecurityWarnDialog(final SingleSpellCheckerPreference scp) {
|
||||
@Override
|
||||
public void onRadioButtonClicked(final SpellCheckerPreference pref) {
|
||||
final SpellCheckerInfo sci = pref.getSpellCheckerInfo();
|
||||
final boolean isSystemApp =
|
||||
(sci.getServiceInfo().applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
|
||||
if (isSystemApp) {
|
||||
changeCurrentSpellChecker(sci);
|
||||
} else {
|
||||
showSecurityWarnDialog(pref);
|
||||
}
|
||||
}
|
||||
|
||||
private static int convertSubtypeIndexToDialogItemId(final int index) { return index + 1; }
|
||||
private static int convertDialogItemIdToSubtypeIndex(final int item) { return item - 1; }
|
||||
|
||||
private void showChooseLanguageDialog() {
|
||||
if (mDialog != null && mDialog.isShowing()) {
|
||||
mDialog.dismiss();
|
||||
}
|
||||
final SpellCheckerInfo currentSci = mTsm.getCurrentSpellChecker();
|
||||
final SpellCheckerSubtype currentScs = mTsm.getCurrentSpellCheckerSubtype(
|
||||
false /* allowImplicitlySelectedSubtype */);
|
||||
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||
builder.setTitle(R.string.phone_language);
|
||||
final int subtypeCount = currentSci.getSubtypeCount();
|
||||
final CharSequence[] items = new CharSequence[subtypeCount + 1 /* default */ ];
|
||||
items[ITEM_ID_USE_SYSTEM_LANGUAGE] = getSpellCheckerSubtypeLabel(currentSci, null);
|
||||
int checkedItemId = ITEM_ID_USE_SYSTEM_LANGUAGE;
|
||||
for (int index = 0; index < subtypeCount; ++index) {
|
||||
final SpellCheckerSubtype subtype = currentSci.getSubtypeAt(index);
|
||||
final int itemId = convertSubtypeIndexToDialogItemId(index);
|
||||
items[itemId] = getSpellCheckerSubtypeLabel(currentSci, subtype);
|
||||
if (subtype.equals(currentScs)) {
|
||||
checkedItemId = itemId;
|
||||
}
|
||||
}
|
||||
builder.setSingleChoiceItems(items, checkedItemId, new AlertDialog.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(final DialogInterface dialog, final int item) {
|
||||
if (item == ITEM_ID_USE_SYSTEM_LANGUAGE) {
|
||||
mTsm.setSpellCheckerSubtype(null);
|
||||
} else {
|
||||
final int index = convertDialogItemIdToSubtypeIndex(item);
|
||||
mTsm.setSpellCheckerSubtype(currentSci.getSubtypeAt(index));
|
||||
}
|
||||
if (DBG) {
|
||||
final SpellCheckerSubtype subtype = mTsm.getCurrentSpellCheckerSubtype(
|
||||
true /* allowImplicitlySelectedSubtype */);
|
||||
Log.d(TAG, "Current spell check locale is "
|
||||
+ subtype == null ? "null" : subtype.getLocale());
|
||||
}
|
||||
dialog.dismiss();
|
||||
updatePreferenceScreen();
|
||||
}
|
||||
});
|
||||
mDialog = builder.create();
|
||||
mDialog.show();
|
||||
}
|
||||
|
||||
private void showSecurityWarnDialog(final SpellCheckerPreference pref) {
|
||||
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);
|
||||
final PackageManager pm = getPackageManager();
|
||||
builder.setMessage(getString(R.string.spellchecker_security_warning,
|
||||
scp.getSpellCheckerInfo().getServiceInfo().applicationInfo.loadLabel(pm)));
|
||||
builder.setMessage(getString(R.string.spellchecker_security_warning, pref.getTitle()));
|
||||
builder.setCancelable(true);
|
||||
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(final DialogInterface dialog, final int which) {
|
||||
changeCurrentSpellChecker(scp);
|
||||
changeCurrentSpellChecker(sci);
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
|
||||
@@ -129,15 +226,11 @@ public class SpellCheckersSettings extends SettingsPreferenceFragment
|
||||
mDialog.show();
|
||||
}
|
||||
|
||||
private void changeCurrentSpellChecker(final SingleSpellCheckerPreference scp) {
|
||||
mTsm.setCurrentSpellChecker(scp.getSpellCheckerInfo());
|
||||
private void changeCurrentSpellChecker(final SpellCheckerInfo sci) {
|
||||
mTsm.setCurrentSpellChecker(sci);
|
||||
if (DBG) {
|
||||
Log.d(TAG, "Current spell check is " + mTsm.getCurrentSpellChecker().getId());
|
||||
}
|
||||
updateScreen();
|
||||
}
|
||||
|
||||
private static boolean isSystemApp(final SpellCheckerInfo sci) {
|
||||
return (sci.getServiceInfo().applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
|
||||
updatePreferenceScreen();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user