• 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.inputmethodcommon;
18 
19 import android.content.Context;
20 import android.content.Intent;
21 import android.graphics.drawable.Drawable;
22 import android.preference.Preference;
23 import android.preference.Preference.OnPreferenceClickListener;
24 import android.preference.PreferenceScreen;
25 import android.provider.Settings;
26 import android.text.TextUtils;
27 import android.view.inputmethod.InputMethodInfo;
28 import android.view.inputmethod.InputMethodManager;
29 import android.view.inputmethod.InputMethodSubtype;
30 
31 import java.util.List;
32 
33 /* package private */ class InputMethodSettingsImpl implements InputMethodSettingsInterface {
34     private Preference mSubtypeEnablerPreference;
35     private int mInputMethodSettingsCategoryTitleRes;
36     private CharSequence mInputMethodSettingsCategoryTitle;
37     private int mSubtypeEnablerTitleRes;
38     private CharSequence mSubtypeEnablerTitle;
39     private int mSubtypeEnablerIconRes;
40     private Drawable mSubtypeEnablerIcon;
41     private InputMethodManager mImm;
42     private InputMethodInfo mImi;
43     private Context mContext;
44 
45     /**
46      * Initialize internal states of this object.
47      * @param context the context for this application.
48      * @param prefScreen a PreferenceScreen of PreferenceActivity or PreferenceFragment.
49      * @return true if this application is an IME and has two or more subtypes, false otherwise.
50      */
init(final Context context, final PreferenceScreen prefScreen)51     public boolean init(final Context context, final PreferenceScreen prefScreen) {
52         mContext = context;
53         mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
54         mImi = getMyImi(context, mImm);
55         if (mImi == null || mImi.getSubtypeCount() <= 1) {
56             return false;
57         }
58         mSubtypeEnablerPreference = new Preference(context);
59         mSubtypeEnablerPreference
60                 .setOnPreferenceClickListener(new OnPreferenceClickListener() {
61                     @Override
62                     public boolean onPreferenceClick(Preference preference) {
63                         final CharSequence title = getSubtypeEnablerTitle(context);
64                         final Intent intent =
65                                 new Intent(Settings.ACTION_INPUT_METHOD_SUBTYPE_SETTINGS);
66                         intent.putExtra(Settings.EXTRA_INPUT_METHOD_ID, mImi.getId());
67                         if (!TextUtils.isEmpty(title)) {
68                             intent.putExtra(Intent.EXTRA_TITLE, title);
69                         }
70                         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
71                                 | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
72                                 | Intent.FLAG_ACTIVITY_CLEAR_TOP);
73                         context.startActivity(intent);
74                         return true;
75                     }
76                 });
77         prefScreen.addPreference(mSubtypeEnablerPreference);
78         updateSubtypeEnabler();
79         return true;
80     }
81 
getMyImi(Context context, InputMethodManager imm)82     private static InputMethodInfo getMyImi(Context context, InputMethodManager imm) {
83         final List<InputMethodInfo> imis = imm.getInputMethodList();
84         for (int i = 0; i < imis.size(); ++i) {
85             final InputMethodInfo imi = imis.get(i);
86             if (imis.get(i).getPackageName().equals(context.getPackageName())) {
87                 return imi;
88             }
89         }
90         return null;
91     }
92 
getEnabledSubtypesLabel( Context context, InputMethodManager imm, InputMethodInfo imi)93     private static String getEnabledSubtypesLabel(
94             Context context, InputMethodManager imm, InputMethodInfo imi) {
95         if (context == null || imm == null || imi == null) return null;
96         final List<InputMethodSubtype> subtypes = imm.getEnabledInputMethodSubtypeList(imi, true);
97         final StringBuilder sb = new StringBuilder();
98         final int N = subtypes.size();
99         for (int i = 0; i < N; ++i) {
100             final InputMethodSubtype subtype = subtypes.get(i);
101             if (sb.length() > 0) {
102                 sb.append(", ");
103             }
104             sb.append(subtype.getDisplayName(context, imi.getPackageName(),
105                     imi.getServiceInfo().applicationInfo));
106         }
107         return sb.toString();
108     }
109     /**
110      * {@inheritDoc}
111      */
112     @Override
setInputMethodSettingsCategoryTitle(int resId)113     public void setInputMethodSettingsCategoryTitle(int resId) {
114         mInputMethodSettingsCategoryTitleRes = resId;
115         updateSubtypeEnabler();
116     }
117 
118     /**
119      * {@inheritDoc}
120      */
121     @Override
setInputMethodSettingsCategoryTitle(CharSequence title)122     public void setInputMethodSettingsCategoryTitle(CharSequence title) {
123         mInputMethodSettingsCategoryTitleRes = 0;
124         mInputMethodSettingsCategoryTitle = title;
125         updateSubtypeEnabler();
126     }
127 
128     /**
129      * {@inheritDoc}
130      */
131     @Override
setSubtypeEnablerTitle(int resId)132     public void setSubtypeEnablerTitle(int resId) {
133         mSubtypeEnablerTitleRes = resId;
134         updateSubtypeEnabler();
135     }
136 
137     /**
138      * {@inheritDoc}
139      */
140     @Override
setSubtypeEnablerTitle(CharSequence title)141     public void setSubtypeEnablerTitle(CharSequence title) {
142         mSubtypeEnablerTitleRes = 0;
143         mSubtypeEnablerTitle = title;
144         updateSubtypeEnabler();
145     }
146 
147     /**
148      * {@inheritDoc}
149      */
150     @Override
setSubtypeEnablerIcon(int resId)151     public void setSubtypeEnablerIcon(int resId) {
152         mSubtypeEnablerIconRes = resId;
153         updateSubtypeEnabler();
154     }
155 
156     /**
157      * {@inheritDoc}
158      */
159     @Override
setSubtypeEnablerIcon(Drawable drawable)160     public void setSubtypeEnablerIcon(Drawable drawable) {
161         mSubtypeEnablerIconRes = 0;
162         mSubtypeEnablerIcon = drawable;
163         updateSubtypeEnabler();
164     }
165 
getSubtypeEnablerTitle(Context context)166     private CharSequence getSubtypeEnablerTitle(Context context) {
167         if (mSubtypeEnablerTitleRes != 0) {
168             return context.getString(mSubtypeEnablerTitleRes);
169         } else {
170             return mSubtypeEnablerTitle;
171         }
172     }
173 
updateSubtypeEnabler()174     public void updateSubtypeEnabler() {
175         if (mSubtypeEnablerPreference != null) {
176             if (mSubtypeEnablerTitleRes != 0) {
177                 mSubtypeEnablerPreference.setTitle(mSubtypeEnablerTitleRes);
178             } else if (!TextUtils.isEmpty(mSubtypeEnablerTitle)) {
179                 mSubtypeEnablerPreference.setTitle(mSubtypeEnablerTitle);
180             }
181             final String summary = getEnabledSubtypesLabel(mContext, mImm, mImi);
182             if (!TextUtils.isEmpty(summary)) {
183                 mSubtypeEnablerPreference.setSummary(summary);
184             }
185             if (mSubtypeEnablerIconRes != 0) {
186                 mSubtypeEnablerPreference.setIcon(mSubtypeEnablerIconRes);
187             } else if (mSubtypeEnablerIcon != null) {
188                 mSubtypeEnablerPreference.setIcon(mSubtypeEnablerIcon);
189             }
190         }
191     }
192 }
193