• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 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 
17 package com.android.inputmethod.latin;
18 
19 import android.text.TextUtils;
20 import android.view.inputmethod.CompletionInfo;
21 
22 import java.util.ArrayList;
23 import java.util.Collections;
24 import java.util.HashSet;
25 import java.util.List;
26 
27 public class SuggestedWords {
28     public static final SuggestedWords EMPTY = new SuggestedWords(null, false, false, false, null);
29 
30     public final List<CharSequence> mWords;
31     public final boolean mTypedWordValid;
32     public final boolean mHasAutoCorrectionCandidate;
33     public final boolean mIsPunctuationSuggestions;
34     private final List<SuggestedWordInfo> mSuggestedWordInfoList;
35     private boolean mShouldBlockAutoCorrection;
36 
SuggestedWords(List<CharSequence> words, boolean typedWordValid, boolean hasAutoCorrectionCandidate, boolean isPunctuationSuggestions, List<SuggestedWordInfo> suggestedWordInfoList)37     private SuggestedWords(List<CharSequence> words, boolean typedWordValid,
38             boolean hasAutoCorrectionCandidate, boolean isPunctuationSuggestions,
39             List<SuggestedWordInfo> suggestedWordInfoList) {
40         if (words != null) {
41             mWords = words;
42         } else {
43             mWords = Collections.emptyList();
44         }
45         mTypedWordValid = typedWordValid;
46         mHasAutoCorrectionCandidate = hasAutoCorrectionCandidate;
47         mIsPunctuationSuggestions = isPunctuationSuggestions;
48         mSuggestedWordInfoList = suggestedWordInfoList;
49         mShouldBlockAutoCorrection = false;
50     }
51 
size()52     public int size() {
53         return mWords.size();
54     }
55 
getWord(int pos)56     public CharSequence getWord(int pos) {
57         return mWords.get(pos);
58     }
59 
getInfo(int pos)60     public SuggestedWordInfo getInfo(int pos) {
61         return mSuggestedWordInfoList != null ? mSuggestedWordInfoList.get(pos) : null;
62     }
63 
hasAutoCorrectionWord()64     public boolean hasAutoCorrectionWord() {
65         return mHasAutoCorrectionCandidate && size() > 1 && !mTypedWordValid;
66     }
67 
hasWordAboveAutoCorrectionScoreThreshold()68     public boolean hasWordAboveAutoCorrectionScoreThreshold() {
69         return mHasAutoCorrectionCandidate && ((size() > 1 && !mTypedWordValid) || mTypedWordValid);
70     }
71 
isPunctuationSuggestions()72     public boolean isPunctuationSuggestions() {
73         return mIsPunctuationSuggestions;
74     }
75 
setShouldBlockAutoCorrection()76     public void setShouldBlockAutoCorrection() {
77         mShouldBlockAutoCorrection = true;
78     }
79 
shouldBlockAutoCorrection()80     public boolean shouldBlockAutoCorrection() {
81         return mShouldBlockAutoCorrection;
82     }
83 
84     public static class Builder {
85         private List<CharSequence> mWords = new ArrayList<CharSequence>();
86         private boolean mTypedWordValid;
87         private boolean mHasMinimalSuggestion;
88         private boolean mIsPunctuationSuggestions;
89         private List<SuggestedWordInfo> mSuggestedWordInfoList =
90                 new ArrayList<SuggestedWordInfo>();
91 
Builder()92         public Builder() {
93             // Nothing to do here.
94         }
95 
addWords(List<CharSequence> words, List<SuggestedWordInfo> suggestedWordInfoList)96         public Builder addWords(List<CharSequence> words,
97                 List<SuggestedWordInfo> suggestedWordInfoList) {
98             final int N = words.size();
99             for (int i = 0; i < N; ++i) {
100                 SuggestedWordInfo suggestedWordInfo = null;
101                 if (suggestedWordInfoList != null) {
102                     suggestedWordInfo = suggestedWordInfoList.get(i);
103                 }
104                 if (suggestedWordInfo == null) {
105                     suggestedWordInfo = new SuggestedWordInfo();
106                 }
107                 addWord(words.get(i), suggestedWordInfo);
108             }
109             return this;
110         }
111 
addWord(CharSequence word)112         public Builder addWord(CharSequence word) {
113             return addWord(word, null, false);
114         }
115 
addWord(CharSequence word, CharSequence debugString, boolean isPreviousSuggestedWord)116         public Builder addWord(CharSequence word, CharSequence debugString,
117                 boolean isPreviousSuggestedWord) {
118             SuggestedWordInfo info = new SuggestedWordInfo(debugString, isPreviousSuggestedWord);
119             return addWord(word, info);
120         }
121 
addWord(CharSequence word, SuggestedWordInfo suggestedWordInfo)122         private Builder addWord(CharSequence word, SuggestedWordInfo suggestedWordInfo) {
123             if (!TextUtils.isEmpty(word)) {
124                 mWords.add(word);
125                 // It's okay if suggestedWordInfo is null since it's checked where it's used.
126                 mSuggestedWordInfoList.add(suggestedWordInfo);
127             }
128             return this;
129         }
130 
setApplicationSpecifiedCompletions(CompletionInfo[] infos)131         public Builder setApplicationSpecifiedCompletions(CompletionInfo[] infos) {
132             for (CompletionInfo info : infos) {
133                 if (null != info) addWord(info.getText());
134             }
135             return this;
136         }
137 
setTypedWordValid(boolean typedWordValid)138         public Builder setTypedWordValid(boolean typedWordValid) {
139             mTypedWordValid = typedWordValid;
140             return this;
141         }
142 
setHasMinimalSuggestion(boolean hasMinimalSuggestion)143         public Builder setHasMinimalSuggestion(boolean hasMinimalSuggestion) {
144             mHasMinimalSuggestion = hasMinimalSuggestion;
145             return this;
146         }
147 
setIsPunctuationSuggestions()148         public Builder setIsPunctuationSuggestions() {
149             mIsPunctuationSuggestions = true;
150             return this;
151         }
152 
153         // Should get rid of the first one (what the user typed previously) from suggestions
154         // and replace it with what the user currently typed.
addTypedWordAndPreviousSuggestions(CharSequence typedWord, SuggestedWords previousSuggestions)155         public Builder addTypedWordAndPreviousSuggestions(CharSequence typedWord,
156                 SuggestedWords previousSuggestions) {
157             mWords.clear();
158             mSuggestedWordInfoList.clear();
159             final HashSet<String> alreadySeen = new HashSet<String>();
160             addWord(typedWord, null, false);
161             alreadySeen.add(typedWord.toString());
162             final int previousSize = previousSuggestions.size();
163             for (int pos = 1; pos < previousSize; pos++) {
164                 final String prevWord = previousSuggestions.getWord(pos).toString();
165                 // Filter out duplicate suggestion.
166                 if (!alreadySeen.contains(prevWord)) {
167                     addWord(prevWord, null, true);
168                     alreadySeen.add(prevWord);
169                 }
170             }
171             mTypedWordValid = false;
172             mHasMinimalSuggestion = false;
173             return this;
174         }
175 
build()176         public SuggestedWords build() {
177             return new SuggestedWords(mWords, mTypedWordValid, mHasMinimalSuggestion,
178                     mIsPunctuationSuggestions, mSuggestedWordInfoList);
179         }
180 
size()181         public int size() {
182             return mWords.size();
183         }
184 
getWord(int pos)185         public CharSequence getWord(int pos) {
186             return mWords.get(pos);
187         }
188 
189         @Override
toString()190         public String toString() {
191             // Pretty-print method to help debug
192             final StringBuilder sb = new StringBuilder("StringBuilder: mTypedWordValid = "
193                     + mTypedWordValid + " ; mHasMinimalSuggestion = " + mHasMinimalSuggestion
194                     + " ; mIsPunctuationSuggestions = " + mIsPunctuationSuggestions
195                     + " --- ");
196             for (CharSequence s : mWords) {
197                 sb.append(s);
198                 sb.append(" ; ");
199             }
200             return sb.toString();
201         }
202     }
203 
204     public static class SuggestedWordInfo {
205         private final CharSequence mDebugString;
206         private final boolean mPreviousSuggestedWord;
207 
SuggestedWordInfo()208         public SuggestedWordInfo() {
209             mDebugString = "";
210             mPreviousSuggestedWord = false;
211         }
212 
SuggestedWordInfo(CharSequence debugString, boolean previousSuggestedWord)213         public SuggestedWordInfo(CharSequence debugString, boolean previousSuggestedWord) {
214             mDebugString = debugString;
215             mPreviousSuggestedWord = previousSuggestedWord;
216         }
217 
getDebugString()218         public String getDebugString() {
219             if (mDebugString == null) {
220                 return "";
221             } else {
222                 return mDebugString.toString();
223             }
224         }
225 
isObsoleteSuggestedWord()226         public boolean isObsoleteSuggestedWord () {
227             return mPreviousSuggestedWord;
228         }
229     }
230 }
231