Loading java/src/com/android/inputmethod/latin/DictionaryFacilitator.java +10 −6 Original line number Original line Diff line number Diff line Loading @@ -468,15 +468,19 @@ public class DictionaryFacilitator { isValid, timeStampInSeconds, mDistracterFilter); isValid, timeStampInSeconds, mDistracterFilter); } } public void cancelAddingUserHistory(final PrevWordsInfo prevWordsInfo, private void removeWord(final String dictName, final String word) { final String committedWord) { final ExpandableBinaryDictionary dictionary = mDictionaries.getSubDict(dictName); final ExpandableBinaryDictionary userHistoryDictionary = if (dictionary != null) { mDictionaries.getSubDict(Dictionary.TYPE_USER_HISTORY); dictionary.removeUnigramEntryDynamically(word); if (userHistoryDictionary != null) { userHistoryDictionary.removeNgramDynamically(prevWordsInfo, committedWord); } } } } public void removeWordFromPersonalizedDicts(final String word) { removeWord(Dictionary.TYPE_USER_HISTORY, word); removeWord(Dictionary.TYPE_PERSONALIZATION, word); removeWord(Dictionary.TYPE_CONTEXTUAL, word); } // TODO: Revise the way to fusion suggestion results. // TODO: Revise the way to fusion suggestion results. public SuggestionResults getSuggestionResults(final WordComposer composer, public SuggestionResults getSuggestionResults(final WordComposer composer, final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, Loading java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java +21 −0 Original line number Original line Diff line number Diff line Loading @@ -310,6 +310,27 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { } } } } /** * Dynamically remove the unigram entry from the dictionary. */ public void removeUnigramEntryDynamically(final String word) { reloadDictionaryIfRequired(); asyncExecuteTaskWithWriteLock(new Runnable() { @Override public void run() { if (mBinaryDictionary == null) { return; } runGCIfRequiredLocked(true /* mindsBlockByGC */); if (!mBinaryDictionary.removeUnigramEntry(word)) { if (DEBUG) { Log.i(TAG, "Cannot remove unigram entry: " + word); } } } }); } /** /** * Adds n-gram information of a word to the dictionary. May overwrite an existing entry. * Adds n-gram information of a word to the dictionary. May overwrite an existing entry. */ */ Loading java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java +5 −3 Original line number Original line Diff line number Diff line Loading @@ -884,6 +884,9 @@ public final class InputLogic { final String rejectedSuggestion = mWordComposer.getTypedWord(); final String rejectedSuggestion = mWordComposer.getTypedWord(); mWordComposer.reset(); mWordComposer.reset(); mWordComposer.setRejectedBatchModeSuggestion(rejectedSuggestion); mWordComposer.setRejectedBatchModeSuggestion(rejectedSuggestion); if (!TextUtils.isEmpty(rejectedSuggestion)) { mDictionaryFacilitator.removeWordFromPersonalizedDicts(rejectedSuggestion); } } else { } else { mWordComposer.processEvent(inputTransaction.mEvent); mWordComposer.processEvent(inputTransaction.mEvent); } } Loading Loading @@ -1365,7 +1368,6 @@ public final class InputLogic { * @param inputTransaction The transaction in progress. * @param inputTransaction The transaction in progress. */ */ private void revertCommit(final InputTransaction inputTransaction) { private void revertCommit(final InputTransaction inputTransaction) { final PrevWordsInfo prevWordsInfo = mLastComposedWord.mPrevWordsInfo; final CharSequence originallyTypedWord = mLastComposedWord.mTypedWord; final CharSequence originallyTypedWord = mLastComposedWord.mTypedWord; final CharSequence committedWord = mLastComposedWord.mCommittedWord; final CharSequence committedWord = mLastComposedWord.mCommittedWord; final String committedWordString = committedWord.toString(); final String committedWordString = committedWord.toString(); Loading @@ -1387,8 +1389,8 @@ public final class InputLogic { } } } } mConnection.deleteSurroundingText(deleteLength, 0); mConnection.deleteSurroundingText(deleteLength, 0); if (!TextUtils.isEmpty(prevWordsInfo.mPrevWord) && !TextUtils.isEmpty(committedWord)) { if (!TextUtils.isEmpty(committedWord)) { mDictionaryFacilitator.cancelAddingUserHistory(prevWordsInfo, committedWordString); mDictionaryFacilitator.removeWordFromPersonalizedDicts(committedWordString); } } final String stringToCommit = originallyTypedWord + mLastComposedWord.mSeparatorString; final String stringToCommit = originallyTypedWord + mLastComposedWord.mSeparatorString; final SpannableString textToCommit = new SpannableString(stringToCommit); final SpannableString textToCommit = new SpannableString(stringToCommit); Loading native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_reader.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -58,7 +58,7 @@ class Ver4PatriciaTrieNodeReader : public PtNodeReader { ~Ver4PatriciaTrieNodeReader() {} ~Ver4PatriciaTrieNodeReader() {} virtual const PtNodeParams fetchNodeInfoInBufferFromPtNodePos(const int ptNodePos) const { virtual const PtNodeParams fetchPtNodeParamsInBufferFromPtNodePos(const int ptNodePos) const { return fetchPtNodeInfoFromBufferAndProcessMovedPtNode(ptNodePos, return fetchPtNodeInfoFromBufferAndProcessMovedPtNode(ptNodePos, NOT_A_DICT_POS /* siblingNodePos */); NOT_A_DICT_POS /* siblingNodePos */); } } Loading native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp +4 −4 Original line number Original line Diff line number Diff line Loading @@ -135,7 +135,7 @@ int Ver4PatriciaTriePolicy::getUnigramProbabilityOfPtNode(const int ptNodePos) c if (ptNodePos == NOT_A_DICT_POS) { if (ptNodePos == NOT_A_DICT_POS) { return NOT_A_PROBABILITY; return NOT_A_PROBABILITY; } } const PtNodeParams ptNodeParams(mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos)); const PtNodeParams ptNodeParams(mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos)); if (ptNodeParams.isDeleted() || ptNodeParams.isBlacklisted() || ptNodeParams.isNotAWord()) { if (ptNodeParams.isDeleted() || ptNodeParams.isBlacklisted() || ptNodeParams.isNotAWord()) { return NOT_A_PROBABILITY; return NOT_A_PROBABILITY; } } Loading @@ -146,7 +146,7 @@ int Ver4PatriciaTriePolicy::getShortcutPositionOfPtNode(const int ptNodePos) con if (ptNodePos == NOT_A_DICT_POS) { if (ptNodePos == NOT_A_DICT_POS) { return NOT_A_DICT_POS; return NOT_A_DICT_POS; } } const PtNodeParams ptNodeParams(mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos)); const PtNodeParams ptNodeParams(mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos)); if (ptNodeParams.isDeleted()) { if (ptNodeParams.isDeleted()) { return NOT_A_DICT_POS; return NOT_A_DICT_POS; } } Loading @@ -158,7 +158,7 @@ int Ver4PatriciaTriePolicy::getBigramsPositionOfPtNode(const int ptNodePos) cons if (ptNodePos == NOT_A_DICT_POS) { if (ptNodePos == NOT_A_DICT_POS) { return NOT_A_DICT_POS; return NOT_A_DICT_POS; } } const PtNodeParams ptNodeParams(mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos)); const PtNodeParams ptNodeParams(mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos)); if (ptNodeParams.isDeleted()) { if (ptNodeParams.isDeleted()) { return NOT_A_DICT_POS; return NOT_A_DICT_POS; } } Loading Loading @@ -410,7 +410,7 @@ const WordProperty Ver4PatriciaTriePolicy::getWordProperty(const int *const code AKLOGE("getWordProperty is called for invalid word."); AKLOGE("getWordProperty is called for invalid word."); return WordProperty(); return WordProperty(); } } const PtNodeParams ptNodeParams = mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos); const PtNodeParams ptNodeParams = mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos); std::vector<int> codePointVector(ptNodeParams.getCodePoints(), std::vector<int> codePointVector(ptNodeParams.getCodePoints(), ptNodeParams.getCodePoints() + ptNodeParams.getCodePointCount()); ptNodeParams.getCodePoints() + ptNodeParams.getCodePointCount()); const ProbabilityEntry probabilityEntry = const ProbabilityEntry probabilityEntry = Loading Loading
java/src/com/android/inputmethod/latin/DictionaryFacilitator.java +10 −6 Original line number Original line Diff line number Diff line Loading @@ -468,15 +468,19 @@ public class DictionaryFacilitator { isValid, timeStampInSeconds, mDistracterFilter); isValid, timeStampInSeconds, mDistracterFilter); } } public void cancelAddingUserHistory(final PrevWordsInfo prevWordsInfo, private void removeWord(final String dictName, final String word) { final String committedWord) { final ExpandableBinaryDictionary dictionary = mDictionaries.getSubDict(dictName); final ExpandableBinaryDictionary userHistoryDictionary = if (dictionary != null) { mDictionaries.getSubDict(Dictionary.TYPE_USER_HISTORY); dictionary.removeUnigramEntryDynamically(word); if (userHistoryDictionary != null) { userHistoryDictionary.removeNgramDynamically(prevWordsInfo, committedWord); } } } } public void removeWordFromPersonalizedDicts(final String word) { removeWord(Dictionary.TYPE_USER_HISTORY, word); removeWord(Dictionary.TYPE_PERSONALIZATION, word); removeWord(Dictionary.TYPE_CONTEXTUAL, word); } // TODO: Revise the way to fusion suggestion results. // TODO: Revise the way to fusion suggestion results. public SuggestionResults getSuggestionResults(final WordComposer composer, public SuggestionResults getSuggestionResults(final WordComposer composer, final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, Loading
java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java +21 −0 Original line number Original line Diff line number Diff line Loading @@ -310,6 +310,27 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { } } } } /** * Dynamically remove the unigram entry from the dictionary. */ public void removeUnigramEntryDynamically(final String word) { reloadDictionaryIfRequired(); asyncExecuteTaskWithWriteLock(new Runnable() { @Override public void run() { if (mBinaryDictionary == null) { return; } runGCIfRequiredLocked(true /* mindsBlockByGC */); if (!mBinaryDictionary.removeUnigramEntry(word)) { if (DEBUG) { Log.i(TAG, "Cannot remove unigram entry: " + word); } } } }); } /** /** * Adds n-gram information of a word to the dictionary. May overwrite an existing entry. * Adds n-gram information of a word to the dictionary. May overwrite an existing entry. */ */ Loading
java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java +5 −3 Original line number Original line Diff line number Diff line Loading @@ -884,6 +884,9 @@ public final class InputLogic { final String rejectedSuggestion = mWordComposer.getTypedWord(); final String rejectedSuggestion = mWordComposer.getTypedWord(); mWordComposer.reset(); mWordComposer.reset(); mWordComposer.setRejectedBatchModeSuggestion(rejectedSuggestion); mWordComposer.setRejectedBatchModeSuggestion(rejectedSuggestion); if (!TextUtils.isEmpty(rejectedSuggestion)) { mDictionaryFacilitator.removeWordFromPersonalizedDicts(rejectedSuggestion); } } else { } else { mWordComposer.processEvent(inputTransaction.mEvent); mWordComposer.processEvent(inputTransaction.mEvent); } } Loading Loading @@ -1365,7 +1368,6 @@ public final class InputLogic { * @param inputTransaction The transaction in progress. * @param inputTransaction The transaction in progress. */ */ private void revertCommit(final InputTransaction inputTransaction) { private void revertCommit(final InputTransaction inputTransaction) { final PrevWordsInfo prevWordsInfo = mLastComposedWord.mPrevWordsInfo; final CharSequence originallyTypedWord = mLastComposedWord.mTypedWord; final CharSequence originallyTypedWord = mLastComposedWord.mTypedWord; final CharSequence committedWord = mLastComposedWord.mCommittedWord; final CharSequence committedWord = mLastComposedWord.mCommittedWord; final String committedWordString = committedWord.toString(); final String committedWordString = committedWord.toString(); Loading @@ -1387,8 +1389,8 @@ public final class InputLogic { } } } } mConnection.deleteSurroundingText(deleteLength, 0); mConnection.deleteSurroundingText(deleteLength, 0); if (!TextUtils.isEmpty(prevWordsInfo.mPrevWord) && !TextUtils.isEmpty(committedWord)) { if (!TextUtils.isEmpty(committedWord)) { mDictionaryFacilitator.cancelAddingUserHistory(prevWordsInfo, committedWordString); mDictionaryFacilitator.removeWordFromPersonalizedDicts(committedWordString); } } final String stringToCommit = originallyTypedWord + mLastComposedWord.mSeparatorString; final String stringToCommit = originallyTypedWord + mLastComposedWord.mSeparatorString; final SpannableString textToCommit = new SpannableString(stringToCommit); final SpannableString textToCommit = new SpannableString(stringToCommit); Loading
native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_reader.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -58,7 +58,7 @@ class Ver4PatriciaTrieNodeReader : public PtNodeReader { ~Ver4PatriciaTrieNodeReader() {} ~Ver4PatriciaTrieNodeReader() {} virtual const PtNodeParams fetchNodeInfoInBufferFromPtNodePos(const int ptNodePos) const { virtual const PtNodeParams fetchPtNodeParamsInBufferFromPtNodePos(const int ptNodePos) const { return fetchPtNodeInfoFromBufferAndProcessMovedPtNode(ptNodePos, return fetchPtNodeInfoFromBufferAndProcessMovedPtNode(ptNodePos, NOT_A_DICT_POS /* siblingNodePos */); NOT_A_DICT_POS /* siblingNodePos */); } } Loading
native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp +4 −4 Original line number Original line Diff line number Diff line Loading @@ -135,7 +135,7 @@ int Ver4PatriciaTriePolicy::getUnigramProbabilityOfPtNode(const int ptNodePos) c if (ptNodePos == NOT_A_DICT_POS) { if (ptNodePos == NOT_A_DICT_POS) { return NOT_A_PROBABILITY; return NOT_A_PROBABILITY; } } const PtNodeParams ptNodeParams(mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos)); const PtNodeParams ptNodeParams(mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos)); if (ptNodeParams.isDeleted() || ptNodeParams.isBlacklisted() || ptNodeParams.isNotAWord()) { if (ptNodeParams.isDeleted() || ptNodeParams.isBlacklisted() || ptNodeParams.isNotAWord()) { return NOT_A_PROBABILITY; return NOT_A_PROBABILITY; } } Loading @@ -146,7 +146,7 @@ int Ver4PatriciaTriePolicy::getShortcutPositionOfPtNode(const int ptNodePos) con if (ptNodePos == NOT_A_DICT_POS) { if (ptNodePos == NOT_A_DICT_POS) { return NOT_A_DICT_POS; return NOT_A_DICT_POS; } } const PtNodeParams ptNodeParams(mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos)); const PtNodeParams ptNodeParams(mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos)); if (ptNodeParams.isDeleted()) { if (ptNodeParams.isDeleted()) { return NOT_A_DICT_POS; return NOT_A_DICT_POS; } } Loading @@ -158,7 +158,7 @@ int Ver4PatriciaTriePolicy::getBigramsPositionOfPtNode(const int ptNodePos) cons if (ptNodePos == NOT_A_DICT_POS) { if (ptNodePos == NOT_A_DICT_POS) { return NOT_A_DICT_POS; return NOT_A_DICT_POS; } } const PtNodeParams ptNodeParams(mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos)); const PtNodeParams ptNodeParams(mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos)); if (ptNodeParams.isDeleted()) { if (ptNodeParams.isDeleted()) { return NOT_A_DICT_POS; return NOT_A_DICT_POS; } } Loading Loading @@ -410,7 +410,7 @@ const WordProperty Ver4PatriciaTriePolicy::getWordProperty(const int *const code AKLOGE("getWordProperty is called for invalid word."); AKLOGE("getWordProperty is called for invalid word."); return WordProperty(); return WordProperty(); } } const PtNodeParams ptNodeParams = mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos); const PtNodeParams ptNodeParams = mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos); std::vector<int> codePointVector(ptNodeParams.getCodePoints(), std::vector<int> codePointVector(ptNodeParams.getCodePoints(), ptNodeParams.getCodePoints() + ptNodeParams.getCodePointCount()); ptNodeParams.getCodePoints() + ptNodeParams.getCodePointCount()); const ProbabilityEntry probabilityEntry = const ProbabilityEntry probabilityEntry = Loading