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

Commit fe87f5f4 authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi
Browse files

Pass additionalFeaturesOptions for getSuggestions().

This fixes null pointer exceptions that are caused when
getSuggestion() is called from spell checker.

Change-Id: Ifc9e7abb900e1a4646e33c91022effde439673e4
parent 8e3a90e5
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import android.util.SparseArray;

import com.android.inputmethod.keyboard.ProximityInfo;
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import com.android.inputmethod.latin.settings.AdditionalFeaturesSettingUtils;
import com.android.inputmethod.latin.settings.NativeSuggestOptions;
import com.android.inputmethod.latin.utils.CollectionUtils;
import com.android.inputmethod.latin.utils.JniUtils;
@@ -120,15 +119,16 @@ public final class BinaryDictionary extends Dictionary {
    @Override
    public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer,
            final String prevWord, final ProximityInfo proximityInfo,
            final boolean blockOffensiveWords) {
            final boolean blockOffensiveWords, final int[] additionalFeaturesOptions) {
        return getSuggestionsWithSessionId(composer, prevWord, proximityInfo, blockOffensiveWords,
                0 /* sessionId */);
                additionalFeaturesOptions, 0 /* sessionId */);
    }

    @Override
    public ArrayList<SuggestedWordInfo> getSuggestionsWithSessionId(final WordComposer composer,
            final String prevWord, final ProximityInfo proximityInfo,
            final boolean blockOffensiveWords, final int sessionId) {
            final boolean blockOffensiveWords, final int[] additionalFeaturesOptions,
            final int sessionId) {
        if (!isValidDictionary()) return null;

        Arrays.fill(mInputCodePoints, Constants.NOT_A_CODE);
@@ -148,8 +148,7 @@ public final class BinaryDictionary extends Dictionary {
        final InputPointers ips = composer.getInputPointers();
        final int inputSize = isGesture ? ips.getPointerSize() : composerSize;
        mNativeSuggestOptions.setIsGesture(isGesture);
        mNativeSuggestOptions.setAdditionalFeaturesOptions(
                AdditionalFeaturesSettingUtils.getAdditionalNativeSuggestOptions());
        mNativeSuggestOptions.setAdditionalFeaturesOptions(additionalFeaturesOptions);
        // proximityInfo and/or prevWordForBigrams may not be null.
        final int count = getSuggestionsNative(mNativeDict, proximityInfo.getNativeProximityInfo(),
                getTraverseSession(sessionId).getSession(), ips.getXCoordinates(),
+7 −4
Original line number Diff line number Diff line
@@ -72,20 +72,23 @@ public abstract class Dictionary {
     * @param prevWord the previous word, or null if none
     * @param proximityInfo the object for key proximity. May be ignored by some implementations.
     * @param blockOffensiveWords whether to block potentially offensive words
     * @param additionalFeaturesOptions options about additional features used for the suggestion.
     * @return the list of suggestions (possibly null if none)
     */
    // TODO: pass more context than just the previous word, to enable better suggestions (n-gram
    // and more)
    abstract public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer,
            final String prevWord, final ProximityInfo proximityInfo,
            final boolean blockOffensiveWords);
            final boolean blockOffensiveWords, final int[] additionalFeaturesOptions);

    // The default implementation of this method ignores sessionId.
    // Subclasses that want to use sessionId need to override this method.
    public ArrayList<SuggestedWordInfo> getSuggestionsWithSessionId(final WordComposer composer,
            final String prevWord, final ProximityInfo proximityInfo,
            final boolean blockOffensiveWords, final int sessionId) {
        return getSuggestions(composer, prevWord, proximityInfo, blockOffensiveWords);
            final boolean blockOffensiveWords, final int[] additionalFeaturesOptions,
            final int sessionId) {
        return getSuggestions(composer, prevWord, proximityInfo, blockOffensiveWords,
                additionalFeaturesOptions);
    }

    /**
@@ -156,7 +159,7 @@ public abstract class Dictionary {
        @Override
        public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer,
                final String prevWord, final ProximityInfo proximityInfo,
                final boolean blockOffensiveWords) {
                final boolean blockOffensiveWords, final int[] additionalFeaturesOptions) {
            return null;
        }

+3 −3
Original line number Diff line number Diff line
@@ -58,18 +58,18 @@ public final class DictionaryCollection extends Dictionary {
    @Override
    public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer,
            final String prevWord, final ProximityInfo proximityInfo,
            final boolean blockOffensiveWords) {
            final boolean blockOffensiveWords, final int[] additionalFeaturesOptions) {
        final CopyOnWriteArrayList<Dictionary> dictionaries = mDictionaries;
        if (dictionaries.isEmpty()) return null;
        // To avoid creating unnecessary objects, we get the list out of the first
        // dictionary and add the rest to it if not null, hence the get(0)
        ArrayList<SuggestedWordInfo> suggestions = dictionaries.get(0).getSuggestions(composer,
                prevWord, proximityInfo, blockOffensiveWords);
                prevWord, proximityInfo, blockOffensiveWords, additionalFeaturesOptions);
        if (null == suggestions) suggestions = CollectionUtils.newArrayList();
        final int length = dictionaries.size();
        for (int i = 1; i < length; ++ i) {
            final ArrayList<SuggestedWordInfo> sugg = dictionaries.get(i).getSuggestions(composer,
                    prevWord, proximityInfo, blockOffensiveWords);
                    prevWord, proximityInfo, blockOffensiveWords, additionalFeaturesOptions);
            if (null != sugg) suggestions.addAll(sugg);
        }
        return suggestions;
+1 −1
Original line number Diff line number Diff line
@@ -92,7 +92,7 @@ public class DictionaryWriter extends AbstractDictionaryWriter {
    @Override
    public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer,
            final String prevWord, final ProximityInfo proximityInfo,
            boolean blockOffensiveWords) {
            boolean blockOffensiveWords, final int[] additionalFeaturesOptions) {
        // This class doesn't support suggestion.
        return null;
    }
+3 −3
Original line number Diff line number Diff line
@@ -272,19 +272,19 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
    @Override
    public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer,
            final String prevWord, final ProximityInfo proximityInfo,
            final boolean blockOffensiveWords) {
            final boolean blockOffensiveWords, final int[] additionalFeaturesOptions) {
        asyncReloadDictionaryIfRequired();
        // Write lock because getSuggestions in native updates session status.
        if (mLocalDictionaryController.writeLock().tryLock()) {
            try {
                final ArrayList<SuggestedWordInfo> inMemDictSuggestion =
                        mDictionaryWriter.getSuggestions(composer, prevWord, proximityInfo,
                                blockOffensiveWords);
                                blockOffensiveWords, additionalFeaturesOptions);
                // TODO: Remove checking mIsUpdatable and use native suggestion.
                if (mBinaryDictionary != null && !mIsUpdatable) {
                    final ArrayList<SuggestedWordInfo> binarySuggestion =
                            mBinaryDictionary.getSuggestions(composer, prevWord, proximityInfo,
                                    blockOffensiveWords);
                                    blockOffensiveWords, additionalFeaturesOptions);
                    if (inMemDictSuggestion == null) {
                        return binarySuggestion;
                    } else if (binarySuggestion == null) {
Loading