121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok/* 221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * Copyright (C) 2011 The Android Open Source Project 321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * 421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * Licensed under the Apache License, Version 2.0 (the "License"); 521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * you may not use this file except in compliance with the License. 621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * You may obtain a copy of the License at 721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * 821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * http://www.apache.org/licenses/LICENSE-2.0 921f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * 1021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * Unless required by applicable law or agreed to in writing, software 1121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * distributed under the License is distributed on an "AS IS" BASIS, 1221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * See the License for the specific language governing permissions and 1421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * limitations under the License. 1521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok */ 16c9a877174c6ba3552c1a6e396509f8d08049a3f6satok 1721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokpackage com.android.inputmethodcommon; 1821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok 1921f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport android.content.Context; 207e44cbb2e86854abe3cf61adbef92363c98bebbasatokimport android.content.Intent; 2121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport android.graphics.drawable.Drawable; 2221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport android.preference.Preference; 2321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport android.preference.Preference.OnPreferenceClickListener; 2421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport android.preference.PreferenceScreen; 2521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport android.provider.Settings; 2621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport android.text.TextUtils; 2721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport android.view.inputmethod.InputMethodInfo; 2821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport android.view.inputmethod.InputMethodManager; 29f3320979f6d3b63686f15cedae65bba144643e25satokimport android.view.inputmethod.InputMethodSubtype; 3021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok 3121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport java.util.List; 3221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok 33c9a877174c6ba3552c1a6e396509f8d08049a3f6satok/* package private */ class InputMethodSettingsImpl implements InputMethodSettingsInterface { 3421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok private Preference mSubtypeEnablerPreference; 3521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok private int mInputMethodSettingsCategoryTitleRes; 3621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok private CharSequence mInputMethodSettingsCategoryTitle; 3721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok private int mSubtypeEnablerTitleRes; 3821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok private CharSequence mSubtypeEnablerTitle; 3921f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok private int mSubtypeEnablerIconRes; 4021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok private Drawable mSubtypeEnablerIcon; 41f3320979f6d3b63686f15cedae65bba144643e25satok private InputMethodManager mImm; 42f3320979f6d3b63686f15cedae65bba144643e25satok private InputMethodInfo mImi; 43f3320979f6d3b63686f15cedae65bba144643e25satok private Context mContext; 4421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok 45c9a877174c6ba3552c1a6e396509f8d08049a3f6satok /** 46c9a877174c6ba3552c1a6e396509f8d08049a3f6satok * Initialize internal states of this object. 47c9a877174c6ba3552c1a6e396509f8d08049a3f6satok * @param context the context for this application. 48c9a877174c6ba3552c1a6e396509f8d08049a3f6satok * @param prefScreen a PreferenceScreen of PreferenceActivity or PreferenceFragment. 49c9a877174c6ba3552c1a6e396509f8d08049a3f6satok * @return true if this application is an IME and has two or more subtypes, false otherwise. 50c9a877174c6ba3552c1a6e396509f8d08049a3f6satok */ 51c9a877174c6ba3552c1a6e396509f8d08049a3f6satok public boolean init(final Context context, final PreferenceScreen prefScreen) { 52f3320979f6d3b63686f15cedae65bba144643e25satok mContext = context; 53f3320979f6d3b63686f15cedae65bba144643e25satok mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 54f3320979f6d3b63686f15cedae65bba144643e25satok mImi = getMyImi(context, mImm); 55f3320979f6d3b63686f15cedae65bba144643e25satok if (mImi == null || mImi.getSubtypeCount() <= 1) { 56c9a877174c6ba3552c1a6e396509f8d08049a3f6satok return false; 5721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok } 58c9a877174c6ba3552c1a6e396509f8d08049a3f6satok mSubtypeEnablerPreference = new Preference(context); 59c9a877174c6ba3552c1a6e396509f8d08049a3f6satok mSubtypeEnablerPreference 60c9a877174c6ba3552c1a6e396509f8d08049a3f6satok .setOnPreferenceClickListener(new OnPreferenceClickListener() { 61c9a877174c6ba3552c1a6e396509f8d08049a3f6satok @Override 62c9a877174c6ba3552c1a6e396509f8d08049a3f6satok public boolean onPreferenceClick(Preference preference) { 63010474f42b9b60af32f3f7ca0d34d34642f10f60satok final CharSequence title = getSubtypeEnablerTitle(context); 64c9a877174c6ba3552c1a6e396509f8d08049a3f6satok final Intent intent = 65c9a877174c6ba3552c1a6e396509f8d08049a3f6satok new Intent(Settings.ACTION_INPUT_METHOD_SUBTYPE_SETTINGS); 66f3320979f6d3b63686f15cedae65bba144643e25satok intent.putExtra(Settings.EXTRA_INPUT_METHOD_ID, mImi.getId()); 67010474f42b9b60af32f3f7ca0d34d34642f10f60satok if (!TextUtils.isEmpty(title)) { 68010474f42b9b60af32f3f7ca0d34d34642f10f60satok intent.putExtra(Intent.EXTRA_TITLE, title); 69010474f42b9b60af32f3f7ca0d34d34642f10f60satok } 70c9a877174c6ba3552c1a6e396509f8d08049a3f6satok intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 71c9a877174c6ba3552c1a6e396509f8d08049a3f6satok | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 72c9a877174c6ba3552c1a6e396509f8d08049a3f6satok | Intent.FLAG_ACTIVITY_CLEAR_TOP); 73c9a877174c6ba3552c1a6e396509f8d08049a3f6satok context.startActivity(intent); 74c9a877174c6ba3552c1a6e396509f8d08049a3f6satok return true; 75c9a877174c6ba3552c1a6e396509f8d08049a3f6satok } 76c9a877174c6ba3552c1a6e396509f8d08049a3f6satok }); 779ce9a5482a8bcf542c5e81f50d385f707e7085d1satok prefScreen.addPreference(mSubtypeEnablerPreference); 7821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok updateSubtypeEnabler(); 79c9a877174c6ba3552c1a6e396509f8d08049a3f6satok return true; 8021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok } 8121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok 82c9a877174c6ba3552c1a6e396509f8d08049a3f6satok private static InputMethodInfo getMyImi(Context context, InputMethodManager imm) { 8321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok final List<InputMethodInfo> imis = imm.getInputMethodList(); 8421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok for (int i = 0; i < imis.size(); ++i) { 8521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok final InputMethodInfo imi = imis.get(i); 86c9a877174c6ba3552c1a6e396509f8d08049a3f6satok if (imis.get(i).getPackageName().equals(context.getPackageName())) { 8721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok return imi; 8821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok } 8921f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok } 9021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok return null; 9121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok } 9221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok 93f3320979f6d3b63686f15cedae65bba144643e25satok private static String getEnabledSubtypesLabel( 94f3320979f6d3b63686f15cedae65bba144643e25satok Context context, InputMethodManager imm, InputMethodInfo imi) { 95f3320979f6d3b63686f15cedae65bba144643e25satok if (context == null || imm == null || imi == null) return null; 96f3320979f6d3b63686f15cedae65bba144643e25satok final List<InputMethodSubtype> subtypes = imm.getEnabledInputMethodSubtypeList(imi, true); 97f3320979f6d3b63686f15cedae65bba144643e25satok final StringBuilder sb = new StringBuilder(); 98f3320979f6d3b63686f15cedae65bba144643e25satok final int N = subtypes.size(); 99f3320979f6d3b63686f15cedae65bba144643e25satok for (int i = 0; i < N; ++i) { 100f3320979f6d3b63686f15cedae65bba144643e25satok final InputMethodSubtype subtype = subtypes.get(i); 101f3320979f6d3b63686f15cedae65bba144643e25satok if (sb.length() > 0) { 102f3320979f6d3b63686f15cedae65bba144643e25satok sb.append(", "); 103f3320979f6d3b63686f15cedae65bba144643e25satok } 104f3320979f6d3b63686f15cedae65bba144643e25satok sb.append(subtype.getDisplayName(context, imi.getPackageName(), 105f3320979f6d3b63686f15cedae65bba144643e25satok imi.getServiceInfo().applicationInfo)); 106f3320979f6d3b63686f15cedae65bba144643e25satok } 107f3320979f6d3b63686f15cedae65bba144643e25satok return sb.toString(); 108f3320979f6d3b63686f15cedae65bba144643e25satok } 10921f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok /** 110c9a877174c6ba3552c1a6e396509f8d08049a3f6satok * {@inheritDoc} 11121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok */ 112c9a877174c6ba3552c1a6e396509f8d08049a3f6satok @Override 11321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok public void setInputMethodSettingsCategoryTitle(int resId) { 11421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok mInputMethodSettingsCategoryTitleRes = resId; 11521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok updateSubtypeEnabler(); 11621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok } 11721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok 11821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok /** 119c9a877174c6ba3552c1a6e396509f8d08049a3f6satok * {@inheritDoc} 12021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok */ 121c9a877174c6ba3552c1a6e396509f8d08049a3f6satok @Override 12221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok public void setInputMethodSettingsCategoryTitle(CharSequence title) { 12321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok mInputMethodSettingsCategoryTitleRes = 0; 12421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok mInputMethodSettingsCategoryTitle = title; 12521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok updateSubtypeEnabler(); 12621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok } 12721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok 12821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok /** 129c9a877174c6ba3552c1a6e396509f8d08049a3f6satok * {@inheritDoc} 13021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok */ 131c9a877174c6ba3552c1a6e396509f8d08049a3f6satok @Override 13221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok public void setSubtypeEnablerTitle(int resId) { 13321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok mSubtypeEnablerTitleRes = resId; 13421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok updateSubtypeEnabler(); 13521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok } 13621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok 13721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok /** 138c9a877174c6ba3552c1a6e396509f8d08049a3f6satok * {@inheritDoc} 13921f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok */ 140c9a877174c6ba3552c1a6e396509f8d08049a3f6satok @Override 14121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok public void setSubtypeEnablerTitle(CharSequence title) { 14221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok mSubtypeEnablerTitleRes = 0; 14321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok mSubtypeEnablerTitle = title; 14421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok updateSubtypeEnabler(); 14521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok } 14621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok 14721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok /** 148c9a877174c6ba3552c1a6e396509f8d08049a3f6satok * {@inheritDoc} 14921f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok */ 150c9a877174c6ba3552c1a6e396509f8d08049a3f6satok @Override 15121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok public void setSubtypeEnablerIcon(int resId) { 15221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok mSubtypeEnablerIconRes = resId; 15321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok updateSubtypeEnabler(); 15421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok } 15521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok 15621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok /** 157c9a877174c6ba3552c1a6e396509f8d08049a3f6satok * {@inheritDoc} 15821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok */ 159c9a877174c6ba3552c1a6e396509f8d08049a3f6satok @Override 16021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok public void setSubtypeEnablerIcon(Drawable drawable) { 16121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok mSubtypeEnablerIconRes = 0; 16221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok mSubtypeEnablerIcon = drawable; 16321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok updateSubtypeEnabler(); 16421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok } 16521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok 166010474f42b9b60af32f3f7ca0d34d34642f10f60satok private CharSequence getSubtypeEnablerTitle(Context context) { 167010474f42b9b60af32f3f7ca0d34d34642f10f60satok if (mSubtypeEnablerTitleRes != 0) { 168010474f42b9b60af32f3f7ca0d34d34642f10f60satok return context.getString(mSubtypeEnablerTitleRes); 169010474f42b9b60af32f3f7ca0d34d34642f10f60satok } else { 170010474f42b9b60af32f3f7ca0d34d34642f10f60satok return mSubtypeEnablerTitle; 171010474f42b9b60af32f3f7ca0d34d34642f10f60satok } 172010474f42b9b60af32f3f7ca0d34d34642f10f60satok } 173010474f42b9b60af32f3f7ca0d34d34642f10f60satok 174f3320979f6d3b63686f15cedae65bba144643e25satok public void updateSubtypeEnabler() { 17521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok if (mSubtypeEnablerPreference != null) { 17621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok if (mSubtypeEnablerTitleRes != 0) { 17721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok mSubtypeEnablerPreference.setTitle(mSubtypeEnablerTitleRes); 17821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok } else if (!TextUtils.isEmpty(mSubtypeEnablerTitle)) { 17921f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok mSubtypeEnablerPreference.setTitle(mSubtypeEnablerTitle); 18021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok } 181f3320979f6d3b63686f15cedae65bba144643e25satok final String summary = getEnabledSubtypesLabel(mContext, mImm, mImi); 182f3320979f6d3b63686f15cedae65bba144643e25satok if (!TextUtils.isEmpty(summary)) { 183f3320979f6d3b63686f15cedae65bba144643e25satok mSubtypeEnablerPreference.setSummary(summary); 18421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok } 18521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok if (mSubtypeEnablerIconRes != 0) { 18621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok mSubtypeEnablerPreference.setIcon(mSubtypeEnablerIconRes); 18721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok } else if (mSubtypeEnablerIcon != null) { 18821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok mSubtypeEnablerPreference.setIcon(mSubtypeEnablerIcon); 18921f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok } 19021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok } 19121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok } 19221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok} 193