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

Commit 24aad5a4 authored by Jean Chalard's avatar Jean Chalard
Browse files

[AC4] Add native methods necessary for auto-commit

Bug: 9059617
Change-Id: I7a47b0675446fc4f39628c60d16de9aea90d1b4d
parent be470f06
Loading
Loading
Loading
Loading
+25 −3
Original line number Diff line number Diff line
@@ -40,6 +40,9 @@ public final class BinaryDictionary extends Dictionary {
    private static final int MAX_WORD_LENGTH = Constants.DICTIONARY_MAX_WORD_LENGTH;
    // Must be equal to MAX_RESULTS in native/jni/src/defines.h
    private static final int MAX_RESULTS = 18;
    // Required space count for auto commit.
    // TODO: Remove this heuristic.
    private static final int SPACE_COUNT_FOR_AUTO_COMMIT = 3;

    private long mNativeDict;
    private final Locale mLocale;
@@ -48,6 +51,7 @@ public final class BinaryDictionary extends Dictionary {
    private final int[] mSpaceIndices = new int[MAX_RESULTS];
    private final int[] mOutputScores = new int[MAX_RESULTS];
    private final int[] mOutputTypes = new int[MAX_RESULTS];
    private final int[] mOutputAutoCommitFirstWordConfidence = new int[1]; // Only one result

    private final NativeSuggestOptions mNativeSuggestOptions = new NativeSuggestOptions();

@@ -102,7 +106,8 @@ public final class BinaryDictionary extends Dictionary {
            long traverseSession, int[] xCoordinates, int[] yCoordinates, int[] times,
            int[] pointerIds, int[] inputCodePoints, int inputSize, int commitPoint,
            int[] suggestOptions, int[] prevWordCodePointArray,
            int[] outputCodePoints, int[] outputScores, int[] outputIndices, int[] outputTypes);
            int[] outputCodePoints, int[] outputScores, int[] outputIndices, int[] outputTypes,
            int[] outputAutoCommitFirstWordConfidence);
    private static native float calcNormalizedScoreNative(int[] before, int[] after, int score);
    private static native int editDistanceNative(int[] before, int[] after);
    private static native void addUnigramWordNative(long dict, int[] word, int probability);
@@ -155,7 +160,7 @@ public final class BinaryDictionary extends Dictionary {
                ips.getYCoordinates(), ips.getTimes(), ips.getPointerIds(), mInputCodePoints,
                inputSize, 0 /* commitPoint */, mNativeSuggestOptions.getOptions(),
                prevWordCodePointArray, mOutputCodePoints, mOutputScores, mSpaceIndices,
                mOutputTypes);
                mOutputTypes, mOutputAutoCommitFirstWordConfidence);
        final ArrayList<SuggestedWordInfo> suggestions = CollectionUtils.newArrayList();
        for (int j = 0; j < count; ++j) {
            final int start = j * MAX_WORD_LENGTH;
@@ -179,7 +184,8 @@ public final class BinaryDictionary extends Dictionary {
                // flags too and pass mOutputTypes[j] instead of kind
                suggestions.add(new SuggestedWordInfo(new String(mOutputCodePoints, start, len),
                        score, kind, this /* sourceDict */,
                        mSpaceIndices[0] /* indexOfTouchPointOfSecondWord */));
                        mSpaceIndices[0] /* indexOfTouchPointOfSecondWord */,
                        mOutputAutoCommitFirstWordConfidence[0]));
            }
        }
        return suggestions;
@@ -253,6 +259,22 @@ public final class BinaryDictionary extends Dictionary {
        removeBigramWordsNative(mNativeDict, codePoints0, codePoints1);
    }

    @Override
    public boolean shouldAutoCommit(final SuggestedWordInfo candidate) {
        // TODO: actually use the confidence rather than use this completely broken heuristic
        final String word = candidate.mWord;
        final int length = word.length();
        int remainingSpaces = SPACE_COUNT_FOR_AUTO_COMMIT;
        for (int i = 0; i < length; ++i) {
            // This is okay because no low-surrogate and no high-surrogate can ever match the
            // space character, so we don't need to take care of iterating on code points.
            if (Constants.CODE_SPACE == word.charAt(i)) {
                if (0 >= --remainingSpaces) return true;
            }
        }
        return false;
    }

    @Override
    public void close() {
        synchronized (mDicTraverseSessions) {
+4 −1
Original line number Diff line number Diff line
@@ -137,7 +137,10 @@ public abstract class Dictionary {
    }

    /**
     * Whether we think this suggestion should trigger an auto-commit.
     * Whether we think this suggestion should trigger an auto-commit. prevWord is the word
     * before the suggestion, so that we can use n-gram frequencies.
     * @param candidate The candidate suggestion, in whole (not only the first part).
     * @return whether we should auto-commit or not.
     */
    public boolean shouldAutoCommit(final SuggestedWordInfo candidate) {
        // If we don't have support for auto-commit, or if we don't know, we return false to
+6 −3
Original line number Diff line number Diff line
@@ -344,7 +344,8 @@ public class ExpandableDictionary extends Dictionary {
            // in the future.
            suggestions.add(new SuggestedWordInfo(new String(word, 0, depth + 1), finalFreq,
                    SuggestedWordInfo.KIND_CORRECTION, this /* sourceDict */,
                    SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */));
                    SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */,
                    SuggestedWordInfo.NOT_A_CONFIDENCE /* autoCommitFirstWordConfidence */));
            if (suggestions.size() >= Suggest.MAX_SUGGESTIONS) return false;
        }
        if (null != node.mShortcutTargets) {
@@ -353,7 +354,8 @@ public class ExpandableDictionary extends Dictionary {
                final char[] shortcut = node.mShortcutTargets.get(shortcutIndex);
                suggestions.add(new SuggestedWordInfo(new String(shortcut, 0, shortcut.length),
                        finalFreq, SuggestedWordInfo.KIND_SHORTCUT, this /* sourceDict */,
                        SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */));
                        SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */,
                        SuggestedWordInfo.NOT_A_CONFIDENCE /* autoCommitFirstWordConfidence */));
                if (suggestions.size() > Suggest.MAX_SUGGESTIONS) return false;
            }
        }
@@ -604,7 +606,8 @@ public class ExpandableDictionary extends Dictionary {
                suggestions.add(new SuggestedWordInfo(new String(mLookedUpString, index,
                        Constants.DICTIONARY_MAX_WORD_LENGTH - index),
                        freq, SuggestedWordInfo.KIND_CORRECTION, this /* sourceDict */,
                        SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */));
                        SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */,
                        SuggestedWordInfo.NOT_A_CONFIDENCE /* autoCommitFirstWordConfidence */));
            }
        }
    }
+3 −1
Original line number Diff line number Diff line
@@ -2697,7 +2697,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
                    suggestions.add(new SuggestedWordInfo(s,
                            SuggestionStripView.MAX_SUGGESTIONS - i,
                            SuggestedWordInfo.KIND_RESUMED, Dictionary.DICTIONARY_RESUMED,
                            SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */));
                            SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */,
                            SuggestedWordInfo.NOT_A_CONFIDENCE
                                    /* autoCommitFirstWordConfidence */));
                }
            }
        }
+4 −2
Original line number Diff line number Diff line
@@ -327,7 +327,8 @@ public final class Suggest {
            suggestionsContainer.add(0, new SuggestedWordInfo(typedWord,
                    SuggestedWordInfo.MAX_SCORE, SuggestedWordInfo.KIND_TYPED,
                    Dictionary.DICTIONARY_USER_TYPED,
                    SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */));
                    SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */,
                    SuggestedWordInfo.NOT_A_CONFIDENCE /* autoCommitFirstWordConfidence */));
        }
        SuggestedWordInfo.removeDups(suggestionsContainer);

@@ -474,7 +475,8 @@ public final class Suggest {
            sb.appendCodePoint(Constants.CODE_SINGLE_QUOTE);
        }
        return new SuggestedWordInfo(sb.toString(), wordInfo.mScore, wordInfo.mKind,
                wordInfo.mSourceDict, wordInfo.mIndexOfTouchPointOfSecondWord);
                wordInfo.mSourceDict, wordInfo.mIndexOfTouchPointOfSecondWord,
                SuggestedWordInfo.NOT_A_CONFIDENCE /* autoCommitFirstWordConfidence */);
    }

    public void close() {
Loading