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