• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.inputmethod;
18 
19 import com.android.settings.R;
20 import com.android.settings.SettingsPreferenceFragment;
21 
22 import android.app.AlertDialog;
23 import android.content.Context;
24 import android.content.DialogInterface;
25 import android.content.pm.ApplicationInfo;
26 import android.content.pm.PackageManager;
27 import android.os.Bundle;
28 import android.preference.Preference;
29 import android.preference.PreferenceScreen;
30 import android.util.Log;
31 import android.view.textservice.SpellCheckerInfo;
32 import android.view.textservice.TextServicesManager;
33 
34 import java.util.ArrayList;
35 
36 public class SpellCheckersSettings extends SettingsPreferenceFragment
37         implements Preference.OnPreferenceClickListener {
38     private static final String TAG = SpellCheckersSettings.class.getSimpleName();
39     private static final boolean DBG = false;
40 
41     private AlertDialog mDialog = null;
42     private SpellCheckerInfo mCurrentSci;
43     private SpellCheckerInfo[] mEnabledScis;
44     private TextServicesManager mTsm;
45     private final ArrayList<SingleSpellCheckerPreference> mSpellCheckers =
46             new ArrayList<SingleSpellCheckerPreference>();
47 
48     @Override
onCreate(Bundle icicle)49     public void onCreate(Bundle icicle) {
50         super.onCreate(icicle);
51         mTsm = (TextServicesManager) getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
52         addPreferencesFromResource(R.xml.spellchecker_prefs);
53         updateScreen();
54     }
55 
56     @Override
onPreferenceTreeClick(PreferenceScreen screen, Preference preference)57     public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
58         return false;
59     }
60 
61     @Override
onResume()62     public void onResume() {
63         super.onResume();
64         updateScreen();
65     }
66 
67     @Override
onPause()68     public void onPause() {
69         super.onPause();
70         saveState();
71     }
72 
saveState()73     private void saveState() {
74         SpellCheckerUtils.setCurrentSpellChecker(mTsm, mCurrentSci);
75     }
76 
updateScreen()77     private void updateScreen() {
78         getPreferenceScreen().removeAll();
79         updateEnabledSpellCheckers();
80     }
81 
updateEnabledSpellCheckers()82     private void updateEnabledSpellCheckers() {
83         final PackageManager pm = getPackageManager();
84         mCurrentSci = SpellCheckerUtils.getCurrentSpellChecker(mTsm);
85         mEnabledScis = SpellCheckerUtils.getEnabledSpellCheckers(mTsm);
86         if (mCurrentSci == null || mEnabledScis == null) {
87             return;
88         }
89         mSpellCheckers.clear();
90         for (int i = 0; i < mEnabledScis.length; ++i) {
91             final SpellCheckerInfo sci = mEnabledScis[i];
92             final SingleSpellCheckerPreference scPref = new SingleSpellCheckerPreference(
93                     this, null, sci, mTsm);
94             mSpellCheckers.add(scPref);
95             scPref.setTitle(sci.loadLabel(pm));
96             scPref.setSelected(mCurrentSci != null && mCurrentSci.getId().equals(sci.getId()));
97             getPreferenceScreen().addPreference(scPref);
98         }
99     }
100 
101     @Override
onPreferenceClick(Preference pref)102     public boolean onPreferenceClick(Preference pref) {
103         SingleSpellCheckerPreference targetScp = null;
104         for (SingleSpellCheckerPreference scp : mSpellCheckers) {
105             if (pref.equals(scp)) {
106                 targetScp = scp;
107             }
108         }
109         if (targetScp != null) {
110             if (!isSystemApp(targetScp.getSpellCheckerInfo())) {
111                 showSecurityWarnDialog(targetScp);
112             } else {
113                 changeCurrentSpellChecker(targetScp);
114             }
115         }
116         return true;
117     }
118 
showSecurityWarnDialog(final SingleSpellCheckerPreference scp)119     private void showSecurityWarnDialog(final SingleSpellCheckerPreference scp) {
120         if (mDialog != null && mDialog.isShowing()) {
121             mDialog.dismiss();
122         }
123         mDialog = (new AlertDialog.Builder(getActivity()))
124                 .setTitle(android.R.string.dialog_alert_title)
125                 .setIcon(android.R.drawable.ic_dialog_alert)
126                 .setCancelable(true)
127                 .setPositiveButton(android.R.string.ok,
128                         new DialogInterface.OnClickListener() {
129                     @Override
130                     public void onClick(DialogInterface dialog, int which) {
131                         changeCurrentSpellChecker(scp);
132                     }
133                 })
134                 .setNegativeButton(android.R.string.cancel,
135                         new DialogInterface.OnClickListener() {
136                     @Override
137                     public void onClick(DialogInterface dialog, int which) {
138                     }
139                 })
140                 .create();
141         mDialog.setMessage(getResources().getString(R.string.spellchecker_security_warning,
142                 scp.getSpellCheckerInfo().getServiceInfo().applicationInfo.loadLabel(
143                         getActivity().getPackageManager())));
144         mDialog.show();
145     }
146 
changeCurrentSpellChecker(SingleSpellCheckerPreference scp)147     private void changeCurrentSpellChecker(SingleSpellCheckerPreference scp) {
148         mTsm.setCurrentSpellChecker(scp.getSpellCheckerInfo());
149         if (DBG) {
150             Log.d(TAG, "Current spell check is "
151                         + SpellCheckerUtils.getCurrentSpellChecker(mTsm).getId());
152         }
153         updateScreen();
154     }
155 
isSystemApp(SpellCheckerInfo sci)156     private static boolean isSystemApp(SpellCheckerInfo sci) {
157         return (sci.getServiceInfo().applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
158     }
159 }
160