1d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok/*
2d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok * Copyright (C) 2012 The Android Open Source Project
3d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok *
4d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok * use this file except in compliance with the License. You may obtain a copy of
6d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok * the License at
7d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok *
8d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok * http://www.apache.org/licenses/LICENSE-2.0
9d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok *
10d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok * Unless required by applicable law or agreed to in writing, software
11d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok * License for the specific language governing permissions and limitations under
14d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok * the License.
15d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok */
16d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok
17d404fe110558bd2e1960b428db6a2ee8bfd040cdsatokpackage android.view.textservice;
18d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok
19d404fe110558bd2e1960b428db6a2ee8bfd040cdsatokimport android.os.Parcel;
20d404fe110558bd2e1960b428db6a2ee8bfd040cdsatokimport android.os.Parcelable;
21d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok
22d404fe110558bd2e1960b428db6a2ee8bfd040cdsatokimport java.util.Arrays;
23d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok
24d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok/**
256183cd64a98a69ea247813c9ba0a07326c4bc1aesatok * This class contains a metadata of suggestions returned from a text service
266183cd64a98a69ea247813c9ba0a07326c4bc1aesatok * (e.g. {@link android.service.textservice.SpellCheckerService}).
276183cd64a98a69ea247813c9ba0a07326c4bc1aesatok * The text service uses this class to return the suggestions
286183cd64a98a69ea247813c9ba0a07326c4bc1aesatok * for a sentence. See {@link SuggestionsInfo} which is used for suggestions for a word.
296183cd64a98a69ea247813c9ba0a07326c4bc1aesatok * This class extends the functionality of {@link SuggestionsInfo} as far as this class enables
306183cd64a98a69ea247813c9ba0a07326c4bc1aesatok * you to put multiple {@link SuggestionsInfo}s on a sentence with the offsets and the lengths
316183cd64a98a69ea247813c9ba0a07326c4bc1aesatok * of all {@link SuggestionsInfo}s.
32d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok */
33d404fe110558bd2e1960b428db6a2ee8bfd040cdsatokpublic final class SentenceSuggestionsInfo implements Parcelable {
34d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok
35d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    private final SuggestionsInfo[] mSuggestionsInfos;
36d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    private final int[] mOffsets;
37d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    private final int[] mLengths;
38d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok
39d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    /**
40d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok     * Constructor.
41d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok     * @param suggestionsInfos from the text service
42d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok     * @param offsets the array of offsets of suggestions
43d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok     * @param lengths the array of lengths of suggestions
44d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok     */
45d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    public SentenceSuggestionsInfo(
46d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok            SuggestionsInfo[] suggestionsInfos, int[] offsets, int[] lengths) {
47d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        if (suggestionsInfos == null || offsets == null || lengths == null) {
48d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok            throw new NullPointerException();
49d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        }
50d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        if (suggestionsInfos.length != offsets.length || offsets.length != lengths.length) {
51d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok            throw new IllegalArgumentException();
52d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        }
53d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        final int infoSize = suggestionsInfos.length;
54d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        mSuggestionsInfos = Arrays.copyOf(suggestionsInfos, infoSize);
55d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        mOffsets = Arrays.copyOf(offsets, infoSize);
56d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        mLengths = Arrays.copyOf(lengths, infoSize);
57d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    }
58d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok
59d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    public SentenceSuggestionsInfo(Parcel source) {
60d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        final int infoSize = source.readInt();
61d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        mSuggestionsInfos = new SuggestionsInfo[infoSize];
62d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        source.readTypedArray(mSuggestionsInfos, SuggestionsInfo.CREATOR);
63d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        mOffsets = new int[mSuggestionsInfos.length];
64d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        source.readIntArray(mOffsets);
65d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        mLengths = new int[mSuggestionsInfos.length];
66d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        source.readIntArray(mLengths);
67d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    }
68d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok
69d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    /**
70d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok     * Used to package this object into a {@link Parcel}.
71d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok     *
72d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok     * @param dest The {@link Parcel} to be written.
73d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok     * @param flags The flags used for parceling.
74d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok     */
75d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    @Override
76d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    public void writeToParcel(Parcel dest, int flags) {
77d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        final int infoSize = mSuggestionsInfos.length;
78d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        dest.writeInt(infoSize);
79d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        dest.writeTypedArray(mSuggestionsInfos, 0);
80d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        dest.writeIntArray(mOffsets);
81d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        dest.writeIntArray(mLengths);
82d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    }
83d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok
84d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    @Override
85d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    public int describeContents() {
86d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        return 0;
87d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    }
88d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok
89d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    /**
906183cd64a98a69ea247813c9ba0a07326c4bc1aesatok     * @return the count of {@link SuggestionsInfo}s this instance holds.
91d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok     */
928898358bfdf4693af02ad454e1deb8034379ce02satok    public int getSuggestionsCount() {
938898358bfdf4693af02ad454e1deb8034379ce02satok        return mSuggestionsInfos.length;
948898358bfdf4693af02ad454e1deb8034379ce02satok    }
958898358bfdf4693af02ad454e1deb8034379ce02satok
968898358bfdf4693af02ad454e1deb8034379ce02satok    /**
976183cd64a98a69ea247813c9ba0a07326c4bc1aesatok     * @param i the id of {@link SuggestionsInfo}s this instance holds.
986183cd64a98a69ea247813c9ba0a07326c4bc1aesatok     * @return a {@link SuggestionsInfo} at the specified id
998898358bfdf4693af02ad454e1deb8034379ce02satok     */
100d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    public SuggestionsInfo getSuggestionsInfoAt(int i) {
101d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        if (i >= 0 && i < mSuggestionsInfos.length) {
102d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok            return mSuggestionsInfos[i];
103d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        }
104d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        return null;
105d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    }
106d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok
107d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    /**
1086183cd64a98a69ea247813c9ba0a07326c4bc1aesatok     * @param i the id of {@link SuggestionsInfo}s this instance holds
1096183cd64a98a69ea247813c9ba0a07326c4bc1aesatok     * @return the offset of the specified {@link SuggestionsInfo}
110d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok     */
111d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    public int getOffsetAt(int i) {
112d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        if (i >= 0 && i < mOffsets.length) {
113d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok            return mOffsets[i];
114d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        }
115d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        return -1;
116d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    }
117d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok
118d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    /**
1196183cd64a98a69ea247813c9ba0a07326c4bc1aesatok     * @param i the id of {@link SuggestionsInfo}s this instance holds
1206183cd64a98a69ea247813c9ba0a07326c4bc1aesatok     * @return the length of the specified {@link SuggestionsInfo}
121d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok     */
122d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    public int getLengthAt(int i) {
123d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        if (i >= 0 && i < mLengths.length) {
124d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok            return mLengths[i];
125d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        }
126d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        return -1;
127d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    }
128d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok
129d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    /**
130d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok     * Used to make this class parcelable.
131d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok     */
132d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    public static final Parcelable.Creator<SentenceSuggestionsInfo> CREATOR
133d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok            = new Parcelable.Creator<SentenceSuggestionsInfo>() {
134d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        @Override
135d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        public SentenceSuggestionsInfo createFromParcel(Parcel source) {
136d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok            return new SentenceSuggestionsInfo(source);
137d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        }
138d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok
139d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        @Override
140d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        public SentenceSuggestionsInfo[] newArray(int size) {
141d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok            return new SentenceSuggestionsInfo[size];
142d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok        }
143d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok    };
144d404fe110558bd2e1960b428db6a2ee8bfd040cdsatok}
145