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; 37e62e6d8731ab1e02c1632ebc011792d07b902af8Satoshi Kataokaimport android.util.Slog; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Xml; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 417eb84256e57ce85bece610e6a01e20fa12e0f3fesatokimport java.util.ArrayList; 42e7c6998e0a953ae55487d4fe122739646f9280aasatokimport java.util.List; 43e7c6998e0a953ae55487d4fe122739646f9280aasatokimport java.util.Map; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is used to specify meta information of an input method. 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class InputMethodInfo implements Parcelable { 49eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn static final String TAG = "InputMethodInfo"; 50ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Service that implements this input method component. 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ResolveInfo mService; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The unique string Id to identify the input method. This is generated 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the input method component. 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String mId; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The input method setting activity's name, used by the system settings to 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * launch the setting activity of this input method. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String mSettingsActivityName; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The resource in the input method's .apk that holds a boolean indicating 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * whether it should be considered the default input method for this 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * system. This is a resource ID instead of the final value so that it 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can change based on the configuration (in particular locale). 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mIsDefaultResId; 757eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 767eb84256e57ce85bece610e6a01e20fa12e0f3fesatok /** 777eb84256e57ce85bece610e6a01e20fa12e0f3fesatok * The array of the subtypes. 787eb84256e57ce85bece610e6a01e20fa12e0f3fesatok */ 797eb84256e57ce85bece610e6a01e20fa12e0f3fesatok private final ArrayList<InputMethodSubtype> mSubtypes = new ArrayList<InputMethodSubtype>(); 807eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 81dbfba8560dda9de810c4265b765d49952519e841satok private boolean mIsAuxIme; 82dbfba8560dda9de810c4265b765d49952519e841satok 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor. 85e7c6998e0a953ae55487d4fe122739646f9280aasatok * 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The Context in which we are parsing the input method. 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param service The ResolveInfo returned from the package manager about 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this input method's component. 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InputMethodInfo(Context context, ResolveInfo service) 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 92e7c6998e0a953ae55487d4fe122739646f9280aasatok this(context, service, null); 93e7c6998e0a953ae55487d4fe122739646f9280aasatok } 94e7c6998e0a953ae55487d4fe122739646f9280aasatok 95e7c6998e0a953ae55487d4fe122739646f9280aasatok /** 96e7c6998e0a953ae55487d4fe122739646f9280aasatok * Constructor. 97e7c6998e0a953ae55487d4fe122739646f9280aasatok * 98e7c6998e0a953ae55487d4fe122739646f9280aasatok * @param context The Context in which we are parsing the input method. 99e7c6998e0a953ae55487d4fe122739646f9280aasatok * @param service The ResolveInfo returned from the package manager about 100e7c6998e0a953ae55487d4fe122739646f9280aasatok * this input method's component. 101e7c6998e0a953ae55487d4fe122739646f9280aasatok * @param additionalSubtypes additional subtypes being added to this InputMethodInfo 102e7c6998e0a953ae55487d4fe122739646f9280aasatok * @hide 103e7c6998e0a953ae55487d4fe122739646f9280aasatok */ 104e7c6998e0a953ae55487d4fe122739646f9280aasatok public InputMethodInfo(Context context, ResolveInfo service, 105e7c6998e0a953ae55487d4fe122739646f9280aasatok Map<String, List<InputMethodSubtype>> additionalSubtypesMap) 106e7c6998e0a953ae55487d4fe122739646f9280aasatok throws XmlPullParserException, IOException { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = service; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceInfo si = service.serviceInfo; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mId = new ComponentName(si.packageName, si.name).flattenToShortString(); 110dbfba8560dda9de810c4265b765d49952519e841satok mIsAuxIme = true; 1117eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageManager pm = context.getPackageManager(); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String settingsActivityComponent = null; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int isDefaultResId = 0; 1157eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlResourceParser parser = null; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser = si.loadXmlMetaData(pm, InputMethod.SERVICE_META_DATA); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser == null) { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new XmlPullParserException("No " 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + InputMethod.SERVICE_META_DATA + " meta-data"); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn Resources res = pm.getResourcesForApplication(si.applicationInfo); 12520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs = Xml.asAttributeSet(parser); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type != XmlPullParser.START_TAG) { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nodeName = parser.getName(); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!"input-method".equals(nodeName)) { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new XmlPullParserException( 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Meta-data does not start with input-method tag"); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn TypedArray sa = res.obtainAttributes(attrs, 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.InputMethod); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project settingsActivityComponent = sa.getString( 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.InputMethod_settingsActivity); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isDefaultResId = sa.getResourceId( 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.InputMethod_isDefault, 0); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 1467eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 1477eb84256e57ce85bece610e6a01e20fa12e0f3fesatok final int depth = parser.getDepth(); 1487eb84256e57ce85bece610e6a01e20fa12e0f3fesatok // Parse all subtypes 1497eb84256e57ce85bece610e6a01e20fa12e0f3fesatok while (((type = parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth) 1507eb84256e57ce85bece610e6a01e20fa12e0f3fesatok && type != XmlPullParser.END_DOCUMENT) { 151ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok if (type == XmlPullParser.START_TAG) { 152ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok nodeName = parser.getName(); 153ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok if (!"subtype".equals(nodeName)) { 154ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok throw new XmlPullParserException( 155ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok "Meta-data in input-method does not start with subtype tag"); 156ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok } 157ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok final TypedArray a = res.obtainAttributes( 158ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok attrs, com.android.internal.R.styleable.InputMethod_Subtype); 159ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok InputMethodSubtype subtype = new InputMethodSubtype( 160ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok a.getResourceId(com.android.internal.R.styleable 161ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok .InputMethod_Subtype_label, 0), 162ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok a.getResourceId(com.android.internal.R.styleable 163ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok .InputMethod_Subtype_icon, 0), 164ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok a.getString(com.android.internal.R.styleable 165ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok .InputMethod_Subtype_imeSubtypeLocale), 1669ef0283bdcd9534cc09ae37eb2b78771b95247b5satok a.getString(com.android.internal.R.styleable 1679ef0283bdcd9534cc09ae37eb2b78771b95247b5satok .InputMethod_Subtype_imeSubtypeMode), 168ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok a.getString(com.android.internal.R.styleable 1694f31353cb3b00c77c9420ef27ec949fd570ede3bsatok .InputMethod_Subtype_imeSubtypeExtraValue), 1704f31353cb3b00c77c9420ef27ec949fd570ede3bsatok a.getBoolean(com.android.internal.R.styleable 171a86f5e448cd6d29340ca6cbe509bc6384bc0d711satok .InputMethod_Subtype_isAuxiliary, false), 172a86f5e448cd6d29340ca6cbe509bc6384bc0d711satok a.getBoolean(com.android.internal.R.styleable 173e62e6d8731ab1e02c1632ebc011792d07b902af8Satoshi Kataoka .InputMethod_Subtype_overridesImplicitlyEnabledSubtype, false), 174e62e6d8731ab1e02c1632ebc011792d07b902af8Satoshi Kataoka a.getInt(com.android.internal.R.styleable 175e62e6d8731ab1e02c1632ebc011792d07b902af8Satoshi Kataoka .InputMethod_Subtype_subtypeId, 0 /* use Arrays.hashCode */) 176e62e6d8731ab1e02c1632ebc011792d07b902af8Satoshi Kataoka ); 177dbfba8560dda9de810c4265b765d49952519e841satok if (!subtype.isAuxiliary()) { 178dbfba8560dda9de810c4265b765d49952519e841satok mIsAuxIme = false; 179dbfba8560dda9de810c4265b765d49952519e841satok } 180ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok mSubtypes.add(subtype); 1817eb84256e57ce85bece610e6a01e20fa12e0f3fesatok } 1827eb84256e57ce85bece610e6a01e20fa12e0f3fesatok } 18320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } catch (NameNotFoundException e) { 18420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn throw new XmlPullParserException( 18520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn "Unable to create context for: " + si.packageName); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser != null) parser.close(); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 189e7c6998e0a953ae55487d4fe122739646f9280aasatok 190dbfba8560dda9de810c4265b765d49952519e841satok if (mSubtypes.size() == 0) { 191dbfba8560dda9de810c4265b765d49952519e841satok mIsAuxIme = false; 192dbfba8560dda9de810c4265b765d49952519e841satok } 193dbfba8560dda9de810c4265b765d49952519e841satok 194e7c6998e0a953ae55487d4fe122739646f9280aasatok if (additionalSubtypesMap != null && additionalSubtypesMap.containsKey(mId)) { 195e7c6998e0a953ae55487d4fe122739646f9280aasatok final List<InputMethodSubtype> additionalSubtypes = additionalSubtypesMap.get(mId); 196e7c6998e0a953ae55487d4fe122739646f9280aasatok final int N = additionalSubtypes.size(); 197e7c6998e0a953ae55487d4fe122739646f9280aasatok for (int i = 0; i < N; ++i) { 198e7c6998e0a953ae55487d4fe122739646f9280aasatok final InputMethodSubtype subtype = additionalSubtypes.get(i); 199e7c6998e0a953ae55487d4fe122739646f9280aasatok if (!mSubtypes.contains(subtype)) { 200e7c6998e0a953ae55487d4fe122739646f9280aasatok mSubtypes.add(subtype); 201e62e6d8731ab1e02c1632ebc011792d07b902af8Satoshi Kataoka } else { 202e62e6d8731ab1e02c1632ebc011792d07b902af8Satoshi Kataoka Slog.w(TAG, "Duplicated subtype definition found: " 203e62e6d8731ab1e02c1632ebc011792d07b902af8Satoshi Kataoka + subtype.getLocale() + ", " + subtype.getMode()); 204e7c6998e0a953ae55487d4fe122739646f9280aasatok } 205e7c6998e0a953ae55487d4fe122739646f9280aasatok } 206e7c6998e0a953ae55487d4fe122739646f9280aasatok } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSettingsActivityName = settingsActivityComponent; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsDefaultResId = isDefaultResId; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputMethodInfo(Parcel source) { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mId = source.readString(); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSettingsActivityName = source.readString(); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsDefaultResId = source.readInt(); 215dbfba8560dda9de810c4265b765d49952519e841satok mIsAuxIme = source.readInt() == 1; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = ResolveInfo.CREATOR.createFromParcel(source); 2177eb84256e57ce85bece610e6a01e20fa12e0f3fesatok source.readTypedList(mSubtypes, InputMethodSubtype.CREATOR); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2197eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Temporary API for creating a built-in input method. 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InputMethodInfo(String packageName, String className, 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence label, String settingsActivity) { 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo ri = new ResolveInfo(); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceInfo si = new ServiceInfo(); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApplicationInfo ai = new ApplicationInfo(); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.packageName = packageName; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.enabled = true; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.applicationInfo = ai; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.enabled = true; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.packageName = packageName; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.name = className; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.exported = true; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.nonLocalizedLabel = label; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ri.serviceInfo = si; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = ri; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mId = new ComponentName(si.packageName, si.name).flattenToShortString(); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSettingsActivityName = settingsActivity; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsDefaultResId = 0; 241dbfba8560dda9de810c4265b765d49952519e841satok mIsAuxIme = false; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2437eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a unique ID for this input method. The ID is generated from 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the package and class name implementing the method. 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getId() { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mId; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2517eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the .apk package that implements this input method. 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageName() { 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.serviceInfo.packageName; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2587eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the class name of the service component that implements 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this input method. 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getServiceName() { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.serviceInfo.name; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 268c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Return the raw information about the Service implementing this 269c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * input method. Do not modify the returned object. 270c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 271c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public ServiceInfo getServiceInfo() { 272c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project return mService.serviceInfo; 273c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 274c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 275c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the component of the service that implements this input 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method. 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ComponentName getComponent() { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new ComponentName(mService.serviceInfo.packageName, 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.serviceInfo.name); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2837eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Load the user-displayed label for this input method. 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pm Supply a PackageManager used to load the input method's 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resources. 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence loadLabel(PackageManager pm) { 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.loadLabel(pm); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2937eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Load the user-displayed icon for this input method. 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pm Supply a PackageManager used to load the input method's 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resources. 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable loadIcon(PackageManager pm) { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.loadIcon(pm); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3037eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the class name of an activity that provides a settings UI for 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the input method. You can launch this activity be starting it with 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an {@link android.content.Intent} whose action is MAIN and with an 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * explicit {@link android.content.ComponentName} 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * composed of {@link #getPackageName} and the class name returned here. 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A null will be returned if there is no settings activity associated 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the input method. 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getSettingsActivity() { 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSettingsActivityName; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3177eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 3187eb84256e57ce85bece610e6a01e20fa12e0f3fesatok /** 319586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa * Return the count of the subtypes of Input Method. 3207eb84256e57ce85bece610e6a01e20fa12e0f3fesatok */ 321586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa public int getSubtypeCount() { 322586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa return mSubtypes.size(); 323586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa } 324586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa 325586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa /** 326586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa * Return the Input Method's subtype at the specified index. 327586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa * 328586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa * @param index the index of the subtype to return. 329586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa */ 330586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa public InputMethodSubtype getSubtypeAt(int index) { 331586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa return mSubtypes.get(index); 3327eb84256e57ce85bece610e6a01e20fa12e0f3fesatok } 3337eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the resource identifier of a resource inside of this input 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method's .apk that determines whether it should be considered a 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * default input method for the system. 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIsDefaultResourceId() { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIsDefaultResId; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3427eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dump(Printer pw, String prefix) { 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "mId=" + mId 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mSettingsActivityName=" + mSettingsActivityName); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "mIsDefaultResId=0x" 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(mIsDefaultResId)); 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "Service:"); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.dump(pw, prefix + " "); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 354eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn return "InputMethodInfo{" + mId 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", settings: " 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mSettingsActivityName + "}"; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to test whether the given parameter object is an 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link InputMethodInfo} and its Id is the same to this one. 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the given parameter object is an 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link InputMethodInfo} and its Id is the same to this one. 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean equals(Object o) { 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (o == this) return true; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (o == null) return false; 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!(o instanceof InputMethodInfo)) return false; 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputMethodInfo obj = (InputMethodInfo) o; 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mId.equals(obj.mId); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 376c50232d517d7b99ae3c3e073f04eb6799c876e8csatok 377c50232d517d7b99ae3c3e073f04eb6799c876e8csatok @Override 378c50232d517d7b99ae3c3e073f04eb6799c876e8csatok public int hashCode() { 379c50232d517d7b99ae3c3e073f04eb6799c876e8csatok return mId.hashCode(); 380c50232d517d7b99ae3c3e073f04eb6799c876e8csatok } 381c50232d517d7b99ae3c3e073f04eb6799c876e8csatok 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 383dbfba8560dda9de810c4265b765d49952519e841satok * @hide 384dbfba8560dda9de810c4265b765d49952519e841satok */ 385dbfba8560dda9de810c4265b765d49952519e841satok public boolean isAuxiliaryIme() { 386dbfba8560dda9de810c4265b765d49952519e841satok return mIsAuxIme; 387dbfba8560dda9de810c4265b765d49952519e841satok } 388dbfba8560dda9de810c4265b765d49952519e841satok 389dbfba8560dda9de810c4265b765d49952519e841satok /** 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to package this object into a {@link Parcel}. 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dest The {@link Parcel} to be written. 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags The flags used for parceling. 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 395dbfba8560dda9de810c4265b765d49952519e841satok @Override 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(mId); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(mSettingsActivityName); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(mIsDefaultResId); 400dbfba8560dda9de810c4265b765d49952519e841satok dest.writeInt(mIsAuxIme ? 1 : 0); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.writeToParcel(dest, flags); 4027eb84256e57ce85bece610e6a01e20fa12e0f3fesatok dest.writeTypedList(mSubtypes); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to make this class parcelable. 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4087eb84256e57ce85bece610e6a01e20fa12e0f3fesatok public static final Parcelable.Creator<InputMethodInfo> CREATOR 4097eb84256e57ce85bece610e6a01e20fa12e0f3fesatok = new Parcelable.Creator<InputMethodInfo>() { 410dbfba8560dda9de810c4265b765d49952519e841satok @Override 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InputMethodInfo createFromParcel(Parcel source) { 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new InputMethodInfo(source); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 415dbfba8560dda9de810c4265b765d49952519e841satok @Override 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InputMethodInfo[] newArray(int size) { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new InputMethodInfo[size]; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 421dbfba8560dda9de810c4265b765d49952519e841satok @Override 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 426