Merge "Introduce SuggestedWords class to represent suggestions list"

main
Tadashi G. Takaoka 2010-12-12 03:58:50 -08:00 committed by Android (Google) Code Review
commit 3ef38b2907
7 changed files with 254 additions and 147 deletions

View File

@ -23,6 +23,7 @@
android:layout_width="match_parent"
android:layout_height="@dimen/candidate_strip_height"
android:orientation="horizontal"
android:paddingRight="12dip"
>
<ImageView
android:id="@+id/candidate_divider"
@ -44,6 +45,16 @@
android:focusable="true"
android:clickable="true"
android:gravity="center_vertical|center_horizontal"
android:paddingLeft="12dip"
android:paddingRight="12dip" />
android:paddingLeft="12dip" />
<TextView
android:id="@+id/candidate_debug_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:textSize="10dip"
android:textColor="#ff808080"
android:focusable="false"
android:clickable="false"
android:gravity="bottom"
android:paddingLeft="4dip" />
</LinearLayout>

View File

@ -43,11 +43,9 @@ import android.widget.PopupWindow;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class CandidateView extends LinearLayout implements OnClickListener, OnLongClickListener {
private LatinIME mService;
private final ArrayList<CharSequence> mSuggestions = new ArrayList<CharSequence>();
private final ArrayList<View> mWords = new ArrayList<View>();
private final TextView mPreviewText;
@ -64,27 +62,12 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
private final CharacterStyle mInvertedForegroundColorSpan;
private final CharacterStyle mInvertedBackgroundColorSpan;
private boolean mShowingCompletions;
private SuggestedWords mSuggestions = SuggestedWords.EMPTY;
private boolean mShowingAutoCorrectionInverted;
private boolean mShowingAddToDictionary;
private final UiHandler mHandler = new UiHandler();
private static class UpdateSuggestionsArgs {
public final List<CharSequence> mSuggestions;
public final boolean mCompletions;
public final boolean mTypedWordValid;
public final boolean mHaveMinimalSuggestion;
public UpdateSuggestionsArgs(List<CharSequence> suggestions, boolean completions,
boolean typedWordValid, boolean haveMinimalSuggestion) {
mSuggestions = suggestions;
mCompletions = completions;
mTypedWordValid = typedWordValid;
mHaveMinimalSuggestion = haveMinimalSuggestion;
}
}
private class UiHandler extends Handler {
private static final int MSG_HIDE_PREVIEW = 0;
private static final int MSG_UPDATE_SUGGESTION = 1;
@ -99,9 +82,7 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
hidePreview();
break;
case MSG_UPDATE_SUGGESTION:
UpdateSuggestionsArgs args = (UpdateSuggestionsArgs)msg.obj;
updateSuggestions(args.mSuggestions, args.mCompletions, args.mTypedWordValid,
args.mHaveMinimalSuggestion);
updateSuggestions((SuggestedWords)msg.obj);
break;
}
}
@ -115,11 +96,9 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
removeMessages(MSG_HIDE_PREVIEW);
}
public void postUpdateSuggestions(List<CharSequence> suggestions, boolean completions,
boolean typedWordValid, boolean haveMinimalSuggestion) {
public void postUpdateSuggestions(SuggestedWords suggestions) {
cancelUpdateSuggestions();
sendMessageDelayed(obtainMessage(MSG_UPDATE_SUGGESTION, new UpdateSuggestionsArgs(
suggestions, completions, typedWordValid, haveMinimalSuggestion)),
sendMessageDelayed(obtainMessage(MSG_UPDATE_SUGGESTION, suggestions),
DELAY_UPDATE_SUGGESTION);
}
@ -167,7 +146,7 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
tv.setOnLongClickListener(this);
ImageView divider = (ImageView)v.findViewById(R.id.candidate_divider);
// Do not display divider of first candidate.
divider.setVisibility(i == 0 ? View.GONE : View.VISIBLE);
divider.setVisibility(i == 0 ? GONE : VISIBLE);
mWords.add(v);
}
@ -182,44 +161,35 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
mService = listener;
}
public void setSuggestions(List<CharSequence> suggestions, boolean completions,
boolean typedWordValid, boolean haveMinimalSuggestion) {
// Don't update suggestions when there is zero or only one suggestion found.
if (suggestions != null && suggestions.size() <= 1)
public void setSuggestions(SuggestedWords suggestions) {
// Don't update suggestions when there is only one suggestion found.
// Empty (size zero) suggestions will be passed in order to clear candidate view.
if (suggestions == null || suggestions.size() == 1)
return;
if (mShowingAutoCorrectionInverted) {
mHandler.postUpdateSuggestions(suggestions, completions, typedWordValid,
haveMinimalSuggestion);
mHandler.postUpdateSuggestions(suggestions);
} else {
updateSuggestions(suggestions, completions, typedWordValid, haveMinimalSuggestion);
updateSuggestions(suggestions);
}
}
private void updateSuggestions(List<CharSequence> suggestions, boolean completions,
boolean typedWordValid, boolean haveMinimalSuggestion) {
private void updateSuggestions(SuggestedWords suggestions) {
clear();
if (suggestions != null) {
int insertCount = Math.min(suggestions.size(), MAX_SUGGESTIONS);
for (CharSequence suggestion : suggestions) {
mSuggestions.add(suggestion);
if (--insertCount == 0)
break;
}
}
final int count = mSuggestions.size();
boolean existsAutoCompletion = false;
mSuggestions = suggestions;
final int count = suggestions.size();
final Object[] debugInfo = suggestions.mDebugInfo;
for (int i = 0; i < count; i++) {
CharSequence suggestion = mSuggestions.get(i);
if (suggestion == null) continue;
final int wordLength = suggestion.length();
CharSequence word = suggestions.getWord(i);
if (word == null) continue;
final int wordLength = word.length();
final View v = mWords.get(i);
final TextView tv = (TextView)v.findViewById(R.id.candidate_word);
final TextView dv = (TextView)v.findViewById(R.id.candidate_debug_info);
tv.setTextColor(mColorNormal);
if (haveMinimalSuggestion
&& ((i == 1 && !typedWordValid) || (i == 0 && typedWordValid))) {
if (suggestions.mHasMinimalSuggestion
&& ((i == 1 && !suggestions.mTypedWordValid) ||
(i == 0 && suggestions.mTypedWordValid))) {
final CharacterStyle style;
if (mConfigCandidateHighlightFontColorEnabled) {
style = BOLD_SPAN;
@ -227,10 +197,9 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
} else {
style = UNDERLINE_SPAN;
}
final Spannable word = new SpannableString(suggestion);
word.setSpan(style, 0, wordLength, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
suggestion = word;
existsAutoCompletion = true;
final Spannable spannedWord = new SpannableString(word);
spannedWord.setSpan(style, 0, wordLength, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
word = spannedWord;
} else if (i != 0 || (wordLength == 1 && count > 1)) {
// HACK: even if i == 0, we use mColorOther when this
// suggestion's length is 1
@ -239,16 +208,18 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
if (mConfigCandidateHighlightFontColorEnabled)
tv.setTextColor(mColorOther);
}
tv.setText(suggestion);
tv.setText(word);
tv.setClickable(true);
if (debugInfo != null && i < debugInfo.length && debugInfo[i] != null
&& !TextUtils.isEmpty(debugInfo[i].toString())) {
dv.setText(debugInfo[i].toString());
dv.setVisibility(VISIBLE);
} else {
dv.setVisibility(GONE);
}
addView(v);
}
mShowingCompletions = completions;
// TODO: Move this call back to LatinIME
if (mConfigCandidateHighlightFontColorEnabled)
mService.onAutoCompletionStateChanged(existsAutoCompletion);
scrollTo(0, getScrollY());
requestLayout();
}
@ -267,15 +238,19 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
mShowingAutoCorrectionInverted = true;
}
public boolean isConfigCandidateHighlightFontColorEnabled() {
return mConfigCandidateHighlightFontColorEnabled;
}
public boolean isShowingAddToDictionaryHint() {
return mShowingAddToDictionary;
}
public void showAddToDictionaryHint(CharSequence word) {
ArrayList<CharSequence> suggestions = new ArrayList<CharSequence>();
suggestions.add(word);
suggestions.add(getContext().getText(R.string.hint_add_to_dictionary));
setSuggestions(suggestions, false, false, false);
SuggestedWords.Builder builder = new SuggestedWords.Builder()
.addWord(word)
.addWord(getContext().getText(R.string.hint_add_to_dictionary));
setSuggestions(builder.build());
mShowingAddToDictionary = true;
// Disable R.string.hint_add_to_dictionary button
TextView tv = (TextView)getChildAt(1).findViewById(R.id.candidate_word);
@ -288,14 +263,11 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
return true;
}
/* package */ List<CharSequence> getSuggestions() {
public SuggestedWords getSuggestions() {
return mSuggestions;
}
public void clear() {
// Don't call mSuggestions.clear() because it's being used for logging
// in LatinIME.pickSuggestionManually().
mSuggestions.clear();
mShowingAddToDictionary = false;
mShowingAutoCorrectionInverted = false;
removeAllViews();
@ -337,7 +309,7 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
@Override
public boolean onLongClick(View view) {
int index = (Integer) view.getTag();
CharSequence word = mSuggestions.get(index);
CharSequence word = mSuggestions.getWord(index);
if (word.length() < 2)
return false;
addToDictionary(word);
@ -347,12 +319,12 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
@Override
public void onClick(View view) {
int index = (Integer) view.getTag();
CharSequence word = mSuggestions.get(index);
CharSequence word = mSuggestions.getWord(index);
if (mShowingAddToDictionary && index == 0) {
addToDictionary(word);
} else {
if (!mShowingCompletions) {
TextEntryState.acceptedSuggestion(mSuggestions.get(0), word);
if (!mSuggestions.mIsApplicationSpecifiedCompletions) {
TextEntryState.acceptedSuggestion(mSuggestions.getWord(0), word);
}
mService.pickSuggestionManually(index, word);
}

View File

@ -77,7 +77,6 @@ import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
/**
@ -162,7 +161,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
// Keep track of the last selection range to decide if we need to show word alternatives
private int mLastSelectionStart;
private int mLastSelectionEnd;
private List<CharSequence> mSuggestPuncList;
private SuggestedWords mSuggestPuncList;
// Input type is such that we should not auto-correct
private boolean mInputTypeNoAutoCorrect;
@ -212,7 +211,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
return mChosenWord;
}
public abstract List<CharSequence> getAlternatives();
public abstract SuggestedWords.Builder getAlternatives();
}
public class TypedWordAlternatives extends WordAlternatives {
@ -233,7 +232,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
}
@Override
public List<CharSequence> getAlternatives() {
public SuggestedWords.Builder getAlternatives() {
return getTypedSuggestions(word);
}
}
@ -655,7 +654,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
super.onFinishInput();
LatinImeLogger.commit();
onAutoCompletionStateChanged(false);
mKeyboardSwitcher.onAutoCompletionStateChanged(false);
mVoiceConnector.flushVoiceInputLogs(mConfigurationChanging);
@ -790,7 +789,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
@Override
public void hideWindow() {
LatinImeLogger.commit();
onAutoCompletionStateChanged(false);
mKeyboardSwitcher.onAutoCompletionStateChanged(false);
if (TRACE) Debug.stopMethodTracing();
if (mOptionsDialog != null && mOptionsDialog.isShowing()) {
@ -818,13 +817,12 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
return;
}
List<CharSequence> stringList = new ArrayList<CharSequence>();
for (int i = 0; i < completions.length; i++) {
CompletionInfo ci = completions[i];
if (ci != null) stringList.add(ci.getText());
}
SuggestedWords.Builder builder = new SuggestedWords.Builder()
.setApplicationSpecifiedCompletions(completions)
.setTypedWordValid(true)
.setHasMinimalSuggestion(true);
// When in fullscreen mode, show completions generated by the application
setSuggestions(stringList, true, true, true);
setSuggestions(builder.build());
mBestWord = null;
setCandidatesViewShown(true);
}
@ -1382,7 +1380,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
}
private boolean isShowingPunctuationList() {
return mSuggestPuncList.equals(mCandidateView.getSuggestions());
return mSuggestPuncList == mCandidateView.getSuggestions();
}
private boolean isSuggestionShown() {
@ -1422,22 +1420,18 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
}
public void clearSuggestions() {
setSuggestions(null, false, false, false);
setSuggestions(SuggestedWords.EMPTY);
}
public void setSuggestions(
List<CharSequence> suggestions,
boolean completions,
boolean typedWordValid,
boolean haveMinimalSuggestion) {
public void setSuggestions(SuggestedWords words) {
if (mVoiceConnector.getAndResetIsShowingHint()) {
setCandidatesView(mCandidateViewContainer);
}
if (mCandidateView != null) {
mCandidateView.setSuggestions(
suggestions, completions, typedWordValid, haveMinimalSuggestion);
mCandidateView.setSuggestions(words);
if (mCandidateView.isConfigCandidateHighlightFontColorEnabled())
mKeyboardSwitcher.onAutoCompletionStateChanged(words.hasAutoCorrectionWord());
}
}
@ -1457,16 +1451,16 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
showSuggestions(mWord);
}
private List<CharSequence> getTypedSuggestions(WordComposer word) {
List<CharSequence> stringList = mSuggest.getSuggestions(
private SuggestedWords.Builder getTypedSuggestions(WordComposer word) {
return mSuggest.getSuggestedWordBuilder(
mKeyboardSwitcher.getInputView(), word, false, null);
return stringList;
}
private void showCorrections(WordAlternatives alternatives) {
mKeyboardSwitcher.setPreferredLetters(null);
List<CharSequence> stringList = alternatives.getAlternatives();
showSuggestions(stringList, alternatives.getOriginalWord(), false, false);
SuggestedWords.Builder builder = alternatives.getAlternatives();
builder.setTypedWordValid(false).setHasMinimalSuggestion(false);
showSuggestions(builder.build(), alternatives.getOriginalWord());
}
private void showSuggestions(WordComposer word) {
@ -1474,7 +1468,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
// TODO Maybe need better way of retrieving previous word
CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(),
mWordSeparators);
List<CharSequence> stringList = mSuggest.getSuggestions(
SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder(
mKeyboardSwitcher.getInputView(), word, false, prevWord);
// long stopTime = System.currentTimeMillis(); // TIME MEASUREMENT!
// Log.d("LatinIME","Suggest Total Time - " + (stopTime - startTime));
@ -1497,15 +1491,16 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
correctionAvailable &= !word.isMostlyCaps();
correctionAvailable &= !TextEntryState.isCorrecting();
showSuggestions(stringList, typedWord, typedWordValid, correctionAvailable);
builder.setTypedWordValid(typedWordValid).setHasMinimalSuggestion(correctionAvailable);
showSuggestions(builder.build(), typedWord);
}
private void showSuggestions(List<CharSequence> stringList, CharSequence typedWord,
boolean typedWordValid, boolean correctionAvailable) {
setSuggestions(stringList, false, typedWordValid, correctionAvailable);
if (stringList.size() > 0) {
if (correctionAvailable && !typedWordValid && stringList.size() > 1) {
mBestWord = stringList.get(1);
private void showSuggestions(SuggestedWords suggestedWords, CharSequence typedWord) {
setSuggestions(suggestedWords);
if (suggestedWords.size() > 0) {
if (suggestedWords.mHasMinimalSuggestion
&& !suggestedWords.mTypedWordValid && suggestedWords.size() > 1) {
mBestWord = suggestedWords.getWord(1);
} else {
mBestWord = typedWord;
}
@ -1534,7 +1529,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
}
public void pickSuggestionManually(int index, CharSequence suggestion) {
List<CharSequence> suggestions = mCandidateView.getSuggestions();
SuggestedWords suggestions = mCandidateView.getSuggestions();
mVoiceConnector.flushAndLogAllTextModificationCounters(index, suggestion, mWordSeparators);
final boolean correcting = TextEntryState.isCorrecting();
@ -1565,7 +1560,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
// Word separators are suggested before the user inputs something.
// So, LatinImeLogger logs "" as a user's input.
LatinImeLogger.logOnManualSuggestion(
"", suggestion.toString(), index, suggestions);
"", suggestion.toString(), index, suggestions.mWords);
final char primaryCode = suggestion.charAt(0);
onKey(primaryCode, new int[]{primaryCode}, KeyboardView.NOT_A_TOUCH_COORDINATE,
KeyboardView.NOT_A_TOUCH_COORDINATE);
@ -1583,7 +1578,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
addToBigramDictionary(suggestion, 1);
}
LatinImeLogger.logOnManualSuggestion(mComposing.toString(), suggestion.toString(),
index, suggestions);
index, suggestions.mWords);
TextEntryState.acceptedSuggestion(mComposing.toString(), suggestion);
// Follow it with a space
if (mAutoSpace && !correcting) {
@ -1718,7 +1713,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
private void setPunctuationSuggestions() {
setCandidatesViewShown(isCandidateStripVisible());
setSuggestions(mSuggestPuncList, false, false, false);
setSuggestions(mSuggestPuncList);
}
private void addToDictionaries(CharSequence suggestion, int frequencyDelta) {
@ -2106,13 +2101,17 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
}
private void initSuggestPuncList() {
mSuggestPuncList = new ArrayList<CharSequence>();
mSuggestPuncs = mResources.getString(R.string.suggested_punctuations);
if (mSuggestPuncs != null) {
for (int i = 0; i < mSuggestPuncs.length(); i++) {
mSuggestPuncList.add(mSuggestPuncs.subSequence(i, i + 1));
if (mSuggestPuncs != null || mSuggestPuncList != null)
return;
SuggestedWords.Builder builder = new SuggestedWords.Builder();
String puncs = mResources.getString(R.string.suggested_punctuations);
if (puncs != null) {
for (int i = 0; i < puncs.length(); i++) {
builder.addWord(puncs.subSequence(i, i + 1));
}
}
mSuggestPuncList = builder.build();
mSuggestPuncs = puncs;
}
private boolean isSuggestedPunctuation(int code) {
@ -2192,10 +2191,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
System.out.println("CPS = " + ((CPS_BUFFER_SIZE * 1000f) / total));
}
public void onAutoCompletionStateChanged(boolean isAutoCompletion) {
mKeyboardSwitcher.onAutoCompletionStateChanged(isAutoCompletion);
}
@Override
public void onCurrentInputMethodSubtypeChanged(InputMethodSubtype subtype) {
SubtypeSwitcher.getInstance().updateSubtype(subtype);

View File

@ -25,12 +25,10 @@ import android.view.View;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* This class loads a dictionary and provides a list of suggestions for a given sequence of
* characters. This includes corrections and completions.
* @hide pending API Council Approval
*/
public class Suggest implements Dictionary.WordCallback {
@ -191,14 +189,21 @@ public class Suggest implements Dictionary.WordCallback {
}
/**
* Returns a list of words that match the list of character codes passed in.
* This list will be overwritten the next time this function is called.
* Returns a object which represents suggested words that match the list of character codes
* passed in. This object contents will be overwritten the next time this function is called.
* @param view a view for retrieving the context for AutoText
* @param wordComposer contains what is currently being typed
* @param prevWordForBigram previous word (used only for bigram)
* @return list of suggestions.
* @return suggested words object.
*/
public List<CharSequence> getSuggestions(View view, WordComposer wordComposer,
public SuggestedWords getSuggestions(View view, WordComposer wordComposer,
boolean includeTypedWordIfValid, CharSequence prevWordForBigram) {
return getSuggestedWordBuilder(view, wordComposer, includeTypedWordIfValid,
prevWordForBigram).build();
}
// TODO: cleanup dictionaries looking up and suggestions building with SuggestedWords.Builder
public SuggestedWords.Builder getSuggestedWordBuilder(View view, WordComposer wordComposer,
boolean includeTypedWordIfValid, CharSequence prevWordForBigram) {
LatinImeLogger.onStartSuggestion(prevWordForBigram);
mHaveCorrection = false;
@ -342,7 +347,7 @@ public class Suggest implements Dictionary.WordCallback {
}
}
removeDupes();
return mSuggestions;
return new SuggestedWords.Builder().setWords(mSuggestions);
}
public int[] getNextLettersFrequencies() {

View File

@ -0,0 +1,120 @@
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.android.inputmethod.latin;
import android.view.inputmethod.CompletionInfo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class SuggestedWords {
public static final SuggestedWords EMPTY = new SuggestedWords(null, false, false, false, null);
public final List<CharSequence> mWords;
public final boolean mIsApplicationSpecifiedCompletions;
public final boolean mTypedWordValid;
public final boolean mHasMinimalSuggestion;
public final Object[] mDebugInfo;
private SuggestedWords(List<CharSequence> words, boolean isApplicationSpecifiedCompletions,
boolean typedWordValid, boolean hasMinamlSuggestion, Object[] debugInfo) {
if (words != null) {
mWords = words;
} else {
mWords = Collections.emptyList();
}
mIsApplicationSpecifiedCompletions = isApplicationSpecifiedCompletions;
mTypedWordValid = typedWordValid;
mHasMinimalSuggestion = hasMinamlSuggestion;
mDebugInfo = debugInfo;
}
public int size() {
return mWords.size();
}
public CharSequence getWord(int pos) {
return mWords.get(pos);
}
public boolean hasAutoCorrectionWord() {
return mHasMinimalSuggestion && ((size() >= 1 && !mTypedWordValid) || mTypedWordValid);
}
public static class Builder {
private List<CharSequence> mWords;
private boolean mIsCompletions;
private boolean mTypedWordVallid;
private boolean mHasMinimalSuggestion;
private Object[] mDebugInfo;
public Builder() {
// Nothing to do here.
}
public Builder setWords(List<CharSequence> words) {
mWords = words;
return this;
}
public Builder setDebugInfo(Object[] debuginfo) {
mDebugInfo = debuginfo;
return this;
}
public Builder addWord(int pos, CharSequence word) {
if (mWords == null)
mWords = new ArrayList<CharSequence>();
mWords.add(pos, word);
return this;
}
public Builder addWord(CharSequence word) {
if (mWords == null)
mWords = new ArrayList<CharSequence>();
mWords.add(word);
return this;
}
public Builder setApplicationSpecifiedCompletions(CompletionInfo[] infos) {
for (CompletionInfo info : infos)
addWord(info.getText());
mIsCompletions = true;
return this;
}
public Builder setTypedWordValid(boolean typedWordValid) {
mTypedWordVallid = typedWordValid;
return this;
}
public Builder setHasMinimalSuggestion(boolean hasMinamlSuggestion) {
mHasMinimalSuggestion = hasMinamlSuggestion;
return this;
}
public CharSequence getWord(int pos) {
return mWords.get(pos);
}
public SuggestedWords build() {
return new SuggestedWords(mWords, mIsCompletions, mTypedWordVallid,
mHasMinimalSuggestion, mDebugInfo);
}
}
}

View File

@ -22,6 +22,7 @@ import com.android.inputmethod.latin.LatinIME.UIHandler;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.SharedPreferencesCompat;
import com.android.inputmethod.latin.SubtypeSwitcher;
import com.android.inputmethod.latin.SuggestedWords;
import android.app.AlertDialog;
import android.content.Context;
@ -424,17 +425,20 @@ public class VoiceIMEConnector implements VoiceInput.UiListener {
if (mWordToSuggestions.containsKey(selectedWord)) {
mShowingVoiceSuggestions = true;
List<CharSequence> suggestions = mWordToSuggestions.get(selectedWord);
SuggestedWords.Builder builder = new SuggestedWords.Builder();
// If the first letter of touching is capitalized, make all the suggestions
// start with a capital letter.
if (Character.isUpperCase(touching.mWord.charAt(0))) {
for (int i = 0; i < suggestions.size(); i++) {
String origSugg = (String) suggestions.get(i);
String capsSugg = origSugg.toUpperCase().charAt(0)
+ origSugg.subSequence(1, origSugg.length()).toString();
suggestions.set(i, capsSugg);
for (CharSequence word : suggestions) {
String str = word.toString();
word = Character.toUpperCase(str.charAt(0)) + str.substring(1);
builder.addWord(word);
}
} else {
builder.setWords(suggestions);
}
mContext.setSuggestions(suggestions, false, true, true);
builder.setTypedWordValid(true).setHasMinimalSuggestion(true);
mContext.setSuggestions(builder.build());
mContext.setCandidatesViewShown(true);
return true;
}

View File

@ -116,30 +116,30 @@ public class SuggestHelper {
return word;
}
private boolean isDefaultSuggestion(List<CharSequence> suggestions, CharSequence word) {
private boolean isDefaultSuggestion(SuggestedWords suggestions, CharSequence word) {
// Check if either the word is what you typed or the first alternative
return suggestions.size() > 0 &&
(/*TextUtils.equals(suggestions.get(0), word) || */
(suggestions.size() > 1 && TextUtils.equals(suggestions.get(1), word)));
(suggestions.size() > 1 && TextUtils.equals(suggestions.getWord(1), word)));
}
boolean isDefaultSuggestion(CharSequence typed, CharSequence expected) {
WordComposer word = createWordComposer(typed);
List<CharSequence> suggestions = mSuggest.getSuggestions(null, word, false, null);
SuggestedWords suggestions = mSuggest.getSuggestions(null, word, false, null);
return isDefaultSuggestion(suggestions, expected);
}
boolean isDefaultCorrection(CharSequence typed, CharSequence expected) {
WordComposer word = createWordComposer(typed);
List<CharSequence> suggestions = mSuggest.getSuggestions(null, word, false, null);
SuggestedWords suggestions = mSuggest.getSuggestions(null, word, false, null);
return isDefaultSuggestion(suggestions, expected) && mSuggest.hasMinimalCorrection();
}
boolean isASuggestion(CharSequence typed, CharSequence expected) {
WordComposer word = createWordComposer(typed);
List<CharSequence> suggestions = mSuggest.getSuggestions(null, word, false, null);
SuggestedWords suggestions = mSuggest.getSuggestions(null, word, false, null);
for (int i = 1; i < suggestions.size(); i++) {
if (TextUtils.equals(suggestions.get(i), expected)) return true;
if (TextUtils.equals(suggestions.getWord(i), expected)) return true;
}
return false;
}
@ -155,7 +155,7 @@ public class SuggestHelper {
CharSequence expected) {
WordComposer word = createWordComposer(typed);
getBigramSuggestions(previous, typed);
List<CharSequence> suggestions = mSuggest.getSuggestions(null, word, false, previous);
SuggestedWords suggestions = mSuggest.getSuggestions(null, word, false, previous);
return isDefaultSuggestion(suggestions, expected);
}
@ -163,7 +163,7 @@ public class SuggestHelper {
CharSequence expected) {
WordComposer word = createWordComposer(typed);
getBigramSuggestions(previous, typed);
List<CharSequence> suggestions = mSuggest.getSuggestions(null, word, false, previous);
SuggestedWords suggestions = mSuggest.getSuggestions(null, word, false, previous);
return isDefaultSuggestion(suggestions, expected) && mSuggest.hasMinimalCorrection();
}
@ -171,9 +171,9 @@ public class SuggestHelper {
CharSequence expected) {
WordComposer word = createWordComposer(typed);
getBigramSuggestions(previous, typed);
List<CharSequence> suggestions = mSuggest.getSuggestions(null, word, false, previous);
SuggestedWords suggestions = mSuggest.getSuggestions(null, word, false, previous);
for (int i = 1; i < suggestions.size(); i++) {
if (TextUtils.equals(suggestions.get(i), expected)) return true;
if (TextUtils.equals(suggestions.getWord(i), expected)) return true;
}
return false;
}