19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007-2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * use this file except in compliance with the License. You may obtain a copy of 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * License for the specific language governing permissions and limitations under 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view.inputmethod; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 26e7c6998e0a953ae55487d4fe122739646f9280aasatokimport android.content.pm.PackageManager.NameNotFoundException; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ResolveInfo; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ServiceInfo; 2920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackbornimport android.content.res.Resources; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.XmlResourceParser; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Xml; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 407eb84256e57ce85bece610e6a01e20fa12e0f3fesatokimport java.util.ArrayList; 41e7c6998e0a953ae55487d4fe122739646f9280aasatokimport java.util.List; 42e7c6998e0a953ae55487d4fe122739646f9280aasatokimport java.util.Map; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is used to specify meta information of an input method. 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class InputMethodInfo implements Parcelable { 48eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn static final String TAG = "InputMethodInfo"; 49ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Service that implements this input method component. 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ResolveInfo mService; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The unique string Id to identify the input method. This is generated 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the input method component. 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String mId; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The input method setting activity's name, used by the system settings to 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * launch the setting activity of this input method. 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String mSettingsActivityName; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The resource in the input method's .apk that holds a boolean indicating 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * whether it should be considered the default input method for this 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * system. This is a resource ID instead of the final value so that it 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can change based on the configuration (in particular locale). 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mIsDefaultResId; 747eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 757eb84256e57ce85bece610e6a01e20fa12e0f3fesatok /** 767eb84256e57ce85bece610e6a01e20fa12e0f3fesatok * The array of the subtypes. 777eb84256e57ce85bece610e6a01e20fa12e0f3fesatok */ 787eb84256e57ce85bece610e6a01e20fa12e0f3fesatok private final ArrayList<InputMethodSubtype> mSubtypes = new ArrayList<InputMethodSubtype>(); 797eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 80dbfba8560dda9de810c4265b765d49952519e841satok private boolean mIsAuxIme; 81dbfba8560dda9de810c4265b765d49952519e841satok 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor. 84e7c6998e0a953ae55487d4fe122739646f9280aasatok * 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The Context in which we are parsing the input method. 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param service The ResolveInfo returned from the package manager about 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this input method's component. 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InputMethodInfo(Context context, ResolveInfo service) 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 91e7c6998e0a953ae55487d4fe122739646f9280aasatok this(context, service, null); 92e7c6998e0a953ae55487d4fe122739646f9280aasatok } 93e7c6998e0a953ae55487d4fe122739646f9280aasatok 94e7c6998e0a953ae55487d4fe122739646f9280aasatok /** 95e7c6998e0a953ae55487d4fe122739646f9280aasatok * Constructor. 96e7c6998e0a953ae55487d4fe122739646f9280aasatok * 97e7c6998e0a953ae55487d4fe122739646f9280aasatok * @param context The Context in which we are parsing the input method. 98e7c6998e0a953ae55487d4fe122739646f9280aasatok * @param service The ResolveInfo returned from the package manager about 99e7c6998e0a953ae55487d4fe122739646f9280aasatok * this input method's component. 100e7c6998e0a953ae55487d4fe122739646f9280aasatok * @param additionalSubtypes additional subtypes being added to this InputMethodInfo 101e7c6998e0a953ae55487d4fe122739646f9280aasatok * @hide 102e7c6998e0a953ae55487d4fe122739646f9280aasatok */ 103e7c6998e0a953ae55487d4fe122739646f9280aasatok public InputMethodInfo(Context context, ResolveInfo service, 104e7c6998e0a953ae55487d4fe122739646f9280aasatok Map<String, List<InputMethodSubtype>> additionalSubtypesMap) 105e7c6998e0a953ae55487d4fe122739646f9280aasatok throws XmlPullParserException, IOException { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = service; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceInfo si = service.serviceInfo; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mId = new ComponentName(si.packageName, si.name).flattenToShortString(); 109dbfba8560dda9de810c4265b765d49952519e841satok mIsAuxIme = true; 1107eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageManager pm = context.getPackageManager(); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String settingsActivityComponent = null; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int isDefaultResId = 0; 1147eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlResourceParser parser = null; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser = si.loadXmlMetaData(pm, InputMethod.SERVICE_META_DATA); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser == null) { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new XmlPullParserException("No " 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + InputMethod.SERVICE_META_DATA + " meta-data"); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn Resources res = pm.getResourcesForApplication(si.applicationInfo); 12420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs = Xml.asAttributeSet(parser); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type != XmlPullParser.START_TAG) { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nodeName = parser.getName(); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!"input-method".equals(nodeName)) { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new XmlPullParserException( 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Meta-data does not start with input-method tag"); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn TypedArray sa = res.obtainAttributes(attrs, 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.InputMethod); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project settingsActivityComponent = sa.getString( 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.InputMethod_settingsActivity); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isDefaultResId = sa.getResourceId( 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.InputMethod_isDefault, 0); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 1457eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 1467eb84256e57ce85bece610e6a01e20fa12e0f3fesatok final int depth = parser.getDepth(); 1477eb84256e57ce85bece610e6a01e20fa12e0f3fesatok // Parse all subtypes 1487eb84256e57ce85bece610e6a01e20fa12e0f3fesatok while (((type = parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth) 1497eb84256e57ce85bece610e6a01e20fa12e0f3fesatok && type != XmlPullParser.END_DOCUMENT) { 150ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok if (type == XmlPullParser.START_TAG) { 151ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok nodeName = parser.getName(); 152ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok if (!"subtype".equals(nodeName)) { 153ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok throw new XmlPullParserException( 154ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok "Meta-data in input-method does not start with subtype tag"); 155ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok } 156ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok final TypedArray a = res.obtainAttributes( 157ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok attrs, com.android.internal.R.styleable.InputMethod_Subtype); 158ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok InputMethodSubtype subtype = new InputMethodSubtype( 159ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok a.getResourceId(com.android.internal.R.styleable 160ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok .InputMethod_Subtype_label, 0), 161ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok a.getResourceId(com.android.internal.R.styleable 162ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok .InputMethod_Subtype_icon, 0), 163ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok a.getString(com.android.internal.R.styleable 164ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok .InputMethod_Subtype_imeSubtypeLocale), 1659ef0283bdcd9534cc09ae37eb2b78771b95247b5satok a.getString(com.android.internal.R.styleable 1669ef0283bdcd9534cc09ae37eb2b78771b95247b5satok .InputMethod_Subtype_imeSubtypeMode), 167ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok a.getString(com.android.internal.R.styleable 1684f31353cb3b00c77c9420ef27ec949fd570ede3bsatok .InputMethod_Subtype_imeSubtypeExtraValue), 1694f31353cb3b00c77c9420ef27ec949fd570ede3bsatok a.getBoolean(com.android.internal.R.styleable 170a86f5e448cd6d29340ca6cbe509bc6384bc0d711satok .InputMethod_Subtype_isAuxiliary, false), 171a86f5e448cd6d29340ca6cbe509bc6384bc0d711satok a.getBoolean(com.android.internal.R.styleable 172a86f5e448cd6d29340ca6cbe509bc6384bc0d711satok .InputMethod_Subtype_overridesImplicitlyEnabledSubtype, false)); 173dbfba8560dda9de810c4265b765d49952519e841satok if (!subtype.isAuxiliary()) { 174dbfba8560dda9de810c4265b765d49952519e841satok mIsAuxIme = false; 175dbfba8560dda9de810c4265b765d49952519e841satok } 176ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok mSubtypes.add(subtype); 1777eb84256e57ce85bece610e6a01e20fa12e0f3fesatok } 1787eb84256e57ce85bece610e6a01e20fa12e0f3fesatok } 17920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } catch (NameNotFoundException e) { 18020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn throw new XmlPullParserException( 18120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn "Unable to create context for: " + si.packageName); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser != null) parser.close(); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 185e7c6998e0a953ae55487d4fe122739646f9280aasatok 186dbfba8560dda9de810c4265b765d49952519e841satok if (mSubtypes.size() == 0) { 187dbfba8560dda9de810c4265b765d49952519e841satok mIsAuxIme = false; 188dbfba8560dda9de810c4265b765d49952519e841satok } 189dbfba8560dda9de810c4265b765d49952519e841satok 190e7c6998e0a953ae55487d4fe122739646f9280aasatok if (additionalSubtypesMap != null && additionalSubtypesMap.containsKey(mId)) { 191e7c6998e0a953ae55487d4fe122739646f9280aasatok final List<InputMethodSubtype> additionalSubtypes = additionalSubtypesMap.get(mId); 192e7c6998e0a953ae55487d4fe122739646f9280aasatok final int N = additionalSubtypes.size(); 193e7c6998e0a953ae55487d4fe122739646f9280aasatok for (int i = 0; i < N; ++i) { 194e7c6998e0a953ae55487d4fe122739646f9280aasatok final InputMethodSubtype subtype = additionalSubtypes.get(i); 195e7c6998e0a953ae55487d4fe122739646f9280aasatok if (!mSubtypes.contains(subtype)) { 196e7c6998e0a953ae55487d4fe122739646f9280aasatok mSubtypes.add(subtype); 197e7c6998e0a953ae55487d4fe122739646f9280aasatok } 198e7c6998e0a953ae55487d4fe122739646f9280aasatok } 199e7c6998e0a953ae55487d4fe122739646f9280aasatok } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSettingsActivityName = settingsActivityComponent; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsDefaultResId = isDefaultResId; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputMethodInfo(Parcel source) { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mId = source.readString(); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSettingsActivityName = source.readString(); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsDefaultResId = source.readInt(); 208dbfba8560dda9de810c4265b765d49952519e841satok mIsAuxIme = source.readInt() == 1; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = ResolveInfo.CREATOR.createFromParcel(source); 2107eb84256e57ce85bece610e6a01e20fa12e0f3fesatok source.readTypedList(mSubtypes, InputMethodSubtype.CREATOR); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2127eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Temporary API for creating a built-in input method. 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InputMethodInfo(String packageName, String className, 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence label, String settingsActivity) { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo ri = new ResolveInfo(); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceInfo si = new ServiceInfo(); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApplicationInfo ai = new ApplicationInfo(); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.packageName = packageName; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.enabled = true; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.applicationInfo = ai; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.enabled = true; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.packageName = packageName; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.name = className; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.exported = true; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.nonLocalizedLabel = label; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ri.serviceInfo = si; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = ri; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mId = new ComponentName(si.packageName, si.name).flattenToShortString(); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSettingsActivityName = settingsActivity; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsDefaultResId = 0; 234dbfba8560dda9de810c4265b765d49952519e841satok mIsAuxIme = false; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2367eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a unique ID for this input method. The ID is generated from 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the package and class name implementing the method. 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getId() { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mId; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2447eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the .apk package that implements this input method. 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageName() { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.serviceInfo.packageName; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2517eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the class name of the service component that implements 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this input method. 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getServiceName() { 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.serviceInfo.name; 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 261c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Return the raw information about the Service implementing this 262c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * input method. Do not modify the returned object. 263c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 264c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public ServiceInfo getServiceInfo() { 265c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project return mService.serviceInfo; 266c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 267c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 268c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the component of the service that implements this input 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method. 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ComponentName getComponent() { 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new ComponentName(mService.serviceInfo.packageName, 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.serviceInfo.name); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2767eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Load the user-displayed label for this input method. 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pm Supply a PackageManager used to load the input method's 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resources. 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence loadLabel(PackageManager pm) { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.loadLabel(pm); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2867eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Load the user-displayed icon for this input method. 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pm Supply a PackageManager used to load the input method's 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resources. 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable loadIcon(PackageManager pm) { 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.loadIcon(pm); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2967eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the class name of an activity that provides a settings UI for 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the input method. You can launch this activity be starting it with 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an {@link android.content.Intent} whose action is MAIN and with an 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * explicit {@link android.content.ComponentName} 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * composed of {@link #getPackageName} and the class name returned here. 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A null will be returned if there is no settings activity associated 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the input method. 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getSettingsActivity() { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSettingsActivityName; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3107eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 3117eb84256e57ce85bece610e6a01e20fa12e0f3fesatok /** 312586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa * Return the count of the subtypes of Input Method. 3137eb84256e57ce85bece610e6a01e20fa12e0f3fesatok */ 314586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa public int getSubtypeCount() { 315586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa return mSubtypes.size(); 316586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa } 317586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa 318586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa /** 319586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa * Return the Input Method's subtype at the specified index. 320586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa * 321586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa * @param index the index of the subtype to return. 322586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa */ 323586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa public InputMethodSubtype getSubtypeAt(int index) { 324586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa return mSubtypes.get(index); 3257eb84256e57ce85bece610e6a01e20fa12e0f3fesatok } 3267eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the resource identifier of a resource inside of this input 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method's .apk that determines whether it should be considered a 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * default input method for the system. 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIsDefaultResourceId() { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIsDefaultResId; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3357eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dump(Printer pw, String prefix) { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "mId=" + mId 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mSettingsActivityName=" + mSettingsActivityName); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "mIsDefaultResId=0x" 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(mIsDefaultResId)); 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "Service:"); 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.dump(pw, prefix + " "); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 347eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn return "InputMethodInfo{" + mId 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", settings: " 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mSettingsActivityName + "}"; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to test whether the given parameter object is an 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link InputMethodInfo} and its Id is the same to this one. 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the given parameter object is an 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link InputMethodInfo} and its Id is the same to this one. 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean equals(Object o) { 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (o == this) return true; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (o == null) return false; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!(o instanceof InputMethodInfo)) return false; 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputMethodInfo obj = (InputMethodInfo) o; 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mId.equals(obj.mId); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 369c50232d517d7b99ae3c3e073f04eb6799c876e8csatok 370c50232d517d7b99ae3c3e073f04eb6799c876e8csatok @Override 371c50232d517d7b99ae3c3e073f04eb6799c876e8csatok public int hashCode() { 372c50232d517d7b99ae3c3e073f04eb6799c876e8csatok return mId.hashCode(); 373c50232d517d7b99ae3c3e073f04eb6799c876e8csatok } 374c50232d517d7b99ae3c3e073f04eb6799c876e8csatok 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 376dbfba8560dda9de810c4265b765d49952519e841satok * @hide 377dbfba8560dda9de810c4265b765d49952519e841satok */ 378dbfba8560dda9de810c4265b765d49952519e841satok public boolean isAuxiliaryIme() { 379dbfba8560dda9de810c4265b765d49952519e841satok return mIsAuxIme; 380dbfba8560dda9de810c4265b765d49952519e841satok } 381dbfba8560dda9de810c4265b765d49952519e841satok 382dbfba8560dda9de810c4265b765d49952519e841satok /** 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to package this object into a {@link Parcel}. 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dest The {@link Parcel} to be written. 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags The flags used for parceling. 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 388dbfba8560dda9de810c4265b765d49952519e841satok @Override 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(mId); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(mSettingsActivityName); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(mIsDefaultResId); 393dbfba8560dda9de810c4265b765d49952519e841satok dest.writeInt(mIsAuxIme ? 1 : 0); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.writeToParcel(dest, flags); 3957eb84256e57ce85bece610e6a01e20fa12e0f3fesatok dest.writeTypedList(mSubtypes); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to make this class parcelable. 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4017eb84256e57ce85bece610e6a01e20fa12e0f3fesatok public static final Parcelable.Creator<InputMethodInfo> CREATOR 4027eb84256e57ce85bece610e6a01e20fa12e0f3fesatok = new Parcelable.Creator<InputMethodInfo>() { 403dbfba8560dda9de810c4265b765d49952519e841satok @Override 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InputMethodInfo createFromParcel(Parcel source) { 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new InputMethodInfo(source); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 408dbfba8560dda9de810c4265b765d49952519e841satok @Override 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InputMethodInfo[] newArray(int size) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new InputMethodInfo[size]; 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 414dbfba8560dda9de810c4265b765d49952519e841satok @Override 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 419