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

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

Use PrevWordsInfo for get/add/remove n-gram(bigram) entry.

Bug: 14119293
Bug: 14425059

Change-Id: I12e9ba977c153b514c6591ab52940712fd0874e3
parent d7bef2be
Loading
Loading
Loading
Loading
+20 −17
Original line number Diff line number Diff line
@@ -359,14 +359,16 @@ public final class BinaryDictionary extends Dictionary {
    }

    @UsedForTesting
    public boolean isValidBigram(final String word0, final String word1) {
        return getBigramProbability(word0, word1) != NOT_A_PROBABILITY;
    public boolean isValidNgram(final PrevWordsInfo prevWordsInfo, final String word) {
        return getNgramProbability(prevWordsInfo, word) != NOT_A_PROBABILITY;
    }

    public int getBigramProbability(final String word0, final String word1) {
        if (TextUtils.isEmpty(word0) || TextUtils.isEmpty(word1)) return NOT_A_PROBABILITY;
        final int[] codePoints0 = StringUtils.toCodePointArray(word0);
        final int[] codePoints1 = StringUtils.toCodePointArray(word1);
    public int getNgramProbability(final PrevWordsInfo prevWordsInfo, final String word) {
        if (TextUtils.isEmpty(prevWordsInfo.mPrevWord) || TextUtils.isEmpty(word)) {
            return NOT_A_PROBABILITY;
        }
        final int[] codePoints0 = StringUtils.toCodePointArray(prevWordsInfo.mPrevWord);
        final int[] codePoints1 = StringUtils.toCodePointArray(word);
        return getBigramProbabilityNative(mNativeDict, codePoints0, codePoints1);
    }

@@ -417,7 +419,7 @@ public final class BinaryDictionary extends Dictionary {
    }

    // Add a unigram entry to binary dictionary with unigram attributes in native code.
    public void addUnigramWord(final String word, final int probability,
    public void addUnigramEntry(final String word, final int probability,
            final String shortcutTarget, final int shortcutProbability, final boolean isNotAWord,
            final boolean isBlacklisted, final int timestamp) {
        if (TextUtils.isEmpty(word)) {
@@ -431,25 +433,26 @@ public final class BinaryDictionary extends Dictionary {
        mHasUpdated = true;
    }

    // Add a bigram entry to binary dictionary with timestamp in native code.
    public void addBigramWords(final String word0, final String word1, final int probability,
    // Add an n-gram entry to the binary dictionary with timestamp in native code.
    public void addNgramEntry(final PrevWordsInfo prevWordsInfo, final String word,
            final int probability,
            final int timestamp) {
        if (TextUtils.isEmpty(word0) || TextUtils.isEmpty(word1)) {
        if (TextUtils.isEmpty(prevWordsInfo.mPrevWord) || TextUtils.isEmpty(word)) {
            return;
        }
        final int[] codePoints0 = StringUtils.toCodePointArray(word0);
        final int[] codePoints1 = StringUtils.toCodePointArray(word1);
        final int[] codePoints0 = StringUtils.toCodePointArray(prevWordsInfo.mPrevWord);
        final int[] codePoints1 = StringUtils.toCodePointArray(word);
        addBigramWordsNative(mNativeDict, codePoints0, codePoints1, probability, timestamp);
        mHasUpdated = true;
    }

    // Remove a bigram entry form binary dictionary in native code.
    public void removeBigramWords(final String word0, final String word1) {
        if (TextUtils.isEmpty(word0) || TextUtils.isEmpty(word1)) {
    // Remove an n-gram entry from the binary dictionary in native code.
    public void removeNgramEntry(final PrevWordsInfo prevWordsInfo, final String word) {
        if (TextUtils.isEmpty(prevWordsInfo.mPrevWord) || TextUtils.isEmpty(word)) {
            return;
        }
        final int[] codePoints0 = StringUtils.toCodePointArray(word0);
        final int[] codePoints1 = StringUtils.toCodePointArray(word1);
        final int[] codePoints0 = StringUtils.toCodePointArray(prevWordsInfo.mPrevWord);
        final int[] codePoints1 = StringUtils.toCodePointArray(word);
        removeBigramWordsNative(mNativeDict, codePoints0, codePoints1);
        mHasUpdated = true;
    }
+8 −8
Original line number Diff line number Diff line
@@ -142,7 +142,7 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary {
                Log.d(TAG, "loadAccountVocabulary: " + word);
            }
            runGCIfRequiredLocked(true /* mindsBlockByGC */);
            addWordDynamicallyLocked(word, FREQUENCY_FOR_CONTACTS, null /* shortcut */,
            addUnigramLocked(word, FREQUENCY_FOR_CONTACTS, null /* shortcut */,
                    0 /* shortcutFreq */, false /* isNotAWord */, false /* isBlacklisted */,
                    BinaryDictionary.NOT_A_VALID_TIMESTAMP);
        }
@@ -224,7 +224,7 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary {
     */
    private void addNameLocked(final String name) {
        int len = StringUtils.codePointCount(name);
        String prevWord = null;
        PrevWordsInfo prevWordsInfo = new PrevWordsInfo(null);
        // TODO: Better tokenization for non-Latin writing systems
        for (int i = 0; i < len; i++) {
            if (Character.isLetter(name.codePointAt(i))) {
@@ -239,19 +239,19 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary {
                final int wordLen = StringUtils.codePointCount(word);
                if (wordLen < MAX_WORD_LENGTH && wordLen > 1) {
                    if (DEBUG) {
                        Log.d(TAG, "addName " + name + ", " + word + ", " + prevWord);
                        Log.d(TAG, "addName " + name + ", " + word + ", "
                                + prevWordsInfo.mPrevWord);
                    }
                    runGCIfRequiredLocked(true /* mindsBlockByGC */);
                    addWordDynamicallyLocked(word, FREQUENCY_FOR_CONTACTS,
                    addUnigramLocked(word, FREQUENCY_FOR_CONTACTS,
                            null /* shortcut */, 0 /* shortcutFreq */, false /* isNotAWord */,
                            false /* isBlacklisted */, BinaryDictionary.NOT_A_VALID_TIMESTAMP);
                    if (!TextUtils.isEmpty(prevWord) && mUseFirstLastBigrams) {
                    if (!TextUtils.isEmpty(prevWordsInfo.mPrevWord) && mUseFirstLastBigrams) {
                        runGCIfRequiredLocked(true /* mindsBlockByGC */);
                        addBigramDynamicallyLocked(prevWord, word,
                                FREQUENCY_FOR_CONTACTS_BIGRAM,
                        addNgramEntryLocked(prevWordsInfo, word, FREQUENCY_FOR_CONTACTS_BIGRAM,
                                BinaryDictionary.NOT_A_VALID_TIMESTAMP);
                    }
                    prevWord = word;
                    prevWordsInfo = new PrevWordsInfo(word);
                }
            }
        }
+11 −9
Original line number Diff line number Diff line
@@ -370,22 +370,23 @@ public class DictionaryFacilitatorForSuggest {
    }

    public void addToUserHistory(final String suggestion, final boolean wasAutoCapitalized,
            final String previousWord, final int timeStampInSeconds,
            final PrevWordsInfo prevWordsInfo, final int timeStampInSeconds,
            final boolean blockPotentiallyOffensive) {
        final Dictionaries dictionaries = mDictionaries;
        final String[] words = suggestion.split(Constants.WORD_SEPARATOR);
        for (int i = 0; i < words.length; i++) {
            final String currentWord = words[i];
            final String prevWord = (i == 0) ? previousWord : words[i - 1];
            final PrevWordsInfo prevWordsInfoForCurrentWord =
                    (i == 0) ? prevWordsInfo : new PrevWordsInfo(words[i - 1]);
            final boolean wasCurrentWordAutoCapitalized = (i == 0) ? wasAutoCapitalized : false;
            addWordToUserHistory(dictionaries, prevWord, currentWord,
            addWordToUserHistory(dictionaries, prevWordsInfoForCurrentWord, currentWord,
                    wasCurrentWordAutoCapitalized, timeStampInSeconds, blockPotentiallyOffensive);
        }
    }

    private void addWordToUserHistory(final Dictionaries dictionaries, final String prevWord,
            final String word, final boolean wasAutoCapitalized, final int timeStampInSeconds,
            final boolean blockPotentiallyOffensive) {
    private void addWordToUserHistory(final Dictionaries dictionaries,
            final PrevWordsInfo prevWordsInfo, final String word, final boolean wasAutoCapitalized,
            final int timeStampInSeconds, final boolean blockPotentiallyOffensive) {
        final ExpandableBinaryDictionary userHistoryDictionary =
                dictionaries.getSubDict(Dictionary.TYPE_USER_HISTORY);
        if (userHistoryDictionary == null) {
@@ -430,15 +431,16 @@ public class DictionaryFacilitatorForSuggest {
        // We demote unrecognized words (frequency < 0, below) by specifying them as "invalid".
        // We don't add words with 0-frequency (assuming they would be profanity etc.).
        final boolean isValid = maxFreq > 0;
        UserHistoryDictionary.addToDictionary(userHistoryDictionary, prevWord, secondWord,
        UserHistoryDictionary.addToDictionary(userHistoryDictionary, prevWordsInfo, secondWord,
                isValid, timeStampInSeconds);
    }

    public void cancelAddingUserHistory(final String previousWord, final String committedWord) {
    public void cancelAddingUserHistory(final PrevWordsInfo prevWordsInfo,
            final String committedWord) {
        final ExpandableBinaryDictionary userHistoryDictionary =
                mDictionaries.getSubDict(Dictionary.TYPE_USER_HISTORY);
        if (userHistoryDictionary != null) {
            userHistoryDictionary.removeBigramDynamically(previousWord, committedWord);
            userHistoryDictionary.removeNgramDynamically(prevWordsInfo, committedWord);
        }
    }

+15 −15
Original line number Diff line number Diff line
@@ -269,9 +269,9 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
    }

    /**
     * Dynamically adds a word unigram to the dictionary. May overwrite an existing entry.
     * Adds unigram information of a word to the dictionary. May overwrite an existing entry.
     */
    public void addWordDynamically(final String word, final int frequency,
    public void addUnigramEntry(final String word, final int frequency,
            final String shortcutTarget, final int shortcutFreq, final boolean isNotAWord,
            final boolean isBlacklisted, final int timestamp) {
        reloadDictionaryIfRequired();
@@ -282,23 +282,23 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
                    return;
                }
                runGCIfRequiredLocked(true /* mindsBlockByGC */);
                addWordDynamicallyLocked(word, frequency, shortcutTarget, shortcutFreq,
                addUnigramLocked(word, frequency, shortcutTarget, shortcutFreq,
                        isNotAWord, isBlacklisted, timestamp);
            }
        });
    }

    protected void addWordDynamicallyLocked(final String word, final int frequency,
    protected void addUnigramLocked(final String word, final int frequency,
            final String shortcutTarget, final int shortcutFreq, final boolean isNotAWord,
            final boolean isBlacklisted, final int timestamp) {
        mBinaryDictionary.addUnigramWord(word, frequency, shortcutTarget, shortcutFreq,
        mBinaryDictionary.addUnigramEntry(word, frequency, shortcutTarget, shortcutFreq,
                isNotAWord, isBlacklisted, timestamp);
    }

    /**
     * Dynamically adds a word bigram in the dictionary. May overwrite an existing entry.
     * Adds n-gram information of a word to the dictionary. May overwrite an existing entry.
     */
    public void addBigramDynamically(final String word0, final String word1,
    public void addNgramEntry(final PrevWordsInfo prevWordsInfo, final String word,
            final int frequency, final int timestamp) {
        reloadDictionaryIfRequired();
        asyncExecuteTaskWithWriteLock(new Runnable() {
@@ -308,20 +308,20 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
                    return;
                }
                runGCIfRequiredLocked(true /* mindsBlockByGC */);
                addBigramDynamicallyLocked(word0, word1, frequency, timestamp);
                addNgramEntryLocked(prevWordsInfo, word, frequency, timestamp);
            }
        });
    }

    protected void addBigramDynamicallyLocked(final String word0, final String word1,
    protected void addNgramEntryLocked(final PrevWordsInfo prevWordsInfo, final String word,
            final int frequency, final int timestamp) {
        mBinaryDictionary.addBigramWords(word0, word1, frequency, timestamp);
        mBinaryDictionary.addNgramEntry(prevWordsInfo, word, frequency, timestamp);
    }

    /**
     * Dynamically remove a word bigram in the dictionary.
     * Dynamically remove the n-gram entry in the dictionary.
     */
    public void removeBigramDynamically(final String word0, final String word1) {
    public void removeNgramDynamically(final PrevWordsInfo prevWordsInfo, final String word1) {
        reloadDictionaryIfRequired();
        asyncExecuteTaskWithWriteLock(new Runnable() {
            @Override
@@ -330,7 +330,7 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
                    return;
                }
                runGCIfRequiredLocked(true /* mindsBlockByGC */);
                mBinaryDictionary.removeBigramWords(word0, word1);
                mBinaryDictionary.removeNgramEntry(prevWordsInfo, word1);
            }
        });
    }
@@ -428,9 +428,9 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
        return mBinaryDictionary.isValidWord(word);
    }

    protected boolean isValidBigramLocked(final String word1, final String word2) {
    protected boolean isValidNgramLocked(final PrevWordsInfo prevWordsInfo, final String word) {
        if (mBinaryDictionary == null) return false;
        return mBinaryDictionary.isValidBigram(word1, word2);
        return mBinaryDictionary.isValidNgram(prevWordsInfo, word);
    }

    /**
+3 −3
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@ public final class LastComposedWord {
    public final String mTypedWord;
    public final CharSequence mCommittedWord;
    public final String mSeparatorString;
    public final String mPrevWord;
    public final PrevWordsInfo mPrevWordsInfo;
    public final int mCapitalizedMode;
    public final InputPointers mInputPointers =
            new InputPointers(Constants.DICTIONARY_MAX_WORD_LENGTH);
@@ -64,7 +64,7 @@ public final class LastComposedWord {
    public LastComposedWord(final ArrayList<Event> events,
            final InputPointers inputPointers, final String typedWord,
            final CharSequence committedWord, final String separatorString,
            final String prevWord, final int capitalizedMode) {
            final PrevWordsInfo prevWordsInfo, final int capitalizedMode) {
        if (inputPointers != null) {
            mInputPointers.copy(inputPointers);
        }
@@ -73,7 +73,7 @@ public final class LastComposedWord {
        mCommittedWord = committedWord;
        mSeparatorString = separatorString;
        mActive = true;
        mPrevWord = prevWord;
        mPrevWordsInfo = prevWordsInfo;
        mCapitalizedMode = capitalizedMode;
    }

Loading