SuggestedWords.java revision 24eec0fa680f97e64d1fa0df754acbad95ed9a76
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 17package com.android.inputmethod.latin; 18 19import android.text.TextUtils; 20import android.view.inputmethod.CompletionInfo; 21 22import java.util.ArrayList; 23import java.util.Arrays; 24import java.util.HashSet; 25 26public class SuggestedWords { 27 public static final SuggestedWords EMPTY = new SuggestedWords( 28 new ArrayList<SuggestedWordInfo>(0), false, false, false, false, false, false); 29 30 public final boolean mTypedWordValid; 31 public final boolean mHasAutoCorrectionCandidate; 32 public final boolean mIsPunctuationSuggestions; 33 public final boolean mAllowsToBeAutoCorrected; 34 public final boolean mIsObsoleteSuggestions; 35 public final boolean mIsPrediction; 36 private final ArrayList<SuggestedWordInfo> mSuggestedWordInfoList; 37 38 public SuggestedWords(final ArrayList<SuggestedWordInfo> suggestedWordInfoList, 39 final boolean typedWordValid, 40 final boolean hasAutoCorrectionCandidate, 41 final boolean allowsToBeAutoCorrected, 42 final boolean isPunctuationSuggestions, 43 final boolean isObsoleteSuggestions, 44 final boolean isPrediction) { 45 mSuggestedWordInfoList = suggestedWordInfoList; 46 mTypedWordValid = typedWordValid; 47 mHasAutoCorrectionCandidate = hasAutoCorrectionCandidate; 48 mAllowsToBeAutoCorrected = allowsToBeAutoCorrected; 49 mIsPunctuationSuggestions = isPunctuationSuggestions; 50 mIsObsoleteSuggestions = isObsoleteSuggestions; 51 mIsPrediction = isPrediction; 52 } 53 54 public int size() { 55 return mSuggestedWordInfoList.size(); 56 } 57 58 public CharSequence getWord(int pos) { 59 return mSuggestedWordInfoList.get(pos).mWord; 60 } 61 62 public SuggestedWordInfo getWordInfo(int pos) { 63 return mSuggestedWordInfoList.get(pos); 64 } 65 66 public SuggestedWordInfo getInfo(int pos) { 67 return mSuggestedWordInfoList.get(pos); 68 } 69 70 public boolean hasAutoCorrectionWord() { 71 return mHasAutoCorrectionCandidate && size() > 1 && !mTypedWordValid; 72 } 73 74 public boolean willAutoCorrect() { 75 return !mTypedWordValid && mHasAutoCorrectionCandidate; 76 } 77 78 @Override 79 public String toString() { 80 // Pretty-print method to help debug 81 return "SuggestedWords:" 82 + " mTypedWordValid=" + mTypedWordValid 83 + " mHasAutoCorrectionCandidate=" + mHasAutoCorrectionCandidate 84 + " mAllowsToBeAutoCorrected=" + mAllowsToBeAutoCorrected 85 + " mIsPunctuationSuggestions=" + mIsPunctuationSuggestions 86 + " words=" + Arrays.toString(mSuggestedWordInfoList.toArray()); 87 } 88 89 public static ArrayList<SuggestedWordInfo> getFromApplicationSpecifiedCompletions( 90 final CompletionInfo[] infos) { 91 final ArrayList<SuggestedWordInfo> result = new ArrayList<SuggestedWordInfo>(); 92 for (CompletionInfo info : infos) { 93 if (null != info && info.getText() != null) { 94 result.add(new SuggestedWordInfo(info.getText(), SuggestedWordInfo.MAX_SCORE, 95 SuggestedWordInfo.KIND_APP_DEFINED, Dictionary.TYPE_APPLICATION_DEFINED)); 96 } 97 } 98 return result; 99 } 100 101 // Should get rid of the first one (what the user typed previously) from suggestions 102 // and replace it with what the user currently typed. 103 public static ArrayList<SuggestedWordInfo> getTypedWordAndPreviousSuggestions( 104 final CharSequence typedWord, final SuggestedWords previousSuggestions) { 105 final ArrayList<SuggestedWordInfo> suggestionsList = new ArrayList<SuggestedWordInfo>(); 106 final HashSet<String> alreadySeen = new HashSet<String>(); 107 suggestionsList.add(new SuggestedWordInfo(typedWord, SuggestedWordInfo.MAX_SCORE, 108 SuggestedWordInfo.KIND_TYPED, Dictionary.TYPE_USER_TYPED)); 109 alreadySeen.add(typedWord.toString()); 110 final int previousSize = previousSuggestions.size(); 111 for (int pos = 1; pos < previousSize; pos++) { 112 final SuggestedWordInfo prevWordInfo = previousSuggestions.getWordInfo(pos); 113 final String prevWord = prevWordInfo.mWord.toString(); 114 // Filter out duplicate suggestion. 115 if (!alreadySeen.contains(prevWord)) { 116 suggestionsList.add(prevWordInfo); 117 alreadySeen.add(prevWord); 118 } 119 } 120 return suggestionsList; 121 } 122 123 public static class SuggestedWordInfo { 124 public static final int MAX_SCORE = Integer.MAX_VALUE; 125 public static final int KIND_TYPED = 0; // What user typed 126 public static final int KIND_CORRECTION = 1; // Simple correction/suggestion 127 public static final int KIND_COMPLETION = 2; // Completion (suggestion with appended chars) 128 public static final int KIND_WHITELIST = 3; // Whitelisted word 129 public static final int KIND_BLACKLIST = 4; // Blacklisted word 130 public static final int KIND_HARDCODED = 5; // Hardcoded suggestion, e.g. punctuation 131 public static final int KIND_APP_DEFINED = 6; // Suggested by the application 132 public static final int KIND_SHORTCUT = 7; // A shortcut 133 private final String mWordStr; 134 public final CharSequence mWord; 135 public final int mScore; 136 public final int mKind; // one of the KIND_* constants above 137 public final int mCodePointCount; 138 public final String mSourceDict; 139 private String mDebugString = ""; 140 141 public SuggestedWordInfo(final CharSequence word, final int score, final int kind, 142 final String sourceDict) { 143 mWordStr = word.toString(); 144 mWord = word; 145 mScore = score; 146 mKind = kind; 147 mSourceDict = sourceDict; 148 mCodePointCount = StringUtils.codePointCount(mWordStr); 149 } 150 151 152 public void setDebugString(String str) { 153 if (null == str) throw new NullPointerException("Debug info is null"); 154 mDebugString = str; 155 } 156 157 public String getDebugString() { 158 return mDebugString; 159 } 160 161 public int codePointCount() { 162 return mCodePointCount; 163 } 164 165 public int codePointAt(int i) { 166 return mWordStr.codePointAt(i); 167 } 168 169 @Override 170 public String toString() { 171 if (TextUtils.isEmpty(mDebugString)) { 172 return mWordStr; 173 } else { 174 return mWordStr + " (" + mDebugString.toString() + ")"; 175 } 176 } 177 178 // TODO: Consolidate this method and StringUtils.removeDupes() in the future. 179 public static void removeDups(ArrayList<SuggestedWordInfo> candidates) { 180 if (candidates.size() <= 1) { 181 return; 182 } 183 int i = 1; 184 while(i < candidates.size()) { 185 final SuggestedWordInfo cur = candidates.get(i); 186 for (int j = 0; j < i; ++j) { 187 final SuggestedWordInfo previous = candidates.get(j); 188 if (TextUtils.equals(cur.mWord, previous.mWord)) { 189 candidates.remove(cur.mScore < previous.mScore ? i : j); 190 --i; 191 break; 192 } 193 } 194 ++i; 195 } 196 } 197 } 198} 199