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