Merge "Spell checker settings updates" into nyc-dev
This commit is contained in:
@@ -7197,6 +7197,12 @@
|
|||||||
<item>@*android:string/gigabyteShort</item>
|
<item>@*android:string/gigabyteShort</item>
|
||||||
</string-array>
|
</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 -->
|
<!-- Notification log debug tool: missing title -->
|
||||||
<string name="notification_log_no_title">(none)</string>
|
<string name="notification_log_no_title">(none)</string>
|
||||||
<!-- Notification log debug tool: delimiter between header and field data -->
|
<!-- Notification log debug tool: delimiter between header and field data -->
|
||||||
|
@@ -16,20 +16,20 @@
|
|||||||
|
|
||||||
package com.android.settings.inputmethod;
|
package com.android.settings.inputmethod;
|
||||||
|
|
||||||
|
import android.app.AlertDialog.Builder;
|
||||||
import android.content.ActivityNotFoundException;
|
import android.content.ActivityNotFoundException;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.support.v7.preference.Preference;
|
import android.support.v7.preference.ListPreference;
|
||||||
import android.support.v7.preference.PreferenceViewHolder;
|
import android.support.v7.preference.PreferenceViewHolder;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.View.OnClickListener;
|
import android.view.View.OnClickListener;
|
||||||
import android.view.textservice.SpellCheckerInfo;
|
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.R;
|
||||||
import com.android.settings.Utils;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Spell checker service preference.
|
* 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
|
* 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.
|
* icon on the right side is used to invoke the setting activity of the spell checker service.
|
||||||
*/
|
*/
|
||||||
class SpellCheckerPreference extends Preference implements OnClickListener {
|
class SpellCheckerPreference extends CustomListPreference {
|
||||||
interface OnRadioButtonPreferenceListener {
|
|
||||||
/**
|
private final SpellCheckerInfo[] mScis;
|
||||||
* Called when this preference needs to be saved its state.
|
private Intent mIntent;
|
||||||
*
|
|
||||||
* Note that this preference is non-persistent and needs explicitly to be saved its state.
|
public SpellCheckerPreference(final Context context, final SpellCheckerInfo[] scis) {
|
||||||
* Because changing one IME state may change other IMEs' state, this is a place to update
|
super(context, null);
|
||||||
* other IMEs' state as well.
|
mScis = scis;
|
||||||
*
|
setWidgetLayoutResource(R.layout.preference_widget_settings);
|
||||||
* @param pref This preference.
|
CharSequence[] labels = new CharSequence[scis.length];
|
||||||
*/
|
CharSequence[] values = new CharSequence[scis.length];
|
||||||
public void onRadioButtonClicked(SpellCheckerPreference pref);
|
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;
|
@Override
|
||||||
private final OnRadioButtonPreferenceListener mOnRadioButtonListener;
|
protected void onPrepareDialogBuilder(Builder builder,
|
||||||
|
DialogInterface.OnClickListener listener) {
|
||||||
|
builder.setTitle(R.string.choose_spell_checker);
|
||||||
|
builder.setSingleChoiceItems(getEntries(), findIndexOfValue(getValue()), listener);
|
||||||
|
}
|
||||||
|
|
||||||
private RadioButton mRadioButton;
|
public void setSelected(SpellCheckerInfo currentSci) {
|
||||||
private View mPrefLeftButton;
|
if (currentSci == null) {
|
||||||
private View mSettingsButton;
|
setValue(null);
|
||||||
private boolean mSelected;
|
return;
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
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
|
@Override
|
||||||
public void onBindViewHolder(PreferenceViewHolder view) {
|
public void onBindViewHolder(PreferenceViewHolder view) {
|
||||||
super.onBindViewHolder(view);
|
super.onBindViewHolder(view);
|
||||||
mRadioButton = (RadioButton)view.findViewById(R.id.pref_radio);
|
View settingsButton = view.findViewById(R.id.settings_button);
|
||||||
mPrefLeftButton = view.findViewById(R.id.pref_left_button);
|
settingsButton.setVisibility(mIntent != null ? View.VISIBLE : View.INVISIBLE);
|
||||||
mPrefLeftButton.setOnClickListener(this);
|
settingsButton.setOnClickListener(new OnClickListener() {
|
||||||
mSettingsButton = view.findViewById(R.id.pref_right_button);
|
@Override
|
||||||
mSettingsButton.setOnClickListener(this);
|
public void onClick(View v) {
|
||||||
updateSelectedState(mSelected);
|
onSettingsButtonClicked();
|
||||||
}
|
}
|
||||||
|
});
|
||||||
@Override
|
|
||||||
public void onClick(final View v) {
|
|
||||||
if (v == mPrefLeftButton) {
|
|
||||||
mOnRadioButtonListener.onRadioButtonClicked(this);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (v == mSettingsButton) {
|
|
||||||
onSettingsButtonClicked();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onSettingsButtonClicked() {
|
private void onSettingsButtonClicked() {
|
||||||
final Context context = getContext();
|
final Context context = getContext();
|
||||||
try {
|
try {
|
||||||
final Intent intent = getIntent();
|
final Intent intent = mIntent;
|
||||||
if (intent != null) {
|
if (intent != null) {
|
||||||
// Invoke a settings activity of an spell checker.
|
// Invoke a settings activity of an spell checker.
|
||||||
context.startActivity(intent);
|
context.startActivity(intent);
|
||||||
}
|
}
|
||||||
} catch (final ActivityNotFoundException e) {
|
} 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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -22,6 +22,7 @@ import android.content.DialogInterface;
|
|||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v7.preference.Preference;
|
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.Preference.OnPreferenceClickListener;
|
||||||
import android.support.v7.preference.PreferenceScreen;
|
import android.support.v7.preference.PreferenceScreen;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -34,13 +35,11 @@ import com.android.internal.logging.MetricsProto.MetricsEvent;
|
|||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.SettingsActivity;
|
import com.android.settings.SettingsActivity;
|
||||||
import com.android.settings.SettingsPreferenceFragment;
|
import com.android.settings.SettingsPreferenceFragment;
|
||||||
import com.android.settings.inputmethod.SpellCheckerPreference.OnRadioButtonPreferenceListener;
|
|
||||||
import com.android.settings.widget.SwitchBar;
|
import com.android.settings.widget.SwitchBar;
|
||||||
import com.android.settings.widget.SwitchBar.OnSwitchChangeListener;
|
import com.android.settings.widget.SwitchBar.OnSwitchChangeListener;
|
||||||
|
|
||||||
public class SpellCheckersSettings extends SettingsPreferenceFragment
|
public class SpellCheckersSettings extends SettingsPreferenceFragment
|
||||||
implements OnSwitchChangeListener, OnPreferenceClickListener,
|
implements OnSwitchChangeListener, OnPreferenceClickListener, OnPreferenceChangeListener {
|
||||||
OnRadioButtonPreferenceListener {
|
|
||||||
private static final String TAG = SpellCheckersSettings.class.getSimpleName();
|
private static final String TAG = SpellCheckersSettings.class.getSimpleName();
|
||||||
private static final boolean DBG = false;
|
private static final boolean DBG = false;
|
||||||
|
|
||||||
@@ -77,13 +76,16 @@ public class SpellCheckersSettings extends SettingsPreferenceFragment
|
|||||||
final PreferenceScreen screen = getPreferenceScreen();
|
final PreferenceScreen screen = getPreferenceScreen();
|
||||||
final Context context = getActivity();
|
final Context context = getActivity();
|
||||||
final int count = (mEnabledScis == null) ? 0 : mEnabledScis.length;
|
final int count = (mEnabledScis == null) ? 0 : mEnabledScis.length;
|
||||||
|
|
||||||
for (int index = 0; index < count; ++index) {
|
for (int index = 0; index < count; ++index) {
|
||||||
final SpellCheckerInfo sci = mEnabledScis[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
|
@Override
|
||||||
@@ -123,8 +125,7 @@ public class SpellCheckersSettings extends SettingsPreferenceFragment
|
|||||||
preference.setEnabled(isSpellCheckerEnabled);
|
preference.setEnabled(isSpellCheckerEnabled);
|
||||||
if (preference instanceof SpellCheckerPreference) {
|
if (preference instanceof SpellCheckerPreference) {
|
||||||
final SpellCheckerPreference pref = (SpellCheckerPreference)preference;
|
final SpellCheckerPreference pref = (SpellCheckerPreference)preference;
|
||||||
final SpellCheckerInfo sci = pref.getSpellCheckerInfo();
|
pref.setSelected(mCurrentSci);
|
||||||
pref.setSelected(mCurrentSci != null && mCurrentSci.getId().equals(sci.getId()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -151,14 +152,16 @@ public class SpellCheckersSettings extends SettingsPreferenceFragment
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onRadioButtonClicked(final SpellCheckerPreference pref) {
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
final SpellCheckerInfo sci = pref.getSpellCheckerInfo();
|
final SpellCheckerInfo sci = (SpellCheckerInfo) newValue;
|
||||||
final boolean isSystemApp =
|
final boolean isSystemApp =
|
||||||
(sci.getServiceInfo().applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
|
(sci.getServiceInfo().applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
|
||||||
if (isSystemApp) {
|
if (isSystemApp) {
|
||||||
changeCurrentSpellChecker(sci);
|
changeCurrentSpellChecker(sci);
|
||||||
|
return true;
|
||||||
} else {
|
} else {
|
||||||
showSecurityWarnDialog(pref);
|
showSecurityWarnDialog(sci);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -209,14 +212,14 @@ public class SpellCheckersSettings extends SettingsPreferenceFragment
|
|||||||
mDialog.show();
|
mDialog.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showSecurityWarnDialog(final SpellCheckerPreference pref) {
|
private void showSecurityWarnDialog(final SpellCheckerInfo sci) {
|
||||||
if (mDialog != null && mDialog.isShowing()) {
|
if (mDialog != null && mDialog.isShowing()) {
|
||||||
mDialog.dismiss();
|
mDialog.dismiss();
|
||||||
}
|
}
|
||||||
final SpellCheckerInfo sci = pref.getSpellCheckerInfo();
|
|
||||||
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||||
builder.setTitle(android.R.string.dialog_alert_title);
|
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.setCancelable(true);
|
||||||
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
|
Reference in New Issue
Block a user