Fix: Suggested words from user history are invalid.

- Suggestions form user history can contain invalid words.
- isValidWord always returns false.

Bug: 11139426
Change-Id: I6075b275603332ddb00f4a9284afcaa82d824270
diff --git a/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java b/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java
index a1e3600..1de15a3 100644
--- a/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java
+++ b/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java
@@ -114,15 +114,6 @@
     }
 
     /**
-     * Return whether the passed charsequence is in the dictionary.
-     */
-    @Override
-    public boolean isValidWord(final String word) {
-     // Words included only in the user history should be treated as not in dictionary words.
-        return false;
-    }
-
-    /**
      * Pair will be added to the decaying dictionary.
      *
      * The first word may be null. That means we don't know the context, in other words,
diff --git a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.cpp
index a8ea69f..495b146 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.cpp
@@ -55,9 +55,16 @@
     readingHelper.initWithPtNodeArrayPos(dicNode->getChildrenPos());
     const DynamicPatriciaTrieNodeReader *const nodeReader = readingHelper.getNodeReader();
     while (!readingHelper.isEnd()) {
+        bool isTerminal = nodeReader->isTerminal() && !nodeReader->isDeleted();
+        if (isTerminal && mHeaderPolicy.isDecayingDict()) {
+            // A DecayingDict may have a terminal PtNode that has a terminal DicNode whose
+            // probability is NOT_A_PROBABILITY. In such case, we don't want to treat it as a
+            // valid terminal DicNode.
+            isTerminal = getProbability(nodeReader->getProbability(), NOT_A_PROBABILITY)
+                    != NOT_A_PROBABILITY;
+        }
         childDicNodes->pushLeavingChild(dicNode, nodeReader->getHeadPos(),
-                nodeReader->getChildrenPos(), nodeReader->getProbability(),
-                nodeReader->isTerminal() && !nodeReader->isDeleted(),
+                nodeReader->getChildrenPos(), nodeReader->getProbability(), isTerminal,
                 nodeReader->hasChildren(), nodeReader->isBlacklisted() || nodeReader->isNotAWord(),
                 nodeReader->getCodePointCount(), readingHelper.getMergedNodeCodePoints());
         readingHelper.readNextSiblingNode();