1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5 * use this file except in compliance with the License. You may obtain a copy of
6 * the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations under
14 * the License.
15 */
16
17package android.view.textservice;
18
19import com.android.internal.util.ArrayUtils;
20
21import android.os.Parcel;
22import android.os.Parcelable;
23
24/**
25 * This class contains a metadata of suggestions from the text service
26 */
27public final class SuggestionsInfo implements Parcelable {
28    private static final String[] EMPTY = ArrayUtils.emptyArray(String.class);
29
30    /**
31     * Flag of the attributes of the suggestions that can be obtained by
32     * {@link #getSuggestionsAttributes}: this tells that the requested word was found
33     * in the dictionary in the text service.
34     */
35    public static final int RESULT_ATTR_IN_THE_DICTIONARY = 0x0001;
36    /**
37     * Flag of the attributes of the suggestions that can be obtained by
38     * {@link #getSuggestionsAttributes}: this tells that the text service thinks the requested
39     * word looks like a typo.
40     */
41    public static final int RESULT_ATTR_LOOKS_LIKE_TYPO = 0x0002;
42    /**
43     * Flag of the attributes of the suggestions that can be obtained by
44     * {@link #getSuggestionsAttributes}: this tells that the text service thinks
45     * the result suggestions include highly recommended ones.
46     */
47    public static final int RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS = 0x0004;
48    private final int mSuggestionsAttributes;
49    private final String[] mSuggestions;
50    private final boolean mSuggestionsAvailable;
51    private int mCookie;
52    private int mSequence;
53
54    /**
55     * Constructor.
56     * @param suggestionsAttributes from the text service
57     * @param suggestions from the text service
58     */
59    public SuggestionsInfo(int suggestionsAttributes, String[] suggestions) {
60        this(suggestionsAttributes, suggestions, 0, 0);
61    }
62
63    /**
64     * Constructor.
65     * @param suggestionsAttributes from the text service
66     * @param suggestions from the text service
67     * @param cookie the cookie of the input TextInfo
68     * @param sequence the cookie of the input TextInfo
69     */
70    public SuggestionsInfo(
71            int suggestionsAttributes, String[] suggestions, int cookie, int sequence) {
72        if (suggestions == null) {
73            mSuggestions = EMPTY;
74            mSuggestionsAvailable = false;
75        } else {
76            mSuggestions = suggestions;
77            mSuggestionsAvailable = true;
78        }
79        mSuggestionsAttributes = suggestionsAttributes;
80        mCookie = cookie;
81        mSequence = sequence;
82    }
83
84    public SuggestionsInfo(Parcel source) {
85        mSuggestionsAttributes = source.readInt();
86        mSuggestions = source.readStringArray();
87        mCookie = source.readInt();
88        mSequence = source.readInt();
89        mSuggestionsAvailable = source.readInt() == 1;
90    }
91
92    /**
93     * Used to package this object into a {@link Parcel}.
94     *
95     * @param dest The {@link Parcel} to be written.
96     * @param flags The flags used for parceling.
97     */
98    @Override
99    public void writeToParcel(Parcel dest, int flags) {
100        dest.writeInt(mSuggestionsAttributes);
101        dest.writeStringArray(mSuggestions);
102        dest.writeInt(mCookie);
103        dest.writeInt(mSequence);
104        dest.writeInt(mSuggestionsAvailable ? 1 : 0);
105    }
106
107    /**
108     * Set the cookie and the sequence of SuggestionsInfo which are set to TextInfo from a client
109     * application
110     * @param cookie the cookie of an input TextInfo
111     * @param sequence the cookie of an input TextInfo
112     */
113    public void setCookieAndSequence(int cookie, int sequence) {
114        mCookie = cookie;
115        mSequence = sequence;
116    }
117
118    /**
119     * @return the cookie which may be set by a client application
120     */
121    public int getCookie() {
122        return mCookie;
123    }
124
125    /**
126     * @return the sequence which may be set by a client application
127     */
128    public int getSequence() {
129        return mSequence;
130    }
131
132    /**
133     * @return the attributes of suggestions. This includes whether the spell checker has the word
134     * in its dictionary or not and whether the spell checker has confident suggestions for the
135     * word or not.
136     */
137    public int getSuggestionsAttributes() {
138        return mSuggestionsAttributes;
139    }
140
141    /**
142     * @return the count of the suggestions. If there's no suggestions at all, this method returns
143     * -1. Even if this method returns 0, it doesn't necessarily mean that there are no suggestions
144     * for the requested word. For instance, the caller could have been asked to limit the maximum
145     * number of suggestions returned.
146     */
147    public int getSuggestionsCount() {
148        if (!mSuggestionsAvailable) {
149            return -1;
150        }
151        return mSuggestions.length;
152    }
153
154    /**
155     * @param i the id of suggestions
156     * @return the suggestion at the specified id
157     */
158    public String getSuggestionAt(int i) {
159        return mSuggestions[i];
160    }
161
162    /**
163     * Used to make this class parcelable.
164     */
165    public static final Parcelable.Creator<SuggestionsInfo> CREATOR
166            = new Parcelable.Creator<SuggestionsInfo>() {
167        @Override
168        public SuggestionsInfo createFromParcel(Parcel source) {
169            return new SuggestionsInfo(source);
170        }
171
172        @Override
173        public SuggestionsInfo[] newArray(int size) {
174            return new SuggestionsInfo[size];
175        }
176    };
177
178    /**
179     * Used to make this class parcelable.
180     */
181    @Override
182    public int describeContents() {
183        return 0;
184    }
185}
186