Merge "Spell checker settings updates" into nyc-dev

This commit is contained in:
Jason Monk
2016-02-24 14:53:15 +00:00
committed by Android (Google) Code Review
3 changed files with 95 additions and 109 deletions

View File

@@ -7197,6 +7197,12 @@
<item>@*android:string/gigabyteShort</item>
</string-array>
<!-- [CHAR LIMIT=30] Label for setting to control the default spell checker -->
<string name="default_spell_checker">Default spell checker</string>
<!-- [CHAR LIMIT=30] Title for dialog for setting to control the default spell checker -->
<string name="choose_spell_checker">Choose spell checker</string>
<!-- Notification log debug tool: missing title -->
<string name="notification_log_no_title">(none)</string>
<!-- Notification log debug tool: delimiter between header and field data -->

View File

@@ -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);
}
}
}
}

View File

@@ -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