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

Commit 2d7e9273 authored by Jean Chalard's avatar Jean Chalard
Browse files

Fix inconsistencies with mSuggest.

This should fix some NPEs, but they are so unlikely that we never
see them.

Bug: 10065412
Change-Id: I2aefea1f52024405cc3fda9106fea41a02aaf4d8
parent acb3cc74
Loading
Loading
Loading
Loading
+29 −30
Original line number Diff line number Diff line
@@ -539,35 +539,32 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
        final Locale subtypeLocale = mSubtypeSwitcher.getCurrentSubtypeLocale();
        final String localeStr = subtypeLocale.toString();

        final ContactsBinaryDictionary oldContactsDictionary;
        if (mSuggest != null) {
            oldContactsDictionary = mSuggest.getContactsDictionary();
            mSuggest.close();
        } else {
            oldContactsDictionary = null;
        }
        mSuggest = new Suggest(this /* Context */, subtypeLocale,
        final Suggest newSuggest = new Suggest(this /* Context */, subtypeLocale,
                this /* SuggestInitializationListener */);
        final SettingsValues settingsValues = mSettings.getCurrent();
        if (settingsValues.mCorrectionEnabled) {
            mSuggest.setAutoCorrectionThreshold(settingsValues.mAutoCorrectionThreshold);
            newSuggest.setAutoCorrectionThreshold(settingsValues.mAutoCorrectionThreshold);
        }

        mIsMainDictionaryAvailable = DictionaryFactory.isDictionaryAvailable(this, subtypeLocale);
        if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
            ResearchLogger.getInstance().initSuggest(mSuggest);
            ResearchLogger.getInstance().initSuggest(newSuggest);
        }

        mUserDictionary = new UserBinaryDictionary(this, localeStr);
        mIsUserDictionaryAvailable = mUserDictionary.isEnabled();
        mSuggest.setUserDictionary(mUserDictionary);

        resetContactsDictionary(oldContactsDictionary);
        newSuggest.setUserDictionary(mUserDictionary);

        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

        mUserHistoryPredictionDictionary = PersonalizationDictionaryHelper
                .getUserHistoryPredictionDictionary(this, localeStr, prefs);
        mSuggest.setUserHistoryPredictionDictionary(mUserHistoryPredictionDictionary);
        newSuggest.setUserHistoryPredictionDictionary(mUserHistoryPredictionDictionary);

        final Suggest oldSuggest = mSuggest;
        resetContactsDictionary(null != oldSuggest ? oldSuggest.getContactsDictionary() : null);
        mSuggest = newSuggest;
        if (oldSuggest != null) oldSuggest.close();
    }

    /**
@@ -579,8 +576,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
     * @param oldContactsDictionary an optional dictionary to use, or null
     */
    private void resetContactsDictionary(final ContactsBinaryDictionary oldContactsDictionary) {
        final Suggest suggest = mSuggest;
        final boolean shouldSetDictionary =
                (null != mSuggest && mSettings.getCurrent().mUseContactsDict);
                (null != suggest && mSettings.getCurrent().mUseContactsDict);

        final ContactsBinaryDictionary dictionaryToUse;
        if (!shouldSetDictionary) {
@@ -607,8 +605,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
            }
        }

        if (null != mSuggest) {
            mSuggest.setContactsDictionary(dictionaryToUse);
        if (null != suggest) {
            suggest.setContactsDictionary(dictionaryToUse);
        }
    }

@@ -620,8 +618,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen

    @Override
    public void onDestroy() {
        if (mSuggest != null) {
            mSuggest.close();
        final Suggest suggest = mSuggest;
        if (suggest != null) {
            suggest.close();
            mSuggest = null;
        }
        mSettings.onDestroy();
@@ -795,7 +794,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen

        // Note: the following does a round-trip IPC on the main thread: be careful
        final Locale currentLocale = mSubtypeSwitcher.getCurrentSubtypeLocale();
        if (null != mSuggest && null != currentLocale && !currentLocale.equals(mSuggest.mLocale)) {
        final Suggest suggest = mSuggest;
        if (null != suggest && null != currentLocale && !currentLocale.equals(suggest.mLocale)) {
            initSuggest();
        }
        if (mSuggestionStripView != null) {
@@ -813,8 +813,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
            loadSettings();
            currentSettingsValues = mSettings.getCurrent();

            if (mSuggest != null && currentSettingsValues.mCorrectionEnabled) {
                mSuggest.setAutoCorrectionThreshold(currentSettingsValues.mAutoCorrectionThreshold);
            if (suggest != null && currentSettingsValues.mCorrectionEnabled) {
                suggest.setAutoCorrectionThreshold(currentSettingsValues.mAutoCorrectionThreshold);
            }

            switcher.loadKeyboard(editorInfo, currentSettingsValues);
@@ -2447,12 +2447,13 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
        // 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)
                        && mSuggest != null
                        && suggest != null
                        // If the suggestion is not in the dictionary, the hint should be shown.
                        && !AutoCorrectionUtils.isValidWord(mSuggest, suggestion, true);
                        && !AutoCorrectionUtils.isValidWord(suggest, suggestion, true);

        if (currentSettings.mIsInternal) {
            LatinImeLoggerUtils.onSeparator((char)Constants.CODE_SPACE,
@@ -2498,7 +2499,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen

    private String addToUserHistoryDictionary(final String suggestion) {
        if (TextUtils.isEmpty(suggestion)) return null;
        if (mSuggest == null) return null;
        final Suggest suggest = mSuggest;
        if (suggest == null) return null;

        // If correction is not enabled, we don't add words to the user history dictionary.
        // That's to avoid unintended additions in some sensitive fields, or fields that
@@ -2506,13 +2508,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
        final SettingsValues currentSettings = mSettings.getCurrent();
        if (!currentSettings.mCorrectionEnabled) return null;

        final Suggest suggest = mSuggest;
        final UserHistoryPredictionDictionary userHistoryDictionary =
                mUserHistoryPredictionDictionary;
        if (suggest == null || userHistoryDictionary == null) {
            // Avoid concurrent issue
            return null;
        }
        if (userHistoryDictionary == null) return null;

        final String prevWord = mConnection.getNthPreviousWord(currentSettings.mWordSeparators, 2);
        final String secondWord;
        if (mWordComposer.wasAutoCapitalized() && !mWordComposer.isMostlyCaps()) {