Fix: huge bigram costs for blacklisted words.

Bug: 8844931
Change-Id: I523005c5ed9a3d401a67b0e4e1c3ff2e4574e6df
diff --git a/native/jni/src/suggest/core/dicnode/dic_node.h b/native/jni/src/suggest/core/dicnode/dic_node.h
index 808d2a6..e22e999 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node.h
+++ b/native/jni/src/suggest/core/dicnode/dic_node.h
@@ -213,14 +213,18 @@
         return mDicNodeState.mDicNodeStateOutput.getCodePointAt(getNodeCodePointCount());
     }
 
-    bool isImpossibleBigramWord() const {
+    // Check if the current word and the previous word can be considered as a valid multiple word
+    // suggestion.
+    bool isValidMultipleWordSuggestion() const {
         if (isBlacklistedOrNotAWord()) {
-            return true;
+            return false;
         }
+        // Treat suggestion as invalid if the current and the previous word are single character
+        // words.
         const int prevWordLen = mDicNodeState.mDicNodeStatePrevWord.getPrevWordLength()
                 - mDicNodeState.mDicNodeStatePrevWord.getPrevWordStart() - 1;
         const int currentWordLen = getNodeCodePointCount();
-        return (prevWordLen == 1 && currentWordLen == 1);
+        return (prevWordLen != 1 || currentWordLen != 1);
     }
 
     bool isFirstCharUppercase() const {
diff --git a/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
index 8b6f455..0713442 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
+++ b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
@@ -159,7 +159,7 @@
 /* static */ float DicNodeUtils::getBigramNodeImprobability(
         const BinaryDictionaryInfo *const binaryDictionaryInfo,
         const DicNode *const node, MultiBigramMap *multiBigramMap) {
-    if (node->isImpossibleBigramWord()) {
+    if (node->hasMultipleWords() && !node->isValidMultipleWordSuggestion()) {
         return static_cast<float>(MAX_VALUE_FOR_WEIGHTING);
     }
     const int probability = getBigramNodeProbability(binaryDictionaryInfo, node, multiBigramMap);
diff --git a/native/jni/src/suggest/policyimpl/typing/typing_scoring.h b/native/jni/src/suggest/policyimpl/typing/typing_scoring.h
index 90e2133..56ffcc9 100644
--- a/native/jni/src/suggest/policyimpl/typing/typing_scoring.h
+++ b/native/jni/src/suggest/policyimpl/typing/typing_scoring.h
@@ -55,10 +55,10 @@
             const int inputSize, const bool forceCommit) const {
         const float maxDistance = ScoringParams::DISTANCE_WEIGHT_LANGUAGE
                 + static_cast<float>(inputSize) * ScoringParams::TYPING_MAX_OUTPUT_SCORE_PER_INPUT;
-        return static_cast<int>((ScoringParams::TYPING_BASE_OUTPUT_SCORE
-                - (compoundDistance / maxDistance)
-                + (forceCommit ? ScoringParams::AUTOCORRECT_OUTPUT_THRESHOLD : 0.0f))
-                        * SUGGEST_INTERFACE_OUTPUT_SCALE);
+        const float score = ScoringParams::TYPING_BASE_OUTPUT_SCORE
+                - compoundDistance / maxDistance
+                + (forceCommit ? ScoringParams::AUTOCORRECT_OUTPUT_THRESHOLD : 0.0f);
+        return static_cast<int>(score * SUGGEST_INTERFACE_OUTPUT_SCALE);
     }
 
     AK_FORCE_INLINE float getDoubleLetterDemotionDistanceCost(const int terminalIndex,