Fix a bug of the conversion of the correction algorithm

Bug: 5414829

+1      25
-1      17
+2       0
-2       0
+3       0
-3       0
+4      15
-4       9
+5       2
-5       9
+6      13
-6       4
+7       3
-7      19

Change-Id: Ie99db961051320ee31d31476ea7c25b1d837c484
diff --git a/native/src/correction.cpp b/native/src/correction.cpp
index d1e866d..a08a21b 100644
--- a/native/src/correction.cpp
+++ b/native/src/correction.cpp
@@ -299,23 +299,41 @@
 
     // TODO: Change the limit if we'll allow two or more proximity chars with corrections
     const bool checkProximityChars = noCorrectionsHappenedSoFar ||  mProximityCount == 0;
-    const ProximityInfo::ProximityType matchedProximityCharId = secondTransposing
+    ProximityInfo::ProximityType matchedProximityCharId = secondTransposing
             ? ProximityInfo::EQUIVALENT_CHAR
             : mProximityInfo->getMatchedProximityId(mInputIndex, c, checkProximityChars);
 
     if (ProximityInfo::UNRELATED_CHAR == matchedProximityCharId) {
+        if (canTryCorrection && mOutputIndex > 0
+                && mCorrectionStates[mOutputIndex].mProximityMatching
+                && mCorrectionStates[mOutputIndex].mExceeding
+                && isEquivalentChar(mProximityInfo->getMatchedProximityId(
+                        mInputIndex, mWord[mOutputIndex - 1], false))) {
+            if (DEBUG_CORRECTION) {
+                LOGI("CONVERSION p->e %c", mWord[mOutputIndex - 1]);
+            }
+            // Conversion p->e
+            // Example:
+            // wearth ->    earth
+            // px     -> (E)mmmmm
+            ++mExcessiveCount;
+            --mProximityCount;
+            mExcessivePos = mOutputIndex - 1;
+            ++mInputIndex;
+            // Here, we are doing something equivalent to matchedProximityCharId,
+            // but we already know that "excessive char correction" just happened
+            // so that we just need to check "mProximityCount == 0".
+            matchedProximityCharId =
+                    mProximityInfo->getMatchedProximityId(mInputIndex, c, mProximityCount == 0);
+        }
+    }
+
+    if (ProximityInfo::UNRELATED_CHAR == matchedProximityCharId) {
         // TODO: Optimize
         // As the current char turned out to be an unrelated char,
         // we will try other correction-types. Please note that mCorrectionStates[mOutputIndex]
         // here refers to the previous state.
-        if (canTryCorrection && mCorrectionStates[mOutputIndex].mProximityMatching
-                && mCorrectionStates[mOutputIndex].mExceeding
-                && isEquivalentChar(mProximityInfo->getMatchedProximityId(
-                        mInputIndex, mWord[mOutputIndex], false))) {
-            // Conversion p->e
-            ++mExcessiveCount;
-            --mProximityCount;
-        } else if (mInputIndex < mInputLength - 1 && mOutputIndex > 0 && mTransposedCount > 0
+        if (mInputIndex < mInputLength - 1 && mOutputIndex > 0 && mTransposedCount > 0
                 && !mCorrectionStates[mOutputIndex].mTransposing
                 && mCorrectionStates[mOutputIndex - 1].mTransposing
                 && isEquivalentChar(mProximityInfo->getMatchedProximityId(
@@ -425,6 +443,11 @@
             || isSameAsUserTypedLength) && isTerminal) {
         mTerminalInputIndex = mInputIndex - 1;
         mTerminalOutputIndex = mOutputIndex - 1;
+        if (DEBUG_CORRECTION) {
+            DUMP_WORD(mWord, mOutputIndex);
+            LOGI("ONTERMINAL(1): %d, %d, %d, %d, %c", mProximityCount, mSkippedCount,
+                    mTransposedCount, mExcessiveCount, c);
+        }
         return ON_TERMINAL;
     } else {
         return NOT_ON_TERMINAL;