am bbb6e8f1: Merge "[IL109] Move more code to InputLogic"

* commit 'bbb6e8f10f6a73049fe1ecc81a9f60f23a9f8992':
  [IL109] Move more code to InputLogic
main
Jean Chalard 2014-02-05 00:53:01 -08:00 committed by Android Git Automerger
commit 9a7e36acd9
3 changed files with 126 additions and 97 deletions

View File

@ -67,7 +67,6 @@ import com.android.inputmethod.latin.Suggest.OnGetSuggestedWordsCallback;
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import com.android.inputmethod.latin.define.ProductionFlag; import com.android.inputmethod.latin.define.ProductionFlag;
import com.android.inputmethod.latin.inputlogic.InputLogic; import com.android.inputmethod.latin.inputlogic.InputLogic;
import com.android.inputmethod.latin.inputlogic.SpaceState;
import com.android.inputmethod.latin.personalization.DictionaryDecayBroadcastReciever; import com.android.inputmethod.latin.personalization.DictionaryDecayBroadcastReciever;
import com.android.inputmethod.latin.personalization.PersonalizationDictionarySessionRegistrar; import com.android.inputmethod.latin.personalization.PersonalizationDictionarySessionRegistrar;
import com.android.inputmethod.latin.personalization.PersonalizationHelper; import com.android.inputmethod.latin.personalization.PersonalizationHelper;
@ -83,7 +82,6 @@ import com.android.inputmethod.latin.utils.CoordinateUtils;
import com.android.inputmethod.latin.utils.ImportantNoticeUtils; import com.android.inputmethod.latin.utils.ImportantNoticeUtils;
import com.android.inputmethod.latin.utils.IntentUtils; import com.android.inputmethod.latin.utils.IntentUtils;
import com.android.inputmethod.latin.utils.JniUtils; import com.android.inputmethod.latin.utils.JniUtils;
import com.android.inputmethod.latin.utils.LatinImeLoggerUtils;
import com.android.inputmethod.latin.utils.LeakGuardHandlerWrapper; import com.android.inputmethod.latin.utils.LeakGuardHandlerWrapper;
import com.android.inputmethod.latin.utils.SubtypeLocaleUtils; import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
import com.android.inputmethod.research.ResearchLogger; import com.android.inputmethod.research.ResearchLogger;
@ -124,7 +122,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
private View mKeyPreviewBackingView; private View mKeyPreviewBackingView;
private SuggestionStripView mSuggestionStripView; private SuggestionStripView mSuggestionStripView;
private CompletionInfo[] mApplicationSpecifiedCompletions; // TODO[IL]: remove this member completely.
public CompletionInfo[] mApplicationSpecifiedCompletions;
private RichInputMethodManager mRichImm; private RichInputMethodManager mRichImm;
@UsedForTesting final KeyboardSwitcher mKeyboardSwitcher; @UsedForTesting final KeyboardSwitcher mKeyboardSwitcher;
@ -1307,12 +1306,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
// Nothing to do so far. // Nothing to do so far.
} }
// TODO[IL]: Move this to InputLogic and make it private // TODO: remove this, read this directly from mInputLogic or something in the tests
@Override @UsedForTesting
public boolean isShowingPunctuationList() { public boolean isShowingPunctuationList() {
if (mInputLogic.mSuggestedWords == null) return false; return mInputLogic.isShowingPunctuationList(mSettings.getCurrent());
return mSettings.getCurrent().mSpacingAndPunctuations.mSuggestPuncList
== mInputLogic.mSuggestedWords;
} }
// TODO[IL]: Define a clear interface for this // TODO[IL]: Define a clear interface for this
@ -1457,94 +1454,14 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
// interface // interface
@Override @Override
public void pickSuggestionManually(final int index, final SuggestedWordInfo suggestionInfo) { public void pickSuggestionManually(final int index, final SuggestedWordInfo suggestionInfo) {
final SuggestedWords suggestedWords = mInputLogic.mSuggestedWords; mInputLogic.onPickSuggestionManually(mSettings.getCurrent(), index, suggestionInfo,
final String suggestion = suggestionInfo.mWord; mHandler, mKeyboardSwitcher);
// If this is a punctuation picked from the suggestion strip, pass it to onCodeInput }
if (suggestion.length() == 1 && isShowingPunctuationList()) {
// Word separators are suggested before the user inputs something.
// So, LatinImeLogger logs "" as a user's input.
LatinImeLogger.logOnManualSuggestion("", suggestion, index, suggestedWords);
// Rely on onCodeInput to do the complicated swapping/stripping logic consistently.
final int primaryCode = suggestion.charAt(0);
onCodeInput(primaryCode,
Constants.SUGGESTION_STRIP_COORDINATE, Constants.SUGGESTION_STRIP_COORDINATE);
if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
ResearchLogger.latinIME_punctuationSuggestion(index, suggestion,
false /* isBatchMode */, suggestedWords.mIsPrediction);
}
return;
}
mInputLogic.mConnection.beginBatchEdit(); @Override
final SettingsValues currentSettings = mSettings.getCurrent(); public void showAddToDictionaryHint(final String word) {
if (SpaceState.PHANTOM == mInputLogic.mSpaceState && suggestion.length() > 0 if (null == mSuggestionStripView) return;
// In the batch input mode, a manually picked suggested word should just replace mSuggestionStripView.showAddToDictionaryHint(word);
// the current batch input text and there is no need for a phantom space.
&& !mInputLogic.mWordComposer.isBatchMode()) {
final int firstChar = Character.codePointAt(suggestion, 0);
if (!currentSettings.isWordSeparator(firstChar)
|| currentSettings.isUsuallyPrecededBySpace(firstChar)) {
mInputLogic.promotePhantomSpace(currentSettings);
}
}
if (currentSettings.isApplicationSpecifiedCompletionsOn()
&& mApplicationSpecifiedCompletions != null
&& index >= 0 && index < mApplicationSpecifiedCompletions.length) {
mInputLogic.mSuggestedWords = SuggestedWords.EMPTY;
if (mSuggestionStripView != null) {
mSuggestionStripView.clear();
}
mKeyboardSwitcher.updateShiftState();
mInputLogic.resetComposingState(true /* alsoResetLastComposedWord */);
final CompletionInfo completionInfo = mApplicationSpecifiedCompletions[index];
mInputLogic.mConnection.commitCompletion(completionInfo);
mInputLogic.mConnection.endBatchEdit();
return;
}
// We need to log before we commit, because the word composer will store away the user
// typed word.
final String replacedWord = mInputLogic.mWordComposer.getTypedWord();
LatinImeLogger.logOnManualSuggestion(replacedWord, suggestion, index, suggestedWords);
mInputLogic.commitChosenWord(currentSettings, suggestion,
LastComposedWord.COMMIT_TYPE_MANUAL_PICK, LastComposedWord.NOT_A_SEPARATOR);
if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
ResearchLogger.latinIME_pickSuggestionManually(replacedWord, index, suggestion,
mInputLogic.mWordComposer.isBatchMode(), suggestionInfo.mScore,
suggestionInfo.mKind, suggestionInfo.mSourceDict.mDictType);
}
mInputLogic.mConnection.endBatchEdit();
// Don't allow cancellation of manual pick
mInputLogic.mLastComposedWord.deactivate();
// Space state must be updated before calling updateShiftState
mInputLogic.mSpaceState = SpaceState.PHANTOM;
mKeyboardSwitcher.updateShiftState();
// We should show the "Touch again to save" hint if the user pressed the first entry
// AND it's in none of our current dictionaries (main, user or otherwise).
// Please note that if mSuggest is null, it means that everything is off: suggestion
// and correction, so we shouldn't try to show the hint
final Suggest suggest = mInputLogic.mSuggest;
final boolean showingAddToDictionaryHint =
(SuggestedWordInfo.KIND_TYPED == suggestionInfo.mKind
|| SuggestedWordInfo.KIND_OOV_CORRECTION == suggestionInfo.mKind)
&& suggest != null
// If the suggestion is not in the dictionary, the hint should be shown.
&& !suggest.mDictionaryFacilitator.isValidWord(suggestion,
true /* ignoreCase */);
if (currentSettings.mIsInternal) {
LatinImeLoggerUtils.onSeparator((char)Constants.CODE_SPACE,
Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE);
}
if (showingAddToDictionaryHint
&& suggest.mDictionaryFacilitator.isUserDictionaryEnabled()) {
mSuggestionStripView.showAddToDictionaryHint(suggestion);
} else {
// If we're not showing the "Touch again to save", then update the suggestion strip.
mHandler.postUpdateSuggestionStrip();
}
} }
// TODO[IL]: Define a clean interface for this // TODO[IL]: Define a clean interface for this

View File

@ -23,6 +23,7 @@ import android.text.style.SuggestionSpan;
import android.util.Log; import android.util.Log;
import android.view.KeyCharacterMap; import android.view.KeyCharacterMap;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.inputmethod.CompletionInfo;
import android.view.inputmethod.CorrectionInfo; import android.view.inputmethod.CorrectionInfo;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
@ -182,6 +183,108 @@ public final class InputLogic {
mEnteredText = text; mEnteredText = text;
} }
/**
* A suggestion was picked from the suggestion strip.
* @param settingsValues the current values of the settings.
* @param index the index of the suggestion.
* @param suggestionInfo the suggestion info.
*/
// Called from {@link SuggestionStripView} through the {@link SuggestionStripView#Listener}
// interface
public void onPickSuggestionManually(final SettingsValues settingsValues,
final int index, final SuggestedWordInfo suggestionInfo,
// TODO: remove these two arguments
final LatinIME.UIHandler handler, final KeyboardSwitcher keyboardSwitcher) {
final SuggestedWords suggestedWords = mSuggestedWords;
final String suggestion = suggestionInfo.mWord;
// If this is a punctuation picked from the suggestion strip, pass it to onCodeInput
if (suggestion.length() == 1 && isShowingPunctuationList(settingsValues)) {
// Word separators are suggested before the user inputs something.
// So, LatinImeLogger logs "" as a user's input.
LatinImeLogger.logOnManualSuggestion("", suggestion, index, suggestedWords);
// Rely on onCodeInput to do the complicated swapping/stripping logic consistently.
final int primaryCode = suggestion.charAt(0);
onCodeInput(primaryCode,
Constants.SUGGESTION_STRIP_COORDINATE, Constants.SUGGESTION_STRIP_COORDINATE,
settingsValues, handler, keyboardSwitcher);
if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
ResearchLogger.latinIME_punctuationSuggestion(index, suggestion,
false /* isBatchMode */, suggestedWords.mIsPrediction);
}
return;
}
mConnection.beginBatchEdit();
if (SpaceState.PHANTOM == mSpaceState && suggestion.length() > 0
// In the batch input mode, a manually picked suggested word should just replace
// the current batch input text and there is no need for a phantom space.
&& !mWordComposer.isBatchMode()) {
final int firstChar = Character.codePointAt(suggestion, 0);
if (!settingsValues.isWordSeparator(firstChar)
|| settingsValues.isUsuallyPrecededBySpace(firstChar)) {
promotePhantomSpace(settingsValues);
}
}
// TODO: stop relying on mApplicationSpecifiedCompletions. The SuggestionInfo object
// should contain a reference to the CompletionInfo instead.
if (settingsValues.isApplicationSpecifiedCompletionsOn()
&& mLatinIME.mApplicationSpecifiedCompletions != null
&& index >= 0 && index < mLatinIME.mApplicationSpecifiedCompletions.length) {
mSuggestedWords = SuggestedWords.EMPTY;
mSuggestionStripViewAccessor.setNeutralSuggestionStrip();
keyboardSwitcher.updateShiftState();
resetComposingState(true /* alsoResetLastComposedWord */);
final CompletionInfo completionInfo = mLatinIME.mApplicationSpecifiedCompletions[index];
mConnection.commitCompletion(completionInfo);
mConnection.endBatchEdit();
return;
}
// We need to log before we commit, because the word composer will store away the user
// typed word.
final String replacedWord = mWordComposer.getTypedWord();
LatinImeLogger.logOnManualSuggestion(replacedWord, suggestion, index, suggestedWords);
commitChosenWord(settingsValues, suggestion,
LastComposedWord.COMMIT_TYPE_MANUAL_PICK, LastComposedWord.NOT_A_SEPARATOR);
if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
ResearchLogger.latinIME_pickSuggestionManually(replacedWord, index, suggestion,
mWordComposer.isBatchMode(), suggestionInfo.mScore,
suggestionInfo.mKind, suggestionInfo.mSourceDict.mDictType);
}
mConnection.endBatchEdit();
// Don't allow cancellation of manual pick
mLastComposedWord.deactivate();
// Space state must be updated before calling updateShiftState
mSpaceState = SpaceState.PHANTOM;
keyboardSwitcher.updateShiftState();
// We should show the "Touch again to save" hint if the user pressed the first entry
// AND it's in none of our current dictionaries (main, user or otherwise).
// Please note that if mSuggest is null, it means that everything is off: suggestion
// and correction, so we shouldn't try to show the hint
final Suggest suggest = mSuggest;
final boolean showingAddToDictionaryHint =
(SuggestedWordInfo.KIND_TYPED == suggestionInfo.mKind
|| SuggestedWordInfo.KIND_OOV_CORRECTION == suggestionInfo.mKind)
&& suggest != null
// If the suggestion is not in the dictionary, the hint should be shown.
&& !suggest.mDictionaryFacilitator.isValidWord(suggestion,
true /* ignoreCase */);
if (settingsValues.mIsInternal) {
LatinImeLoggerUtils.onSeparator((char)Constants.CODE_SPACE,
Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE);
}
if (showingAddToDictionaryHint
&& suggest.mDictionaryFacilitator.isUserDictionaryEnabled()) {
mSuggestionStripViewAccessor.showAddToDictionaryHint(suggestion);
} else {
// If we're not showing the "Touch again to save", then update the suggestion strip.
handler.postUpdateSuggestionStrip();
}
}
/** /**
* Consider an update to the cursor position. Evaluate whether this update has happened as * Consider an update to the cursor position. Evaluate whether this update has happened as
* part of normal typing or whether it was an explicit cursor move by the user. In any case, * part of normal typing or whether it was an explicit cursor move by the user. In any case,
@ -718,7 +821,7 @@ public final class InputLogic {
if (maybeDoubleSpacePeriod(settingsValues, handler)) { if (maybeDoubleSpacePeriod(settingsValues, handler)) {
keyboardSwitcher.updateShiftState(); keyboardSwitcher.updateShiftState();
mSpaceState = SpaceState.DOUBLE; mSpaceState = SpaceState.DOUBLE;
} else if (!mSuggestionStripViewAccessor.isShowingPunctuationList()) { } else if (!isShowingPunctuationList(settingsValues)) {
mSpaceState = SpaceState.WEAK; mSpaceState = SpaceState.WEAK;
} }
} }
@ -1329,6 +1432,15 @@ public final class InputLogic {
handler.postUpdateSuggestionStrip(); handler.postUpdateSuggestionStrip();
} }
/**
* Find out if the punctuation list is shown in the suggestion strip.
* @return whether the current suggestions are the punctuation list.
*/
// TODO: make this private. It's used through LatinIME for tests.
public boolean isShowingPunctuationList(final SettingsValues settingsValues) {
return settingsValues.mSpacingAndPunctuations.mSuggestPuncList == mSuggestedWords;
}
/** /**
* Factor in auto-caps and manual caps and compute the current caps mode. * Factor in auto-caps and manual caps and compute the current caps mode.
* @param settingsValues the current settings values. * @param settingsValues the current settings values.

View File

@ -23,9 +23,9 @@ import com.android.inputmethod.latin.SuggestedWords;
*/ */
public interface SuggestionStripViewAccessor { public interface SuggestionStripViewAccessor {
public boolean hasSuggestionStripView(); public boolean hasSuggestionStripView();
public void showAddToDictionaryHint(final String word);
public boolean isShowingAddToDictionaryHint(); public boolean isShowingAddToDictionaryHint();
public void dismissAddToDictionaryHint(); public void dismissAddToDictionaryHint();
public boolean isShowingPunctuationList();
public void setNeutralSuggestionStrip(); public void setNeutralSuggestionStrip();
public void showSuggestionStrip(final SuggestedWords suggestedWords); public void showSuggestionStrip(final SuggestedWords suggestedWords);
} }