Move Recorrection functions to Recorrection.java

Change-Id: I309d78c50074cd6fb02a9d6f51b675b158a56202
This commit is contained in:
satok 2011-05-06 18:27:24 +09:00
parent ec5ae3a1b6
commit 7a8dac5527
2 changed files with 151 additions and 76 deletions

View file

@ -68,7 +68,6 @@ import android.view.WindowManager;
import android.view.inputmethod.CompletionInfo; import android.view.inputmethod.CompletionInfo;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.ExtractedText; import android.view.inputmethod.ExtractedText;
import android.view.inputmethod.ExtractedTextRequest;
import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputConnection;
import android.widget.LinearLayout; import android.widget.LinearLayout;
@ -152,6 +151,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
private KeyboardSwitcher mKeyboardSwitcher; private KeyboardSwitcher mKeyboardSwitcher;
private SubtypeSwitcher mSubtypeSwitcher; private SubtypeSwitcher mSubtypeSwitcher;
private VoiceProxy mVoiceProxy; private VoiceProxy mVoiceProxy;
private Recorrection mRecorrection;
private UserDictionary mUserDictionary; private UserDictionary mUserDictionary;
private UserBigramDictionary mUserBigramDictionary; private UserBigramDictionary mUserBigramDictionary;
@ -176,7 +176,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// punctuation on punctuation insertion, and become a real space on alpha char insertion. // punctuation on punctuation insertion, and become a real space on alpha char insertion.
private boolean mJustAddedMagicSpace; // This indicates whether the last char is a magic space. private boolean mJustAddedMagicSpace; // This indicates whether the last char is a magic space.
private boolean mAutoCorrectEnabled; private boolean mAutoCorrectEnabled;
private boolean mRecorrectionEnabled;
// Suggestion: use bigrams to adjust scores of suggestions obtained from unigram dictionary // Suggestion: use bigrams to adjust scores of suggestions obtained from unigram dictionary
private boolean mBigramSuggestionEnabled; private boolean mBigramSuggestionEnabled;
// Prediction: use bigrams to predict the next word when there is no input for it yet // Prediction: use bigrams to predict the next word when there is no input for it yet
@ -403,6 +402,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
SubtypeSwitcher.init(this, prefs); SubtypeSwitcher.init(this, prefs);
KeyboardSwitcher.init(this, prefs); KeyboardSwitcher.init(this, prefs);
AccessibilityUtils.init(this, prefs); AccessibilityUtils.init(this, prefs);
Recorrection.init(this, prefs);
super.onCreate(); super.onCreate();
@ -411,19 +411,11 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
mSubtypeSwitcher = SubtypeSwitcher.getInstance(); mSubtypeSwitcher = SubtypeSwitcher.getInstance();
mKeyboardSwitcher = KeyboardSwitcher.getInstance(); mKeyboardSwitcher = KeyboardSwitcher.getInstance();
mAccessibilityUtils = AccessibilityUtils.getInstance(); mAccessibilityUtils = AccessibilityUtils.getInstance();
mRecorrection = Recorrection.getInstance();
final Resources res = getResources(); final Resources res = getResources();
mResources = res; mResources = res;
// If the option should not be shown, do not read the recorrection preference
// but always use the default setting defined in the resources.
if (res.getBoolean(R.bool.config_enable_show_recorrection_option)) {
mRecorrectionEnabled = prefs.getBoolean(Settings.PREF_RECORRECTION_ENABLED,
res.getBoolean(R.bool.config_default_recorrection_enabled));
} else {
mRecorrectionEnabled = res.getBoolean(R.bool.config_default_recorrection_enabled);
}
mConfigEnableShowSubtypeSettings = res.getBoolean( mConfigEnableShowSubtypeSettings = res.getBoolean(
R.bool.config_enable_show_subtype_settings); R.bool.config_enable_show_subtype_settings);
mConfigSwipeDownDismissKeyboardEnabled = res.getBoolean( mConfigSwipeDownDismissKeyboardEnabled = res.getBoolean(
@ -624,7 +616,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
inputView.setProximityCorrectionEnabled(true); inputView.setProximityCorrectionEnabled(true);
inputView.setAccessibilityEnabled(accessibilityEnabled); inputView.setAccessibilityEnabled(accessibilityEnabled);
// If we just entered a text field, maybe it has some old text that requires correction // If we just entered a text field, maybe it has some old text that requires correction
checkRecorrectionOnStart(); mRecorrection.checkRecorrectionOnStart();
inputView.setForeground(true); inputView.setForeground(true);
voiceIme.onStartInputView(inputView.getWindowToken()); voiceIme.onStartInputView(inputView.getWindowToken());
@ -687,34 +679,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
} }
} }
private void checkRecorrectionOnStart() {
if (!mRecorrectionEnabled) return;
final InputConnection ic = getCurrentInputConnection();
if (ic == null) return;
// There could be a pending composing span. Clean it up first.
ic.finishComposingText();
if (isShowingSuggestionsStrip() && isSuggestionsRequested()) {
// First get the cursor position. This is required by setOldSuggestions(), so that
// it can pass the correct range to setComposingRegion(). At this point, we don't
// have valid values for mLastSelectionStart/End because onUpdateSelection() has
// not been called yet.
ExtractedTextRequest etr = new ExtractedTextRequest();
etr.token = 0; // anything is fine here
ExtractedText et = ic.getExtractedText(etr, 0);
if (et == null) return;
mLastSelectionStart = et.startOffset + et.selectionStart;
mLastSelectionEnd = et.startOffset + et.selectionEnd;
// Then look for possible corrections in a delayed fashion
if (!TextUtils.isEmpty(et.text) && isCursorTouchingWord()) {
mHandler.postUpdateOldSuggestions();
}
}
}
@Override @Override
public void onFinishInput() { public void onFinishInput() {
super.onFinishInput(); super.onFinishInput();
@ -808,34 +772,15 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
mLastSelectionStart = newSelStart; mLastSelectionStart = newSelStart;
mLastSelectionEnd = newSelEnd; mLastSelectionEnd = newSelEnd;
if (mRecorrectionEnabled && isShowingSuggestionsStrip()) { mRecorrection.updateRecorrectionSelection(mKeyboardSwitcher,
// Don't look for corrections if the keyboard is not visible mCandidateView, candidatesStart, candidatesEnd, newSelStart,
if (mKeyboardSwitcher.isInputViewShown()) { newSelEnd, oldSelStart, mLastSelectionStart,
// Check if we should go in or out of correction mode. mLastSelectionEnd, mHasUncommittedTypedChars);
if (isSuggestionsRequested()
&& (candidatesStart == candidatesEnd || newSelStart != oldSelStart
|| TextEntryState.isRecorrecting())
&& (newSelStart < newSelEnd - 1 || !mHasUncommittedTypedChars)) {
if (isCursorTouchingWord() || mLastSelectionStart < mLastSelectionEnd) {
mHandler.cancelUpdateBigramPredictions();
mHandler.postUpdateOldSuggestions();
} else {
abortRecorrection(false);
// If showing the "touch again to save" hint, do not replace it. Else,
// show the bigrams if we are at the end of the text, punctuation otherwise.
if (mCandidateView != null
&& !mCandidateView.isShowingAddToDictionaryHint()) {
InputConnection ic = getCurrentInputConnection();
if (null == ic || !TextUtils.isEmpty(ic.getTextAfterCursor(1, 0))) {
if (!isShowingPunctuationList()) setPunctuationSuggestions();
} else {
mHandler.postUpdateBigramPredictions();
}
}
}
}
}
} }
public void setLastSelection(int start, int end) {
mLastSelectionStart = start;
mLastSelectionEnd = end;
} }
/** /**
@ -848,7 +793,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
*/ */
@Override @Override
public void onExtractedTextClicked() { public void onExtractedTextClicked() {
if (mRecorrectionEnabled && isSuggestionsRequested()) return; if (mRecorrection.isRecorrectionEnabled() && isSuggestionsRequested()) return;
super.onExtractedTextClicked(); super.onExtractedTextClicked();
} }
@ -864,7 +809,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
*/ */
@Override @Override
public void onExtractedCursorMovement(int dx, int dy) { public void onExtractedCursorMovement(int dx, int dy) {
if (mRecorrectionEnabled && isSuggestionsRequested()) return; if (mRecorrection.isRecorrectionEnabled() && isSuggestionsRequested()) return;
super.onExtractedCursorMovement(dx, dy); super.onExtractedCursorMovement(dx, dy);
} }
@ -1318,7 +1263,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
} }
} }
private void abortRecorrection(boolean force) { public void abortRecorrection(boolean force) {
if (force || TextEntryState.isRecorrecting()) { if (force || TextEntryState.isRecorrecting()) {
TextEntryState.onAbortRecorrection(); TextEntryState.onAbortRecorrection();
setCandidatesViewShown(isCandidateStripVisible()); setCandidatesViewShown(isCandidateStripVisible());
@ -1495,16 +1440,16 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
mWordHistory.add(entry); mWordHistory.add(entry);
} }
private boolean isSuggestionsRequested() { public boolean isSuggestionsRequested() {
return mIsSettingsSuggestionStripOn return mIsSettingsSuggestionStripOn
&& (mCorrectionMode > 0 || isShowingSuggestionsStrip()); && (mCorrectionMode > 0 || isShowingSuggestionsStrip());
} }
private boolean isShowingPunctuationList() { public boolean isShowingPunctuationList() {
return mSuggestPuncList == mCandidateView.getSuggestions(); return mSuggestPuncList == mCandidateView.getSuggestions();
} }
private boolean isShowingSuggestionsStrip() { public boolean isShowingSuggestionsStrip() {
return (mSuggestionVisibility == SUGGESTION_VISIBILILTY_SHOW_VALUE) return (mSuggestionVisibility == SUGGESTION_VISIBILILTY_SHOW_VALUE)
|| (mSuggestionVisibility == SUGGESTION_VISIBILILTY_SHOW_ONLY_PORTRAIT_VALUE || (mSuggestionVisibility == SUGGESTION_VISIBILILTY_SHOW_ONLY_PORTRAIT_VALUE
&& mOrientation == Configuration.ORIENTATION_PORTRAIT); && mOrientation == Configuration.ORIENTATION_PORTRAIT);
@ -1877,7 +1822,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
} }
} }
private void setPunctuationSuggestions() { public void setPunctuationSuggestions() {
setSuggestions(mSuggestPuncList); setSuggestions(mSuggestPuncList);
setCandidatesViewShown(isCandidateStripVisible()); setCandidatesViewShown(isCandidateStripVisible());
} }
@ -1925,7 +1870,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
} }
} }
private boolean isCursorTouchingWord() { public boolean isCursorTouchingWord() {
InputConnection ic = getCurrentInputConnection(); InputConnection ic = getCurrentInputConnection();
if (ic == null) return false; if (ic == null) return false;
CharSequence toLeft = ic.getTextBeforeCursor(1, 0); CharSequence toLeft = ic.getTextBeforeCursor(1, 0);

View file

@ -0,0 +1,130 @@
/*
* Copyright (C) 2011 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 com.android.inputmethod.keyboard.KeyboardSwitcher;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.text.TextUtils;
import android.view.inputmethod.ExtractedText;
import android.view.inputmethod.ExtractedTextRequest;
import android.view.inputmethod.InputConnection;
/**
* Manager of re-correction functionalities
*/
public class Recorrection {
private static final Recorrection sInstance = new Recorrection();
private LatinIME mService;
private boolean mRecorrectionEnabled = false;
public static Recorrection getInstance() {
return sInstance;
}
public static void init(LatinIME context, SharedPreferences prefs) {
if (context == null || prefs == null) {
return;
}
sInstance.initInternal(context, prefs);
}
private Recorrection() {
}
public boolean isRecorrectionEnabled() {
return mRecorrectionEnabled;
}
private void initInternal(LatinIME context, SharedPreferences prefs) {
final Resources res = context.getResources();
// If the option should not be shown, do not read the re-correction preference
// but always use the default setting defined in the resources.
if (res.getBoolean(R.bool.config_enable_show_recorrection_option)) {
mRecorrectionEnabled = prefs.getBoolean(Settings.PREF_RECORRECTION_ENABLED,
res.getBoolean(R.bool.config_default_recorrection_enabled));
} else {
mRecorrectionEnabled = res.getBoolean(R.bool.config_default_recorrection_enabled);
}
mService = context;
}
public void checkRecorrectionOnStart() {
if (!mRecorrectionEnabled) return;
final InputConnection ic = mService.getCurrentInputConnection();
if (ic == null) return;
// There could be a pending composing span. Clean it up first.
ic.finishComposingText();
if (mService.isShowingSuggestionsStrip() && mService.isSuggestionsRequested()) {
// First get the cursor position. This is required by setOldSuggestions(), so that
// it can pass the correct range to setComposingRegion(). At this point, we don't
// have valid values for mLastSelectionStart/End because onUpdateSelection() has
// not been called yet.
ExtractedTextRequest etr = new ExtractedTextRequest();
etr.token = 0; // anything is fine here
ExtractedText et = ic.getExtractedText(etr, 0);
if (et == null) return;
mService.setLastSelection(
et.startOffset + et.selectionStart, et.startOffset + et.selectionEnd);
// Then look for possible corrections in a delayed fashion
if (!TextUtils.isEmpty(et.text) && mService.isCursorTouchingWord()) {
mService.mHandler.postUpdateOldSuggestions();
}
}
}
public void updateRecorrectionSelection(KeyboardSwitcher keyboardSwitcher,
CandidateView candidateView, int candidatesStart, int candidatesEnd, int newSelStart,
int newSelEnd, int oldSelStart, int lastSelectionStart,
int lastSelectionEnd, boolean hasUncommittedTypedChars) {
if (mRecorrectionEnabled && mService.isShowingSuggestionsStrip()) {
// Don't look for corrections if the keyboard is not visible
if (keyboardSwitcher.isInputViewShown()) {
// Check if we should go in or out of correction mode.
if (mService.isSuggestionsRequested()
&& (candidatesStart == candidatesEnd || newSelStart != oldSelStart
|| TextEntryState.isRecorrecting())
&& (newSelStart < newSelEnd - 1 || !hasUncommittedTypedChars)) {
if (mService.isCursorTouchingWord() || lastSelectionStart < lastSelectionEnd) {
mService.mHandler.cancelUpdateBigramPredictions();
mService.mHandler.postUpdateOldSuggestions();
} else {
mService.abortRecorrection(false);
// If showing the "touch again to save" hint, do not replace it. Else,
// show the bigrams if we are at the end of the text, punctuation otherwise.
if (candidateView != null
&& !candidateView.isShowingAddToDictionaryHint()) {
InputConnection ic = mService.getCurrentInputConnection();
if (null == ic || !TextUtils.isEmpty(ic.getTextAfterCursor(1, 0))) {
if (!mService.isShowingPunctuationList()) {
mService.setPunctuationSuggestions();
}
} else {
mService.mHandler.postUpdateBigramPredictions();
}
}
}
}
}
}
}
}