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