1988323c57bd25a58f05dfa492d9b9c8ab62c5153satok/* 2988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * Copyright (C) 2011 The Android Open Source Project 3988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * 4988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * use this file except in compliance with the License. You may obtain a copy of 6988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * the License at 7988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * 8988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * http://www.apache.org/licenses/LICENSE-2.0 9988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * 10988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * Unless required by applicable law or agreed to in writing, software 11988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * License for the specific language governing permissions and limitations under 14988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * the License. 15988323c57bd25a58f05dfa492d9b9c8ab62c5153satok */ 16988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 17988323c57bd25a58f05dfa492d9b9c8ab62c5153satokpackage android.view.textservice; 18988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 1903b2ea1102d9e3e9f189173878706ab04533eea3satokimport org.xmlpull.v1.XmlPullParser; 2003b2ea1102d9e3e9f189173878706ab04533eea3satokimport org.xmlpull.v1.XmlPullParserException; 2103b2ea1102d9e3e9f189173878706ab04533eea3satok 22988323c57bd25a58f05dfa492d9b9c8ab62c5153satokimport android.content.ComponentName; 23988323c57bd25a58f05dfa492d9b9c8ab62c5153satokimport android.content.Context; 24562ab585f9e413d9696ee250e5ec02f95889a157satokimport android.content.pm.PackageManager; 25988323c57bd25a58f05dfa492d9b9c8ab62c5153satokimport android.content.pm.ResolveInfo; 26988323c57bd25a58f05dfa492d9b9c8ab62c5153satokimport android.content.pm.ServiceInfo; 2703b2ea1102d9e3e9f189173878706ab04533eea3satokimport android.content.res.Resources; 2803b2ea1102d9e3e9f189173878706ab04533eea3satokimport android.content.res.TypedArray; 2903b2ea1102d9e3e9f189173878706ab04533eea3satokimport android.content.res.XmlResourceParser; 30562ab585f9e413d9696ee250e5ec02f95889a157satokimport android.graphics.drawable.Drawable; 31988323c57bd25a58f05dfa492d9b9c8ab62c5153satokimport android.os.Parcel; 32988323c57bd25a58f05dfa492d9b9c8ab62c5153satokimport android.os.Parcelable; 3303b2ea1102d9e3e9f189173878706ab04533eea3satokimport android.util.AttributeSet; 3485df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawaimport android.util.PrintWriterPrinter; 3503b2ea1102d9e3e9f189173878706ab04533eea3satokimport android.util.Slog; 3603b2ea1102d9e3e9f189173878706ab04533eea3satokimport android.util.Xml; 3703b2ea1102d9e3e9f189173878706ab04533eea3satok 3803b2ea1102d9e3e9f189173878706ab04533eea3satokimport java.io.IOException; 3985df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawaimport java.io.PrintWriter; 4003b2ea1102d9e3e9f189173878706ab04533eea3satokimport java.util.ArrayList; 41988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 42988323c57bd25a58f05dfa492d9b9c8ab62c5153satok/** 43f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa * This class is used to specify meta information of a spell checker. 44988323c57bd25a58f05dfa492d9b9c8ab62c5153satok */ 45988323c57bd25a58f05dfa492d9b9c8ab62c5153satokpublic final class SpellCheckerInfo implements Parcelable { 4603b2ea1102d9e3e9f189173878706ab04533eea3satok private static final String TAG = SpellCheckerInfo.class.getSimpleName(); 47988323c57bd25a58f05dfa492d9b9c8ab62c5153satok private final ResolveInfo mService; 48988323c57bd25a58f05dfa492d9b9c8ab62c5153satok private final String mId; 4903b2ea1102d9e3e9f189173878706ab04533eea3satok private final int mLabel; 5003b2ea1102d9e3e9f189173878706ab04533eea3satok 5103b2ea1102d9e3e9f189173878706ab04533eea3satok /** 5203b2ea1102d9e3e9f189173878706ab04533eea3satok * The spell checker setting activity's name, used by the system settings to 5303b2ea1102d9e3e9f189173878706ab04533eea3satok * launch the setting activity. 5403b2ea1102d9e3e9f189173878706ab04533eea3satok */ 5503b2ea1102d9e3e9f189173878706ab04533eea3satok private final String mSettingsActivityName; 5603b2ea1102d9e3e9f189173878706ab04533eea3satok 5703b2ea1102d9e3e9f189173878706ab04533eea3satok /** 58f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa * The array of subtypes. 5903b2ea1102d9e3e9f189173878706ab04533eea3satok */ 6085df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa private final ArrayList<SpellCheckerSubtype> mSubtypes = new ArrayList<>(); 61988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 62988323c57bd25a58f05dfa492d9b9c8ab62c5153satok /** 63988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * Constructor. 64988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * @hide 65988323c57bd25a58f05dfa492d9b9c8ab62c5153satok */ 6603b2ea1102d9e3e9f189173878706ab04533eea3satok public SpellCheckerInfo(Context context, ResolveInfo service) 6703b2ea1102d9e3e9f189173878706ab04533eea3satok throws XmlPullParserException, IOException { 68988323c57bd25a58f05dfa492d9b9c8ab62c5153satok mService = service; 69988323c57bd25a58f05dfa492d9b9c8ab62c5153satok ServiceInfo si = service.serviceInfo; 70988323c57bd25a58f05dfa492d9b9c8ab62c5153satok mId = new ComponentName(si.packageName, si.name).flattenToShortString(); 7103b2ea1102d9e3e9f189173878706ab04533eea3satok 7203b2ea1102d9e3e9f189173878706ab04533eea3satok final PackageManager pm = context.getPackageManager(); 7303b2ea1102d9e3e9f189173878706ab04533eea3satok int label = 0; 7403b2ea1102d9e3e9f189173878706ab04533eea3satok String settingsActivityComponent = null; 7503b2ea1102d9e3e9f189173878706ab04533eea3satok 7603b2ea1102d9e3e9f189173878706ab04533eea3satok XmlResourceParser parser = null; 7703b2ea1102d9e3e9f189173878706ab04533eea3satok try { 7803b2ea1102d9e3e9f189173878706ab04533eea3satok parser = si.loadXmlMetaData(pm, SpellCheckerSession.SERVICE_META_DATA); 7903b2ea1102d9e3e9f189173878706ab04533eea3satok if (parser == null) { 8003b2ea1102d9e3e9f189173878706ab04533eea3satok throw new XmlPullParserException("No " 8103b2ea1102d9e3e9f189173878706ab04533eea3satok + SpellCheckerSession.SERVICE_META_DATA + " meta-data"); 8203b2ea1102d9e3e9f189173878706ab04533eea3satok } 8303b2ea1102d9e3e9f189173878706ab04533eea3satok 8403b2ea1102d9e3e9f189173878706ab04533eea3satok final Resources res = pm.getResourcesForApplication(si.applicationInfo); 8503b2ea1102d9e3e9f189173878706ab04533eea3satok final AttributeSet attrs = Xml.asAttributeSet(parser); 8603b2ea1102d9e3e9f189173878706ab04533eea3satok int type; 8703b2ea1102d9e3e9f189173878706ab04533eea3satok while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 8803b2ea1102d9e3e9f189173878706ab04533eea3satok && type != XmlPullParser.START_TAG) { 8903b2ea1102d9e3e9f189173878706ab04533eea3satok } 9003b2ea1102d9e3e9f189173878706ab04533eea3satok 9103b2ea1102d9e3e9f189173878706ab04533eea3satok final String nodeName = parser.getName(); 9203b2ea1102d9e3e9f189173878706ab04533eea3satok if (!"spell-checker".equals(nodeName)) { 9303b2ea1102d9e3e9f189173878706ab04533eea3satok throw new XmlPullParserException( 9403b2ea1102d9e3e9f189173878706ab04533eea3satok "Meta-data does not start with spell-checker tag"); 9503b2ea1102d9e3e9f189173878706ab04533eea3satok } 9603b2ea1102d9e3e9f189173878706ab04533eea3satok 9703b2ea1102d9e3e9f189173878706ab04533eea3satok TypedArray sa = res.obtainAttributes(attrs, 9803b2ea1102d9e3e9f189173878706ab04533eea3satok com.android.internal.R.styleable.SpellChecker); 9903b2ea1102d9e3e9f189173878706ab04533eea3satok label = sa.getResourceId(com.android.internal.R.styleable.SpellChecker_label, 0); 10003b2ea1102d9e3e9f189173878706ab04533eea3satok settingsActivityComponent = sa.getString( 10103b2ea1102d9e3e9f189173878706ab04533eea3satok com.android.internal.R.styleable.SpellChecker_settingsActivity); 10203b2ea1102d9e3e9f189173878706ab04533eea3satok sa.recycle(); 10303b2ea1102d9e3e9f189173878706ab04533eea3satok 10403b2ea1102d9e3e9f189173878706ab04533eea3satok final int depth = parser.getDepth(); 10503b2ea1102d9e3e9f189173878706ab04533eea3satok // Parse all subtypes 10603b2ea1102d9e3e9f189173878706ab04533eea3satok while (((type = parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth) 10703b2ea1102d9e3e9f189173878706ab04533eea3satok && type != XmlPullParser.END_DOCUMENT) { 10803b2ea1102d9e3e9f189173878706ab04533eea3satok if (type == XmlPullParser.START_TAG) { 10903b2ea1102d9e3e9f189173878706ab04533eea3satok final String subtypeNodeName = parser.getName(); 11003b2ea1102d9e3e9f189173878706ab04533eea3satok if (!"subtype".equals(subtypeNodeName)) { 11103b2ea1102d9e3e9f189173878706ab04533eea3satok throw new XmlPullParserException( 11203b2ea1102d9e3e9f189173878706ab04533eea3satok "Meta-data in spell-checker does not start with subtype tag"); 11303b2ea1102d9e3e9f189173878706ab04533eea3satok } 11403b2ea1102d9e3e9f189173878706ab04533eea3satok final TypedArray a = res.obtainAttributes( 11503b2ea1102d9e3e9f189173878706ab04533eea3satok attrs, com.android.internal.R.styleable.SpellChecker_Subtype); 11603b2ea1102d9e3e9f189173878706ab04533eea3satok SpellCheckerSubtype subtype = new SpellCheckerSubtype( 11703b2ea1102d9e3e9f189173878706ab04533eea3satok a.getResourceId(com.android.internal.R.styleable 11803b2ea1102d9e3e9f189173878706ab04533eea3satok .SpellChecker_Subtype_label, 0), 11903b2ea1102d9e3e9f189173878706ab04533eea3satok a.getString(com.android.internal.R.styleable 12003b2ea1102d9e3e9f189173878706ab04533eea3satok .SpellChecker_Subtype_subtypeLocale), 12103b2ea1102d9e3e9f189173878706ab04533eea3satok a.getString(com.android.internal.R.styleable 122868d19b93b1e20c802a001c7304f8bcac5fe5114Yohei Yukawa .SpellChecker_Subtype_languageTag), 123868d19b93b1e20c802a001c7304f8bcac5fe5114Yohei Yukawa a.getString(com.android.internal.R.styleable 1240894319162a2a1f4260805938d4807c4ffcbcb0fYohei Yukawa .SpellChecker_Subtype_subtypeExtraValue), 1250894319162a2a1f4260805938d4807c4ffcbcb0fYohei Yukawa a.getInt(com.android.internal.R.styleable 1260894319162a2a1f4260805938d4807c4ffcbcb0fYohei Yukawa .SpellChecker_Subtype_subtypeId, 0)); 12703b2ea1102d9e3e9f189173878706ab04533eea3satok mSubtypes.add(subtype); 12803b2ea1102d9e3e9f189173878706ab04533eea3satok } 12903b2ea1102d9e3e9f189173878706ab04533eea3satok } 13003b2ea1102d9e3e9f189173878706ab04533eea3satok } catch (Exception e) { 13103b2ea1102d9e3e9f189173878706ab04533eea3satok Slog.e(TAG, "Caught exception: " + e); 13203b2ea1102d9e3e9f189173878706ab04533eea3satok throw new XmlPullParserException( 13303b2ea1102d9e3e9f189173878706ab04533eea3satok "Unable to create context for: " + si.packageName); 13403b2ea1102d9e3e9f189173878706ab04533eea3satok } finally { 13503b2ea1102d9e3e9f189173878706ab04533eea3satok if (parser != null) parser.close(); 13603b2ea1102d9e3e9f189173878706ab04533eea3satok } 13703b2ea1102d9e3e9f189173878706ab04533eea3satok mLabel = label; 13803b2ea1102d9e3e9f189173878706ab04533eea3satok mSettingsActivityName = settingsActivityComponent; 139988323c57bd25a58f05dfa492d9b9c8ab62c5153satok } 140988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 141988323c57bd25a58f05dfa492d9b9c8ab62c5153satok /** 142988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * Constructor. 143988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * @hide 144988323c57bd25a58f05dfa492d9b9c8ab62c5153satok */ 145988323c57bd25a58f05dfa492d9b9c8ab62c5153satok public SpellCheckerInfo(Parcel source) { 14603b2ea1102d9e3e9f189173878706ab04533eea3satok mLabel = source.readInt(); 147988323c57bd25a58f05dfa492d9b9c8ab62c5153satok mId = source.readString(); 14803b2ea1102d9e3e9f189173878706ab04533eea3satok mSettingsActivityName = source.readString(); 149988323c57bd25a58f05dfa492d9b9c8ab62c5153satok mService = ResolveInfo.CREATOR.createFromParcel(source); 15003b2ea1102d9e3e9f189173878706ab04533eea3satok source.readTypedList(mSubtypes, SpellCheckerSubtype.CREATOR); 151988323c57bd25a58f05dfa492d9b9c8ab62c5153satok } 152988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 153988323c57bd25a58f05dfa492d9b9c8ab62c5153satok /** 154988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * Return a unique ID for this spell checker. The ID is generated from 155988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * the package and class name implementing the method. 156988323c57bd25a58f05dfa492d9b9c8ab62c5153satok */ 157988323c57bd25a58f05dfa492d9b9c8ab62c5153satok public String getId() { 158988323c57bd25a58f05dfa492d9b9c8ab62c5153satok return mId; 159988323c57bd25a58f05dfa492d9b9c8ab62c5153satok } 160988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 161f6710615c6cc1746d1ecc7aebc9afed457dcca41satok /** 162988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * Return the component of the service that implements. 163988323c57bd25a58f05dfa492d9b9c8ab62c5153satok */ 164988323c57bd25a58f05dfa492d9b9c8ab62c5153satok public ComponentName getComponent() { 165988323c57bd25a58f05dfa492d9b9c8ab62c5153satok return new ComponentName( 166988323c57bd25a58f05dfa492d9b9c8ab62c5153satok mService.serviceInfo.packageName, mService.serviceInfo.name); 167988323c57bd25a58f05dfa492d9b9c8ab62c5153satok } 168988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 169988323c57bd25a58f05dfa492d9b9c8ab62c5153satok /** 17003b2ea1102d9e3e9f189173878706ab04533eea3satok * Return the .apk package that implements this. 171988323c57bd25a58f05dfa492d9b9c8ab62c5153satok */ 172988323c57bd25a58f05dfa492d9b9c8ab62c5153satok public String getPackageName() { 173988323c57bd25a58f05dfa492d9b9c8ab62c5153satok return mService.serviceInfo.packageName; 174988323c57bd25a58f05dfa492d9b9c8ab62c5153satok } 175988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 176988323c57bd25a58f05dfa492d9b9c8ab62c5153satok /** 177988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * Used to package this object into a {@link Parcel}. 178988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * 179988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * @param dest The {@link Parcel} to be written. 180988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * @param flags The flags used for parceling. 181988323c57bd25a58f05dfa492d9b9c8ab62c5153satok */ 182988323c57bd25a58f05dfa492d9b9c8ab62c5153satok @Override 183988323c57bd25a58f05dfa492d9b9c8ab62c5153satok public void writeToParcel(Parcel dest, int flags) { 18403b2ea1102d9e3e9f189173878706ab04533eea3satok dest.writeInt(mLabel); 185988323c57bd25a58f05dfa492d9b9c8ab62c5153satok dest.writeString(mId); 18603b2ea1102d9e3e9f189173878706ab04533eea3satok dest.writeString(mSettingsActivityName); 187988323c57bd25a58f05dfa492d9b9c8ab62c5153satok mService.writeToParcel(dest, flags); 18803b2ea1102d9e3e9f189173878706ab04533eea3satok dest.writeTypedList(mSubtypes); 189988323c57bd25a58f05dfa492d9b9c8ab62c5153satok } 190988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 191988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 192988323c57bd25a58f05dfa492d9b9c8ab62c5153satok /** 193988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * Used to make this class parcelable. 194988323c57bd25a58f05dfa492d9b9c8ab62c5153satok */ 195988323c57bd25a58f05dfa492d9b9c8ab62c5153satok public static final Parcelable.Creator<SpellCheckerInfo> CREATOR 196988323c57bd25a58f05dfa492d9b9c8ab62c5153satok = new Parcelable.Creator<SpellCheckerInfo>() { 197988323c57bd25a58f05dfa492d9b9c8ab62c5153satok @Override 198988323c57bd25a58f05dfa492d9b9c8ab62c5153satok public SpellCheckerInfo createFromParcel(Parcel source) { 199988323c57bd25a58f05dfa492d9b9c8ab62c5153satok return new SpellCheckerInfo(source); 200988323c57bd25a58f05dfa492d9b9c8ab62c5153satok } 201988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 202988323c57bd25a58f05dfa492d9b9c8ab62c5153satok @Override 203988323c57bd25a58f05dfa492d9b9c8ab62c5153satok public SpellCheckerInfo[] newArray(int size) { 204988323c57bd25a58f05dfa492d9b9c8ab62c5153satok return new SpellCheckerInfo[size]; 205988323c57bd25a58f05dfa492d9b9c8ab62c5153satok } 206988323c57bd25a58f05dfa492d9b9c8ab62c5153satok }; 207988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 208988323c57bd25a58f05dfa492d9b9c8ab62c5153satok /** 209562ab585f9e413d9696ee250e5ec02f95889a157satok * Load the user-displayed label for this spell checker. 210562ab585f9e413d9696ee250e5ec02f95889a157satok * 211562ab585f9e413d9696ee250e5ec02f95889a157satok * @param pm Supply a PackageManager used to load the spell checker's resources. 212562ab585f9e413d9696ee250e5ec02f95889a157satok */ 213562ab585f9e413d9696ee250e5ec02f95889a157satok public CharSequence loadLabel(PackageManager pm) { 21403b2ea1102d9e3e9f189173878706ab04533eea3satok if (mLabel == 0 || pm == null) return ""; 21503b2ea1102d9e3e9f189173878706ab04533eea3satok return pm.getText(getPackageName(), mLabel, mService.serviceInfo.applicationInfo); 216562ab585f9e413d9696ee250e5ec02f95889a157satok } 217562ab585f9e413d9696ee250e5ec02f95889a157satok 218562ab585f9e413d9696ee250e5ec02f95889a157satok /** 219562ab585f9e413d9696ee250e5ec02f95889a157satok * Load the user-displayed icon for this spell checker. 220562ab585f9e413d9696ee250e5ec02f95889a157satok * 221562ab585f9e413d9696ee250e5ec02f95889a157satok * @param pm Supply a PackageManager used to load the spell checker's resources. 222562ab585f9e413d9696ee250e5ec02f95889a157satok */ 223562ab585f9e413d9696ee250e5ec02f95889a157satok public Drawable loadIcon(PackageManager pm) { 224562ab585f9e413d9696ee250e5ec02f95889a157satok return mService.loadIcon(pm); 225562ab585f9e413d9696ee250e5ec02f95889a157satok } 226562ab585f9e413d9696ee250e5ec02f95889a157satok 2272388a7ba6218f44400ee78016282cb96c02dfc54satok 2282388a7ba6218f44400ee78016282cb96c02dfc54satok /** 2292388a7ba6218f44400ee78016282cb96c02dfc54satok * Return the raw information about the Service implementing this 2302388a7ba6218f44400ee78016282cb96c02dfc54satok * spell checker. Do not modify the returned object. 2312388a7ba6218f44400ee78016282cb96c02dfc54satok */ 2322388a7ba6218f44400ee78016282cb96c02dfc54satok public ServiceInfo getServiceInfo() { 2332388a7ba6218f44400ee78016282cb96c02dfc54satok return mService.serviceInfo; 2342388a7ba6218f44400ee78016282cb96c02dfc54satok } 2352388a7ba6218f44400ee78016282cb96c02dfc54satok 236562ab585f9e413d9696ee250e5ec02f95889a157satok /** 23703b2ea1102d9e3e9f189173878706ab04533eea3satok * Return the class name of an activity that provides a settings UI. 23803b2ea1102d9e3e9f189173878706ab04533eea3satok * You can launch this activity be starting it with 23903b2ea1102d9e3e9f189173878706ab04533eea3satok * an {@link android.content.Intent} whose action is MAIN and with an 24003b2ea1102d9e3e9f189173878706ab04533eea3satok * explicit {@link android.content.ComponentName} 24103b2ea1102d9e3e9f189173878706ab04533eea3satok * composed of {@link #getPackageName} and the class name returned here. 24203b2ea1102d9e3e9f189173878706ab04533eea3satok * 24303b2ea1102d9e3e9f189173878706ab04533eea3satok * <p>A null will be returned if there is no settings activity. 24403b2ea1102d9e3e9f189173878706ab04533eea3satok */ 24503b2ea1102d9e3e9f189173878706ab04533eea3satok public String getSettingsActivity() { 24603b2ea1102d9e3e9f189173878706ab04533eea3satok return mSettingsActivityName; 24703b2ea1102d9e3e9f189173878706ab04533eea3satok } 24803b2ea1102d9e3e9f189173878706ab04533eea3satok 24903b2ea1102d9e3e9f189173878706ab04533eea3satok /** 25003b2ea1102d9e3e9f189173878706ab04533eea3satok * Return the count of the subtypes. 25103b2ea1102d9e3e9f189173878706ab04533eea3satok */ 25203b2ea1102d9e3e9f189173878706ab04533eea3satok public int getSubtypeCount() { 25303b2ea1102d9e3e9f189173878706ab04533eea3satok return mSubtypes.size(); 25403b2ea1102d9e3e9f189173878706ab04533eea3satok } 25503b2ea1102d9e3e9f189173878706ab04533eea3satok 25603b2ea1102d9e3e9f189173878706ab04533eea3satok /** 25703b2ea1102d9e3e9f189173878706ab04533eea3satok * Return the subtype at the specified index. 25803b2ea1102d9e3e9f189173878706ab04533eea3satok * 25903b2ea1102d9e3e9f189173878706ab04533eea3satok * @param index the index of the subtype to return. 26003b2ea1102d9e3e9f189173878706ab04533eea3satok */ 26103b2ea1102d9e3e9f189173878706ab04533eea3satok public SpellCheckerSubtype getSubtypeAt(int index) { 26203b2ea1102d9e3e9f189173878706ab04533eea3satok return mSubtypes.get(index); 26303b2ea1102d9e3e9f189173878706ab04533eea3satok } 26403b2ea1102d9e3e9f189173878706ab04533eea3satok 26503b2ea1102d9e3e9f189173878706ab04533eea3satok /** 266988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * Used to make this class parcelable. 267988323c57bd25a58f05dfa492d9b9c8ab62c5153satok */ 268988323c57bd25a58f05dfa492d9b9c8ab62c5153satok @Override 269988323c57bd25a58f05dfa492d9b9c8ab62c5153satok public int describeContents() { 270988323c57bd25a58f05dfa492d9b9c8ab62c5153satok return 0; 271988323c57bd25a58f05dfa492d9b9c8ab62c5153satok } 27285df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa 27385df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa /** 27485df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa * @hide 27585df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa */ 27685df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa public void dump(final PrintWriter pw, final String prefix) { 27785df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa pw.println(prefix + "mId=" + mId); 27885df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa pw.println(prefix + "mSettingsActivityName=" + mSettingsActivityName); 27985df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa pw.println(prefix + "Service:"); 28085df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa mService.dump(new PrintWriterPrinter(pw), prefix + " "); 28185df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa final int N = getSubtypeCount(); 28285df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa for (int i = 0; i < N; i++) { 28385df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa final SpellCheckerSubtype st = getSubtypeAt(i); 28485df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa pw.println(prefix + " " + "Subtype #" + i + ":"); 28585df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa pw.println(prefix + " " + "locale=" + st.getLocale() 28685df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa + " languageTag=" + st.getLanguageTag()); 28785df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa pw.println(prefix + " " + "extraValue=" + st.getExtraValue()); 28885df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa } 28985df698df50262602ee2ac622d5c46f630c18f02Yohei Yukawa } 290988323c57bd25a58f05dfa492d9b9c8ab62c5153satok} 291