Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a052b69b authored by Amith Yamasani's avatar Amith Yamasani Committed by Android (Google) Code Review
Browse files

Merge "Enable auto-correction only if there is a significant size main dictionary."

parents 17d252fa e8f1edef
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ using namespace android;
static jfieldID sDescriptorField;
static jfieldID sAssetManagerNativeField;
static jmethodID sAddWordMethod;
static jfieldID sDictLength;

//
// helper function to throw an exception
@@ -79,6 +80,7 @@ static jint latinime_BinaryDictionary_open
    }
    Dictionary *dictionary = new Dictionary(dict, typedLetterMultiplier, fullWordMultiplier);
    dictionary->setAsset(dictAsset);
    env->SetIntField(object, sDictLength, (jint) dictAsset->getLength());

    env->ReleaseStringUTFChars(resourceString, resourcePath);
    return (jint) dictionary;
@@ -176,6 +178,14 @@ static int registerNatives(JNIEnv *env)
    }
    sAssetManagerNativeField = env->GetFieldID(clazz, "mObject", "I");

    // Get the field pointer for the dictionary length
    clazz = env->FindClass(kClassPathName);
    if (clazz == NULL) {
        LOGE("Can't find %s", kClassPathName);
        return -1;
    }
    sDictLength = env->GetFieldID(clazz, "mDictLength", "I");

    return registerNativeMethods(env,
            kClassPathName, gMethods, sizeof(gMethods) / sizeof(gMethods[0]));
}
+19 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright (C) 2009 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.
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <string name="english_ime_name" msgid="7252517407088836577">"Clavier Android"</string>
</resources>
+4 −2
Original line number Diff line number Diff line
@@ -31,7 +31,9 @@
        <Key android:keyLabel="ц"/>
        <Key android:keyLabel="у"/>
        <Key android:keyLabel="к"/>
        <Key android:keyLabel="е"/>
        <Key android:keyLabel="е"
                android:popupKeyboard="@xml/kbd_popup_template"
                android:popupCharacters="ё" />
        <Key android:keyLabel="н"/>
        <Key android:keyLabel="г"/>
        <Key android:keyLabel="ш"/>
+5 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ public class BinaryDictionary extends Dictionary {
    private static final boolean ENABLE_MISSED_CHARACTERS = true;

    private int mNativeDict;
    private int mDictLength; // This value is set from native code, don't change the name!!!!
    private int[] mInputCodes = new int[MAX_WORD_LENGTH * MAX_ALTERNATIVES];
    private char[] mOutputChars = new char[MAX_WORD_LENGTH * MAX_WORDS];
    private int[] mFrequencies = new int[MAX_WORDS];
@@ -125,6 +126,10 @@ public class BinaryDictionary extends Dictionary {
        return isValidWordNative(mNativeDict, chars, chars.length);
    }

    public int getSize() {
        return mDictLength; // This value is initialized on the call to openNative()
    }

    @Override
    public synchronized void close() {
        if (mNativeDict != 0) {
+28 −21
Original line number Diff line number Diff line
@@ -126,7 +126,9 @@ public class LatinIME extends InputMethodService
    private CharSequence mBestWord;
    private boolean mPredictionOn;
    private boolean mCompletionOn;
    private boolean mHasDictionary;
    private boolean mAutoSpace;
    private boolean mAutoCorrectEnabled;
    private boolean mAutoCorrectOn;
    private boolean mCapsLock;
    private boolean mVibrateOn;
@@ -224,7 +226,6 @@ public class LatinIME extends InputMethodService
            mSuggest.close();
        }
        mSuggest = new Suggest(this, R.raw.main);
        mSuggest.setCorrectionMode(mCorrectionMode);
        mUserDictionary = new UserDictionary(this);
        if (mContactsDictionary == null) {
            mContactsDictionary = new ContactsDictionary(this);
@@ -236,7 +237,7 @@ public class LatinIME extends InputMethodService
        mSuggest.setUserDictionary(mUserDictionary);
        mSuggest.setContactsDictionary(mContactsDictionary);
        mSuggest.setAutoDictionary(mAutoDictionary);
        
        updateCorrectionMode();
        mWordSeparators = mResources.getString(R.string.word_separators);
        mSentenceSeparators = mResources.getString(R.string.sentence_separators);

@@ -304,7 +305,7 @@ public class LatinIME extends InputMethodService

        TextEntryState.newSession(this);

        boolean disableAutoCorrect = false;
        mInputTypeNoAutoCorrect = false;
        mPredictionOn = false;
        mCompletionOn = false;
        mCompletions = null;
@@ -353,19 +354,19 @@ public class LatinIME extends InputMethodService
                    // If it's a browser edit field and auto correct is not ON explicitly, then
                    // disable auto correction, but keep suggestions on.
                    if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0) {
                        disableAutoCorrect = true;
                        mInputTypeNoAutoCorrect = true;
                    }
                }

                // If NO_SUGGESTIONS is set, don't do prediction.
                if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS) != 0) {
                    mPredictionOn = false;
                    disableAutoCorrect = true;
                    mInputTypeNoAutoCorrect = true;
                }
                // If it's not multiline and the autoCorrect flag is not set, then don't correct
                if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0 &&
                        (attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE) == 0) {
                    disableAutoCorrect = true;
                    mInputTypeNoAutoCorrect = true;
                }
                if ((attribute.inputType&EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0) {
                    mPredictionOn = false;
@@ -385,17 +386,13 @@ public class LatinIME extends InputMethodService
        setCandidatesViewShown(false);
        if (mCandidateView != null) mCandidateView.setSuggestions(null, false, false, false);
        loadSettings();
        // Override auto correct
        if (disableAutoCorrect) {
            mAutoCorrectOn = false;
            if (mCorrectionMode == Suggest.CORRECTION_FULL) {
                mCorrectionMode = Suggest.CORRECTION_BASIC;
            }
        }

        // If the dictionary is not big enough, don't auto correct
        mHasDictionary = mSuggest.hasMainDictionary();

        updateCorrectionMode();

        mInputView.setProximityCorrectionEnabled(true);
        if (mSuggest != null) {
            mSuggest.setCorrectionMode(mCorrectionMode);
        }
        mPredictionOn = mPredictionOn && mCorrectionMode > 0;
        checkTutorial(attribute.privateImeOptions);
        if (TRACE) Debug.startMethodTracing("/data/trace/latinime");
@@ -1150,6 +1147,18 @@ public class LatinIME extends InputMethodService
        mUserDictionary.addWord(word, frequency);
    }

    private void updateCorrectionMode() {
        mHasDictionary = mSuggest != null ? mSuggest.hasMainDictionary() : false;
        mAutoCorrectOn = (mAutoCorrectEnabled || mQuickFixes)
                && !mInputTypeNoAutoCorrect && mHasDictionary;
        mCorrectionMode = mAutoCorrectOn
                ? Suggest.CORRECTION_FULL
                : (mQuickFixes ? Suggest.CORRECTION_BASIC : Suggest.CORRECTION_NONE);
        if (mSuggest != null) {
            mSuggest.setCorrectionMode(mCorrectionMode);
        }
    }

    private void launchSettings() {
        handleClose();
        Intent intent = new Intent();
@@ -1169,12 +1178,9 @@ public class LatinIME extends InputMethodService
        // will continue to work
        if (AutoText.getSize(mInputView) < 1) mQuickFixes = true;
        mShowSuggestions = sp.getBoolean(PREF_SHOW_SUGGESTIONS, true) & mQuickFixes;
        boolean autoComplete = sp.getBoolean(PREF_AUTO_COMPLETE,
        mAutoCorrectEnabled = sp.getBoolean(PREF_AUTO_COMPLETE,
                mResources.getBoolean(R.bool.enable_autocorrect)) & mShowSuggestions;
        mAutoCorrectOn = mSuggest != null && (autoComplete || mQuickFixes);
        mCorrectionMode = autoComplete
                ? Suggest.CORRECTION_FULL
                : (mQuickFixes ? Suggest.CORRECTION_BASIC : Suggest.CORRECTION_NONE);
        updateCorrectionMode();
        String languageList = sp.getString(PREF_SELECTED_LANGUAGES, null);
        updateSelectedLanguages(languageList);
    }
@@ -1274,6 +1280,7 @@ public class LatinIME extends InputMethodService
    private static final int CPS_BUFFER_SIZE = 16;
    private long[] mCpsIntervals = new long[CPS_BUFFER_SIZE];
    private int mCpsIndex;
    private boolean mInputTypeNoAutoCorrect;
    
    private void measureCps() {
        if (!LatinIME.PERF_DEBUG) return;
Loading