| /* |
| * Copyright (C) 2011 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.settings.inputmethod; |
| |
| import com.android.settings.R; |
| import com.android.settings.SettingsPreferenceFragment; |
| |
| 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.PreferenceScreen; |
| import android.util.Log; |
| import android.view.textservice.SpellCheckerInfo; |
| import android.view.textservice.TextServicesManager; |
| |
| import java.util.ArrayList; |
| |
| public class SpellCheckersSettings extends SettingsPreferenceFragment |
| implements Preference.OnPreferenceClickListener { |
| private static final String TAG = SpellCheckersSettings.class.getSimpleName(); |
| private static final boolean DBG = false; |
| |
| private AlertDialog mDialog = null; |
| private SpellCheckerInfo mCurrentSci; |
| private SpellCheckerInfo[] mEnabledScis; |
| private TextServicesManager mTsm; |
| private final ArrayList<SingleSpellCheckerPreference> mSpellCheckers = |
| new ArrayList<SingleSpellCheckerPreference>(); |
| |
| @Override |
| public void onCreate(Bundle icicle) { |
| super.onCreate(icicle); |
| mTsm = (TextServicesManager) getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE); |
| addPreferencesFromResource(R.xml.spellchecker_prefs); |
| updateScreen(); |
| } |
| |
| @Override |
| public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { |
| return false; |
| } |
| |
| @Override |
| public void onResume() { |
| super.onResume(); |
| updateScreen(); |
| } |
| |
| @Override |
| public void onPause() { |
| super.onPause(); |
| saveState(); |
| } |
| |
| private void saveState() { |
| SpellCheckerUtils.setCurrentSpellChecker(mTsm, mCurrentSci); |
| } |
| |
| private void updateScreen() { |
| getPreferenceScreen().removeAll(); |
| updateEnabledSpellCheckers(); |
| } |
| |
| private void updateEnabledSpellCheckers() { |
| final PackageManager pm = getPackageManager(); |
| mCurrentSci = SpellCheckerUtils.getCurrentSpellChecker(mTsm); |
| mEnabledScis = SpellCheckerUtils.getEnabledSpellCheckers(mTsm); |
| if (mCurrentSci == null || mEnabledScis == null) { |
| return; |
| } |
| mSpellCheckers.clear(); |
| for (int i = 0; i < mEnabledScis.length; ++i) { |
| final SpellCheckerInfo sci = mEnabledScis[i]; |
| final SingleSpellCheckerPreference scPref = new SingleSpellCheckerPreference( |
| this, null, sci, mTsm); |
| mSpellCheckers.add(scPref); |
| scPref.setTitle(sci.loadLabel(pm)); |
| scPref.setSelected(mCurrentSci != null && mCurrentSci.getId().equals(sci.getId())); |
| getPreferenceScreen().addPreference(scPref); |
| } |
| } |
| |
| @Override |
| public boolean onPreferenceClick(Preference pref) { |
| SingleSpellCheckerPreference targetScp = null; |
| for (SingleSpellCheckerPreference scp : mSpellCheckers) { |
| if (pref.equals(scp)) { |
| targetScp = scp; |
| } |
| } |
| if (targetScp != null) { |
| if (!isSystemApp(targetScp.getSpellCheckerInfo())) { |
| showSecurityWarnDialog(targetScp); |
| } else { |
| changeCurrentSpellChecker(targetScp); |
| } |
| } |
| return true; |
| } |
| |
| private void showSecurityWarnDialog(final SingleSpellCheckerPreference scp) { |
| if (mDialog != null && mDialog.isShowing()) { |
| mDialog.dismiss(); |
| } |
| mDialog = (new AlertDialog.Builder(getActivity())) |
| .setTitle(android.R.string.dialog_alert_title) |
| .setIcon(android.R.drawable.ic_dialog_alert) |
| .setCancelable(true) |
| .setPositiveButton(android.R.string.ok, |
| new DialogInterface.OnClickListener() { |
| @Override |
| public void onClick(DialogInterface dialog, int which) { |
| changeCurrentSpellChecker(scp); |
| } |
| }) |
| .setNegativeButton(android.R.string.cancel, |
| new DialogInterface.OnClickListener() { |
| @Override |
| public void onClick(DialogInterface dialog, int which) { |
| } |
| }) |
| .create(); |
| mDialog.setMessage(getResources().getString(R.string.spellchecker_security_warning, |
| scp.getSpellCheckerInfo().getServiceInfo().applicationInfo.loadLabel( |
| getActivity().getPackageManager()))); |
| mDialog.show(); |
| } |
| |
| private void changeCurrentSpellChecker(SingleSpellCheckerPreference scp) { |
| mTsm.setCurrentSpellChecker(scp.getSpellCheckerInfo()); |
| if (DBG) { |
| Log.d(TAG, "Current spell check is " |
| + SpellCheckerUtils.getCurrentSpellChecker(mTsm).getId()); |
| } |
| updateScreen(); |
| } |
| |
| private static boolean isSystemApp(SpellCheckerInfo sci) { |
| return (sci.getServiceInfo().applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; |
| } |
| } |