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; 39dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataokaimport android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 427eb84256e57ce85bece610e6a01e20fa12e0f3fesatokimport java.util.ArrayList; 43e7c6998e0a953ae55487d4fe122739646f9280aasatokimport java.util.List; 44e7c6998e0a953ae55487d4fe122739646f9280aasatokimport java.util.Map; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is used to specify meta information of an input method. 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class InputMethodInfo implements Parcelable { 50eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn static final String TAG = "InputMethodInfo"; 51ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Service that implements this input method component. 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ResolveInfo mService; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The unique string Id to identify the input method. This is generated 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the input method component. 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String mId; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The input method setting activity's name, used by the system settings to 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * launch the setting activity of this input method. 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String mSettingsActivityName; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The resource in the input method's .apk that holds a boolean indicating 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * whether it should be considered the default input method for this 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * system. This is a resource ID instead of the final value so that it 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can change based on the configuration (in particular locale). 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mIsDefaultResId; 767eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 777eb84256e57ce85bece610e6a01e20fa12e0f3fesatok /** 787eb84256e57ce85bece610e6a01e20fa12e0f3fesatok * The array of the subtypes. 797eb84256e57ce85bece610e6a01e20fa12e0f3fesatok */ 807eb84256e57ce85bece610e6a01e20fa12e0f3fesatok private final ArrayList<InputMethodSubtype> mSubtypes = new ArrayList<InputMethodSubtype>(); 817eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 82660e6c96e3133f28b1fe95902674ce34ca1a35ebSatoshi Kataoka private final boolean mIsAuxIme; 83dbfba8560dda9de810c4265b765d49952519e841satok 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8569da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka * Caveat: mForceDefault must be false for production. This flag is only for test. 86f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka */ 87f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka private final boolean mForceDefault; 88f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka 89f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka /** 9069da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka * The flag whether this IME supports ways to switch to a next input method (e.g. globe key.) 9169da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka */ 9269da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka private final boolean mSupportsSwitchingToNextInputMethod; 9369da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka 9469da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka /** 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor. 96e7c6998e0a953ae55487d4fe122739646f9280aasatok * 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The Context in which we are parsing the input method. 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param service The ResolveInfo returned from the package manager about 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this input method's component. 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InputMethodInfo(Context context, ResolveInfo service) 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 103e7c6998e0a953ae55487d4fe122739646f9280aasatok this(context, service, null); 104e7c6998e0a953ae55487d4fe122739646f9280aasatok } 105e7c6998e0a953ae55487d4fe122739646f9280aasatok 106e7c6998e0a953ae55487d4fe122739646f9280aasatok /** 107e7c6998e0a953ae55487d4fe122739646f9280aasatok * Constructor. 108e7c6998e0a953ae55487d4fe122739646f9280aasatok * 109e7c6998e0a953ae55487d4fe122739646f9280aasatok * @param context The Context in which we are parsing the input method. 110e7c6998e0a953ae55487d4fe122739646f9280aasatok * @param service The ResolveInfo returned from the package manager about 111e7c6998e0a953ae55487d4fe122739646f9280aasatok * this input method's component. 112e7c6998e0a953ae55487d4fe122739646f9280aasatok * @param additionalSubtypes additional subtypes being added to this InputMethodInfo 113e7c6998e0a953ae55487d4fe122739646f9280aasatok * @hide 114e7c6998e0a953ae55487d4fe122739646f9280aasatok */ 115e7c6998e0a953ae55487d4fe122739646f9280aasatok public InputMethodInfo(Context context, ResolveInfo service, 116e7c6998e0a953ae55487d4fe122739646f9280aasatok Map<String, List<InputMethodSubtype>> additionalSubtypesMap) 117e7c6998e0a953ae55487d4fe122739646f9280aasatok throws XmlPullParserException, IOException { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = service; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceInfo si = service.serviceInfo; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mId = new ComponentName(si.packageName, si.name).flattenToShortString(); 121660e6c96e3133f28b1fe95902674ce34ca1a35ebSatoshi Kataoka boolean isAuxIme = true; 12269da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka boolean supportsSwitchingToNextInputMethod = false; // false as default 123f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka mForceDefault = false; 1247eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageManager pm = context.getPackageManager(); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String settingsActivityComponent = null; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int isDefaultResId = 0; 1287eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlResourceParser parser = null; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser = si.loadXmlMetaData(pm, InputMethod.SERVICE_META_DATA); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser == null) { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new XmlPullParserException("No " 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + InputMethod.SERVICE_META_DATA + " meta-data"); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn Resources res = pm.getResourcesForApplication(si.applicationInfo); 13820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs = Xml.asAttributeSet(parser); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type != XmlPullParser.START_TAG) { 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nodeName = parser.getName(); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!"input-method".equals(nodeName)) { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new XmlPullParserException( 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Meta-data does not start with input-method tag"); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn TypedArray sa = res.obtainAttributes(attrs, 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.InputMethod); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project settingsActivityComponent = sa.getString( 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.InputMethod_settingsActivity); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isDefaultResId = sa.getResourceId( 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.InputMethod_isDefault, 0); 15869da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka supportsSwitchingToNextInputMethod = sa.getBoolean( 15969da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka com.android.internal.R.styleable.InputMethod_supportsSwitchingToNextInputMethod, 16069da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka false); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 1627eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 1637eb84256e57ce85bece610e6a01e20fa12e0f3fesatok final int depth = parser.getDepth(); 1647eb84256e57ce85bece610e6a01e20fa12e0f3fesatok // Parse all subtypes 1657eb84256e57ce85bece610e6a01e20fa12e0f3fesatok while (((type = parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth) 1667eb84256e57ce85bece610e6a01e20fa12e0f3fesatok && type != XmlPullParser.END_DOCUMENT) { 167ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok if (type == XmlPullParser.START_TAG) { 168ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok nodeName = parser.getName(); 169ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok if (!"subtype".equals(nodeName)) { 170ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok throw new XmlPullParserException( 171ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok "Meta-data in input-method does not start with subtype tag"); 172ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok } 173ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok final TypedArray a = res.obtainAttributes( 174ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok attrs, com.android.internal.R.styleable.InputMethod_Subtype); 175dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka final InputMethodSubtype subtype = new InputMethodSubtypeBuilder() 176dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka .setSubtypeNameResId(a.getResourceId(com.android.internal.R.styleable 177dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka .InputMethod_Subtype_label, 0)) 178dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka .setSubtypeIconResId(a.getResourceId(com.android.internal.R.styleable 179dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka .InputMethod_Subtype_icon, 0)) 180dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka .setSubtypeLocale(a.getString(com.android.internal.R.styleable 181dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka .InputMethod_Subtype_imeSubtypeLocale)) 182dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka .setSubtypeMode(a.getString(com.android.internal.R.styleable 183dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka .InputMethod_Subtype_imeSubtypeMode)) 184dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka .setSubtypeExtraValue(a.getString(com.android.internal.R.styleable 185dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka .InputMethod_Subtype_imeSubtypeExtraValue)) 186dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka .setIsAuxiliary(a.getBoolean(com.android.internal.R.styleable 187dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka .InputMethod_Subtype_isAuxiliary, false)) 188dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka .setOverridesImplicitlyEnabledSubtype(a.getBoolean( 189dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka com.android.internal.R.styleable 190dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka .InputMethod_Subtype_overridesImplicitlyEnabledSubtype, false)) 191dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka .setSubtypeId(a.getInt(com.android.internal.R.styleable 192dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka .InputMethod_Subtype_subtypeId, 0 /* use Arrays.hashCode */)) 193dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka .setIsAsciiCapable(a.getBoolean(com.android.internal.R.styleable 194dc8abf6cee0bcf44e2cad8155f0c151105d46471Satoshi Kataoka .InputMethod_Subtype_isAsciiCapable, false)).build(); 195dbfba8560dda9de810c4265b765d49952519e841satok if (!subtype.isAuxiliary()) { 196660e6c96e3133f28b1fe95902674ce34ca1a35ebSatoshi Kataoka isAuxIme = false; 197dbfba8560dda9de810c4265b765d49952519e841satok } 198ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok mSubtypes.add(subtype); 1997eb84256e57ce85bece610e6a01e20fa12e0f3fesatok } 2007eb84256e57ce85bece610e6a01e20fa12e0f3fesatok } 20120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } catch (NameNotFoundException e) { 20220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn throw new XmlPullParserException( 20320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn "Unable to create context for: " + si.packageName); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser != null) parser.close(); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 207e7c6998e0a953ae55487d4fe122739646f9280aasatok 208dbfba8560dda9de810c4265b765d49952519e841satok if (mSubtypes.size() == 0) { 209660e6c96e3133f28b1fe95902674ce34ca1a35ebSatoshi Kataoka isAuxIme = false; 210dbfba8560dda9de810c4265b765d49952519e841satok } 211dbfba8560dda9de810c4265b765d49952519e841satok 212e7c6998e0a953ae55487d4fe122739646f9280aasatok if (additionalSubtypesMap != null && additionalSubtypesMap.containsKey(mId)) { 213e7c6998e0a953ae55487d4fe122739646f9280aasatok final List<InputMethodSubtype> additionalSubtypes = additionalSubtypesMap.get(mId); 214e7c6998e0a953ae55487d4fe122739646f9280aasatok final int N = additionalSubtypes.size(); 215e7c6998e0a953ae55487d4fe122739646f9280aasatok for (int i = 0; i < N; ++i) { 216e7c6998e0a953ae55487d4fe122739646f9280aasatok final InputMethodSubtype subtype = additionalSubtypes.get(i); 217e7c6998e0a953ae55487d4fe122739646f9280aasatok if (!mSubtypes.contains(subtype)) { 218e7c6998e0a953ae55487d4fe122739646f9280aasatok mSubtypes.add(subtype); 219e62e6d8731ab1e02c1632ebc011792d07b902af8Satoshi Kataoka } else { 220e62e6d8731ab1e02c1632ebc011792d07b902af8Satoshi Kataoka Slog.w(TAG, "Duplicated subtype definition found: " 221e62e6d8731ab1e02c1632ebc011792d07b902af8Satoshi Kataoka + subtype.getLocale() + ", " + subtype.getMode()); 222e7c6998e0a953ae55487d4fe122739646f9280aasatok } 223e7c6998e0a953ae55487d4fe122739646f9280aasatok } 224e7c6998e0a953ae55487d4fe122739646f9280aasatok } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSettingsActivityName = settingsActivityComponent; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsDefaultResId = isDefaultResId; 227660e6c96e3133f28b1fe95902674ce34ca1a35ebSatoshi Kataoka mIsAuxIme = isAuxIme; 22869da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka mSupportsSwitchingToNextInputMethod = supportsSwitchingToNextInputMethod; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputMethodInfo(Parcel source) { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mId = source.readString(); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSettingsActivityName = source.readString(); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsDefaultResId = source.readInt(); 235dbfba8560dda9de810c4265b765d49952519e841satok mIsAuxIme = source.readInt() == 1; 23669da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka mSupportsSwitchingToNextInputMethod = source.readInt() == 1; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = ResolveInfo.CREATOR.createFromParcel(source); 2387eb84256e57ce85bece610e6a01e20fa12e0f3fesatok source.readTypedList(mSubtypes, InputMethodSubtype.CREATOR); 239f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka mForceDefault = false; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2417eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 243f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka * Temporary API for creating a built-in input method for test. 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InputMethodInfo(String packageName, String className, 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence label, String settingsActivity) { 247f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka this(buildDummyResolveInfo(packageName, className, label), false, settingsActivity, null, 248f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka 0, false); 249f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka } 250f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka 251f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka /** 252f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka * Temporary API for creating a built-in input method for test. 253f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka * @hide 254f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka */ 255f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka public InputMethodInfo(ResolveInfo ri, boolean isAuxIme, 256f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka String settingsActivity, List<InputMethodSubtype> subtypes, int isDefaultResId, 257f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka boolean forceDefault) { 258f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka final ServiceInfo si = ri.serviceInfo; 259f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka mService = ri; 260f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka mId = new ComponentName(si.packageName, si.name).flattenToShortString(); 261f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka mSettingsActivityName = settingsActivity; 262f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka mIsDefaultResId = isDefaultResId; 263f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka mIsAuxIme = isAuxIme; 264f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka if (subtypes != null) { 265f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka mSubtypes.addAll(subtypes); 266f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka } 267f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka mForceDefault = forceDefault; 26869da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka mSupportsSwitchingToNextInputMethod = true; 269f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka } 270f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka 271f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka private static ResolveInfo buildDummyResolveInfo(String packageName, String className, 272f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka CharSequence label) { 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo ri = new ResolveInfo(); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceInfo si = new ServiceInfo(); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApplicationInfo ai = new ApplicationInfo(); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.packageName = packageName; 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.enabled = true; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.applicationInfo = ai; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.enabled = true; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.packageName = packageName; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.name = className; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.exported = true; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.nonLocalizedLabel = label; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ri.serviceInfo = si; 285f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka return ri; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2877eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a unique ID for this input method. The ID is generated from 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the package and class name implementing the method. 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getId() { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mId; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2957eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the .apk package that implements this input method. 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageName() { 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.serviceInfo.packageName; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3027eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the class name of the service component that implements 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this input method. 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getServiceName() { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.serviceInfo.name; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 312c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Return the raw information about the Service implementing this 313c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * input method. Do not modify the returned object. 314c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 315c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public ServiceInfo getServiceInfo() { 316c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project return mService.serviceInfo; 317c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 318c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 319c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the component of the service that implements this input 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method. 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ComponentName getComponent() { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new ComponentName(mService.serviceInfo.packageName, 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.serviceInfo.name); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3277eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Load the user-displayed label for this input method. 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pm Supply a PackageManager used to load the input method's 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resources. 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence loadLabel(PackageManager pm) { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.loadLabel(pm); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3377eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Load the user-displayed icon for this input method. 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pm Supply a PackageManager used to load the input method's 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resources. 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable loadIcon(PackageManager pm) { 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.loadIcon(pm); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3477eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the class name of an activity that provides a settings UI for 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the input method. You can launch this activity be starting it with 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an {@link android.content.Intent} whose action is MAIN and with an 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * explicit {@link android.content.ComponentName} 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * composed of {@link #getPackageName} and the class name returned here. 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A null will be returned if there is no settings activity associated 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the input method. 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getSettingsActivity() { 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSettingsActivityName; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3617eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 3627eb84256e57ce85bece610e6a01e20fa12e0f3fesatok /** 363586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa * Return the count of the subtypes of Input Method. 3647eb84256e57ce85bece610e6a01e20fa12e0f3fesatok */ 365586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa public int getSubtypeCount() { 366586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa return mSubtypes.size(); 367586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa } 368586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa 369586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa /** 370586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa * Return the Input Method's subtype at the specified index. 371586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa * 372586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa * @param index the index of the subtype to return. 373586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa */ 374586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa public InputMethodSubtype getSubtypeAt(int index) { 375586f051375d8d7aeece05329921f9f66fc6164cbKen Wakasa return mSubtypes.get(index); 3767eb84256e57ce85bece610e6a01e20fa12e0f3fesatok } 3777eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the resource identifier of a resource inside of this input 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method's .apk that determines whether it should be considered a 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * default input method for the system. 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIsDefaultResourceId() { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIsDefaultResId; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3867eb84256e57ce85bece610e6a01e20fa12e0f3fesatok 387f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka /** 388f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka * Return whether or not this ime is a default ime or not. 389f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka * @hide 390f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka */ 391f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka public boolean isDefault(Context context) { 392f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka if (mForceDefault) { 393f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka return true; 394f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka } 395f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka try { 396f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka final Resources res = context.createPackageContext(getPackageName(), 0).getResources(); 397f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka return res.getBoolean(getIsDefaultResourceId()); 398f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka } catch (NameNotFoundException e) { 399f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka return false; 400f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka } 401f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka } 402f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dump(Printer pw, String prefix) { 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "mId=" + mId 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mSettingsActivityName=" + mSettingsActivityName); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "mIsDefaultResId=0x" 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(mIsDefaultResId)); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "Service:"); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.dump(pw, prefix + " "); 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 414eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn return "InputMethodInfo{" + mId 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", settings: " 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mSettingsActivityName + "}"; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to test whether the given parameter object is an 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link InputMethodInfo} and its Id is the same to this one. 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the given parameter object is an 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link InputMethodInfo} and its Id is the same to this one. 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean equals(Object o) { 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (o == this) return true; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (o == null) return false; 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!(o instanceof InputMethodInfo)) return false; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputMethodInfo obj = (InputMethodInfo) o; 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mId.equals(obj.mId); 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 436c50232d517d7b99ae3c3e073f04eb6799c876e8csatok 437c50232d517d7b99ae3c3e073f04eb6799c876e8csatok @Override 438c50232d517d7b99ae3c3e073f04eb6799c876e8csatok public int hashCode() { 439c50232d517d7b99ae3c3e073f04eb6799c876e8csatok return mId.hashCode(); 440c50232d517d7b99ae3c3e073f04eb6799c876e8csatok } 441c50232d517d7b99ae3c3e073f04eb6799c876e8csatok 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 443dbfba8560dda9de810c4265b765d49952519e841satok * @hide 444dbfba8560dda9de810c4265b765d49952519e841satok */ 445dbfba8560dda9de810c4265b765d49952519e841satok public boolean isAuxiliaryIme() { 446dbfba8560dda9de810c4265b765d49952519e841satok return mIsAuxIme; 447dbfba8560dda9de810c4265b765d49952519e841satok } 448dbfba8560dda9de810c4265b765d49952519e841satok 449dbfba8560dda9de810c4265b765d49952519e841satok /** 45069da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka * @return true if this input method supports ways to switch to a next input method. 45169da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka * @hide 45269da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka */ 45369da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka public boolean supportsSwitchingToNextInputMethod() { 45469da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka return mSupportsSwitchingToNextInputMethod; 45569da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka } 45669da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka 45769da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka /** 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to package this object into a {@link Parcel}. 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dest The {@link Parcel} to be written. 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags The flags used for parceling. 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 463dbfba8560dda9de810c4265b765d49952519e841satok @Override 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(mId); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(mSettingsActivityName); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(mIsDefaultResId); 468dbfba8560dda9de810c4265b765d49952519e841satok dest.writeInt(mIsAuxIme ? 1 : 0); 46969da2690e5a990987adba8f68dcf3d8a17d1a0fcSatoshi Kataoka dest.writeInt(mSupportsSwitchingToNextInputMethod ? 1 : 0); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.writeToParcel(dest, flags); 4717eb84256e57ce85bece610e6a01e20fa12e0f3fesatok dest.writeTypedList(mSubtypes); 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to make this class parcelable. 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4777eb84256e57ce85bece610e6a01e20fa12e0f3fesatok public static final Parcelable.Creator<InputMethodInfo> CREATOR 4787eb84256e57ce85bece610e6a01e20fa12e0f3fesatok = new Parcelable.Creator<InputMethodInfo>() { 479dbfba8560dda9de810c4265b765d49952519e841satok @Override 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InputMethodInfo createFromParcel(Parcel source) { 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new InputMethodInfo(source); 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 484dbfba8560dda9de810c4265b765d49952519e841satok @Override 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InputMethodInfo[] newArray(int size) { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new InputMethodInfo[size]; 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 490dbfba8560dda9de810c4265b765d49952519e841satok @Override 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 495