Merge "Use XML animator definition"
diff --git a/java/res/xml-sw600dp/key_styles_common.xml b/java/res/xml-sw600dp/key_styles_common.xml
index b206f0e..a263acd 100644
--- a/java/res/xml-sw600dp/key_styles_common.xml
+++ b/java/res/xml-sw600dp/key_styles_common.xml
@@ -82,9 +82,7 @@
         latin:styleName="zwnjKeyStyle"
         latin:keyLabel="‌"
         latin:moreKeys="‍"
-        latin:keyLabelFlags="hasPopupHint"
-        latin:altCode="@integer/key_space"
-        latin:keyActionFlags="altCodeWhileTyping" />
+        latin:keyLabelFlags="hasPopupHint" />
     <key-style
         latin:styleName="smileyKeyStyle"
         latin:keyLabel=":-)"
diff --git a/java/res/xml-sw768dp/key_styles_common.xml b/java/res/xml-sw768dp/key_styles_common.xml
index 069fc63..fade151 100644
--- a/java/res/xml-sw768dp/key_styles_common.xml
+++ b/java/res/xml-sw768dp/key_styles_common.xml
@@ -81,9 +81,7 @@
         latin:styleName="zwnjKeyStyle"
         latin:keyLabel="&#x200C;"
         latin:moreKeys="&#x200D;"
-        latin:keyLabelFlags="hasPopupHint"
-        latin:altCode="@integer/key_space"
-        latin:keyActionFlags="altCodeWhileTyping" />
+        latin:keyLabelFlags="hasPopupHint" />
     <key-style
         latin:styleName="smileyKeyStyle"
         latin:keyLabel=":-)"
diff --git a/java/res/xml/key_styles_common.xml b/java/res/xml/key_styles_common.xml
index 7b526c0..087b895 100644
--- a/java/res/xml/key_styles_common.xml
+++ b/java/res/xml/key_styles_common.xml
@@ -112,8 +112,6 @@
         latin:keyLabel="&#x200C;"
         latin:moreKeys="&#x200D;"
         latin:keyLabelFlags="hasPopupHint"
-        latin:altCode="@integer/key_space"
-        latin:keyActionFlags="altCodeWhileTyping"
         latin:backgroundType="functional" />
     <key-style
         latin:styleName="shortcutKeyStyle"
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index f41972e..ec40879 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -930,7 +930,8 @@
                     false /* typedWordValid */,
                     false /* hasMinimalSuggestion */,
                     false /* allowsToBeAutoCorrected */,
-                    false /* isPunctuationSuggestions */);
+                    false /* isPunctuationSuggestions */,
+                    false /* shouldBlockAutoCorrectionBySafetyNet */);
             // When in fullscreen mode, show completions generated by the application
             final SuggestedWords words = builder.build();
             final boolean isAutoCorrection = false;
@@ -1769,6 +1770,7 @@
         // getSuggestedWordBuilder handles gracefully a null value of prevWord
         final SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder(mWordComposer,
                 prevWord, mKeyboardSwitcher.getKeyboard().getProximityInfo(), mCorrectionMode);
+        final SuggestedWords suggestions = builder.build();
 
         // Basically, we update the suggestion strip only when suggestion count > 1.  However,
         // there is an exception: We update the suggestion strip whenever typed word's length
@@ -1776,9 +1778,10 @@
         // in most cases, suggestion count is 1 when typed word's length is 1, but we do always
         // need to clear the previous state when the user starts typing a word (i.e. typed word's
         // length == 1).
-        if (builder.size() > 1 || typedWord.length() == 1 || !builder.allowsToBeAutoCorrected()
+        if (suggestions.size() > 1 || typedWord.length() == 1
+                || !suggestions.mAllowsToBeAutoCorrected
                 || mSuggestionsView.isShowingAddToDictionaryHint()) {
-            showSuggestions(builder.build(), typedWord);
+            showSuggestions(suggestions, typedWord);
         } else {
             SuggestedWords previousSuggestions = mSuggestionsView.getSuggestions();
             if (previousSuggestions == mSettingsValues.mSuggestPuncList) {
@@ -1792,7 +1795,8 @@
                             false /* typedWordValid */,
                             false /* hasMinimalSuggestion */,
                             false /* allowsToBeAutoCorrected */,
-                            false /* isPunctuationSuggestions */);
+                            false /* isPunctuationSuggestions */,
+                            false /* shouldBlockAutoCorrectionBySafetyNet */);
             showSuggestions(obsoleteSuggestionsBuilder.build(), typedWord);
         }
     }
diff --git a/java/src/com/android/inputmethod/latin/SettingsValues.java b/java/src/com/android/inputmethod/latin/SettingsValues.java
index 0a4aea1..7ae9532 100644
--- a/java/src/com/android/inputmethod/latin/SettingsValues.java
+++ b/java/src/com/android/inputmethod/latin/SettingsValues.java
@@ -187,7 +187,8 @@
                 false /* typedWordValid */,
                 false /* hasMinimalSuggestion */,
                 false /* allowsToBeAutoCorrected */,
-                true /* isPunctuationSuggestions */);
+                true /* isPunctuationSuggestions */,
+                false /* shouldBlockAutoCorrectionBySafetyNet */);
         return builder.build();
     }
 
@@ -209,7 +210,8 @@
                 false /* typedWordValid */,
                 false /* hasMinimalSuggestion */,
                 false /* allowsToBeAutoCorrected */,
-                true /* isPunctuationSuggestions */);
+                true /* isPunctuationSuggestions */,
+                false /* shouldBlockAutoCorrectionBySafetyNet */);
         return builder.build();
     }
 
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 28d3b44..b02c973 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -274,7 +274,8 @@
                 false /* typedWordValid */,
                 false /* hasMinimalSuggestion */,
                 false /* allowsToBeAutoCorrected */,
-                false /* isPunctuationSuggestions */);
+                false /* isPunctuationSuggestions */,
+                false /* shouldBlockAutoCorrectionBySafetyNet */);
     }
 
     // TODO: cleanup dictionaries looking up and suggestions building with SuggestedWords.Builder
@@ -437,15 +438,20 @@
         }
         // Don't auto-correct words with multiple capital letter
         autoCorrectionAvailable &= !wordComposer.isMostlyCaps();
+        final boolean shouldBlockAutoCorrectionBySatefyNet;
+        if (allowsToBeAutoCorrected && scoreInfoList.size() > 1 && mAutoCorrectionThreshold > 0
+                && Suggest.shouldBlockAutoCorrectionBySafetyNet(typedWord,
+                        scoreInfoList.get(1).mWord)) {
+            shouldBlockAutoCorrectionBySatefyNet = true;
+        } else {
+            shouldBlockAutoCorrectionBySatefyNet = false;
+        }
         builder = new SuggestedWords.Builder(scoreInfoList,
                 !allowsToBeAutoCorrected /* typedWordValid */,
                 autoCorrectionAvailable /* hasMinimalSuggestion */,
                 allowsToBeAutoCorrected /* allowsToBeAutoCorrected */,
-                false /* isPunctuationSuggestions */);
-        if (allowsToBeAutoCorrected && builder.size() > 1 && mAutoCorrectionThreshold > 0
-                && Suggest.shouldBlockAutoCorrectionBySafetyNet(typedWord, builder.getWord(1))) {
-            builder.setShouldBlockAutoCorrectionBySafetyNet();
-        }
+                false /* isPunctuationSuggestions */,
+                shouldBlockAutoCorrectionBySatefyNet);
         return builder;
     }
 
diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java
index 144e674..03ff5de 100644
--- a/java/src/com/android/inputmethod/latin/SuggestedWords.java
+++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java
@@ -25,21 +25,25 @@
 
 public class SuggestedWords {
     public static final SuggestedWords EMPTY = new SuggestedWords(false, false, false, false,
-            Collections.<SuggestedWordInfo>emptyList());
+            false, Collections.<SuggestedWordInfo>emptyList());
 
     public final boolean mTypedWordValid;
     public final boolean mHasAutoCorrectionCandidate;
     public final boolean mIsPunctuationSuggestions;
+    public final boolean mAllowsToBeAutoCorrected;
     private final List<SuggestedWordInfo> mSuggestedWordInfoList;
 
-    SuggestedWords(boolean typedWordValid,
-            boolean hasAutoCorrectionCandidate, boolean isPunctuationSuggestions,
-            boolean shouldBlockAutoCorrectionBySafetyNet,
-            List<SuggestedWordInfo> suggestedWordInfoList) {
+    SuggestedWords(final boolean typedWordValid,
+            final boolean hasAutoCorrectionCandidate,
+            final boolean isPunctuationSuggestions,
+            final boolean shouldBlockAutoCorrectionBySafetyNet,
+            final boolean allowsToBeAutoCorrected,
+            final List<SuggestedWordInfo> suggestedWordInfoList) {
         mTypedWordValid = typedWordValid;
         mHasAutoCorrectionCandidate = hasAutoCorrectionCandidate
                 && !shouldBlockAutoCorrectionBySafetyNet;
         mIsPunctuationSuggestions = isPunctuationSuggestions;
+        mAllowsToBeAutoCorrected = allowsToBeAutoCorrected;
         mSuggestedWordInfoList = suggestedWordInfoList;
     }
 
@@ -76,7 +80,7 @@
         private final boolean mTypedWordValid;
         private final boolean mHasMinimalSuggestion;
         private final boolean mIsPunctuationSuggestions;
-        private boolean mShouldBlockAutoCorrectionBySafetyNet;
+        private final boolean mShouldBlockAutoCorrectionBySafetyNet;
         private final boolean mAllowsToBeAutoCorrected;
         private final List<SuggestedWordInfo> mSuggestedWordInfoList;
 
@@ -84,12 +88,14 @@
                 final boolean typedWordValid,
                 final boolean hasMinimalSuggestion,
                 final boolean allowsToBeAutoCorrected,
-                final boolean isPunctuationSuggestions) {
+                final boolean isPunctuationSuggestions,
+                final boolean shouldBlockAutoCorrectionBySafetyNet) {
             mSuggestedWordInfoList = suggestedWordInfoList;
             mTypedWordValid = typedWordValid;
             mHasMinimalSuggestion = hasMinimalSuggestion;
             mAllowsToBeAutoCorrected = allowsToBeAutoCorrected;
             mIsPunctuationSuggestions = isPunctuationSuggestions;
+            mShouldBlockAutoCorrectionBySafetyNet = shouldBlockAutoCorrectionBySafetyNet;
         }
 
         public static ArrayList<SuggestedWordInfo> getFromCharSequenceList(
@@ -110,11 +116,6 @@
             return result;
         }
 
-        public Builder setShouldBlockAutoCorrectionBySafetyNet() {
-            mShouldBlockAutoCorrectionBySafetyNet = true;
-            return this;
-        }
-
         // Should get rid of the first one (what the user typed previously) from suggestions
         // and replace it with what the user currently typed.
         public static ArrayList<SuggestedWordInfo> getTypedWordAndPreviousSuggestions(
@@ -138,7 +139,7 @@
         public SuggestedWords build() {
             return new SuggestedWords(mTypedWordValid, mHasMinimalSuggestion,
                     mIsPunctuationSuggestions, mShouldBlockAutoCorrectionBySafetyNet,
-                    mSuggestedWordInfoList);
+                    mAllowsToBeAutoCorrected, mSuggestedWordInfoList);
         }
 
         public int size() {
@@ -166,7 +167,7 @@
     }
 
     public static class SuggestedWordInfo {
-        private final CharSequence mWord;
+        public final CharSequence mWord;
         private final CharSequence mDebugString;
         private final boolean mPreviousSuggestedWord;
 
diff --git a/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp b/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp
index e47a64a..9eb437c 100644
--- a/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp
+++ b/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp
@@ -50,7 +50,7 @@
     ProximityInfo *proximityInfo = new ProximityInfo(
             localeStr, maxProximityCharsSize, displayWidth,
             displayHeight, gridWidth, gridHeight, mostCommonkeyWidth,
-            (const uint32_t*)proximityChars,
+            (const int32_t*)proximityChars,
             keyCount, (const int32_t*)keyXCoordinates, (const int32_t*)keyYCoordinates,
             (const int32_t*)keyWidths, (const int32_t*)keyHeights, (const int32_t*)keyCharCodes,
             (const float*)sweetSpotCenterXs, (const float*)sweetSpotCenterYs,
diff --git a/native/src/additional_proximity_chars.cpp b/native/src/additional_proximity_chars.cpp
index 401c85a..224f020 100644
--- a/native/src/additional_proximity_chars.cpp
+++ b/native/src/additional_proximity_chars.cpp
@@ -19,23 +19,23 @@
 namespace latinime {
 const std::string AdditionalProximityChars::LOCALE_EN_US("en");
 
-const uint32_t AdditionalProximityChars::EN_US_ADDITIONAL_A[EN_US_ADDITIONAL_A_SIZE] = {
+const int32_t AdditionalProximityChars::EN_US_ADDITIONAL_A[EN_US_ADDITIONAL_A_SIZE] = {
     'e', 'i', 'o', 'u'
 };
 
-const uint32_t AdditionalProximityChars::EN_US_ADDITIONAL_E[EN_US_ADDITIONAL_E_SIZE] = {
+const int32_t AdditionalProximityChars::EN_US_ADDITIONAL_E[EN_US_ADDITIONAL_E_SIZE] = {
     'a', 'i', 'o', 'u'
 };
 
-const uint32_t AdditionalProximityChars::EN_US_ADDITIONAL_I[EN_US_ADDITIONAL_I_SIZE] = {
+const int32_t AdditionalProximityChars::EN_US_ADDITIONAL_I[EN_US_ADDITIONAL_I_SIZE] = {
     'a', 'e', 'o', 'u'
 };
 
-const uint32_t AdditionalProximityChars::EN_US_ADDITIONAL_O[EN_US_ADDITIONAL_O_SIZE] = {
+const int32_t AdditionalProximityChars::EN_US_ADDITIONAL_O[EN_US_ADDITIONAL_O_SIZE] = {
     'a', 'e', 'i', 'u'
 };
 
-const uint32_t AdditionalProximityChars::EN_US_ADDITIONAL_U[EN_US_ADDITIONAL_U_SIZE] = {
+const int32_t AdditionalProximityChars::EN_US_ADDITIONAL_U[EN_US_ADDITIONAL_U_SIZE] = {
     'a', 'e', 'i', 'o'
 };
 }
diff --git a/native/src/additional_proximity_chars.h b/native/src/additional_proximity_chars.h
index e0049d9..e0ecc0e 100644
--- a/native/src/additional_proximity_chars.h
+++ b/native/src/additional_proximity_chars.h
@@ -20,29 +20,31 @@
 #include <stdint.h>
 #include <string>
 
+#include "defines.h"
+
 namespace latinime {
 
 class AdditionalProximityChars {
  private:
     static const std::string LOCALE_EN_US;
     static const int EN_US_ADDITIONAL_A_SIZE = 4;
-    static const uint32_t EN_US_ADDITIONAL_A[];
+    static const int32_t EN_US_ADDITIONAL_A[];
     static const int EN_US_ADDITIONAL_E_SIZE = 4;
-    static const uint32_t EN_US_ADDITIONAL_E[];
+    static const int32_t EN_US_ADDITIONAL_E[];
     static const int EN_US_ADDITIONAL_I_SIZE = 4;
-    static const uint32_t EN_US_ADDITIONAL_I[];
+    static const int32_t EN_US_ADDITIONAL_I[];
     static const int EN_US_ADDITIONAL_O_SIZE = 4;
-    static const uint32_t EN_US_ADDITIONAL_O[];
+    static const int32_t EN_US_ADDITIONAL_O[];
     static const int EN_US_ADDITIONAL_U_SIZE = 4;
-    static const uint32_t EN_US_ADDITIONAL_U[];
+    static const int32_t EN_US_ADDITIONAL_U[];
 
-    static bool isEnLocale(const std::string* locale_str) {
+    static bool isEnLocale(const std::string *locale_str) {
         return locale_str && locale_str->size() >= LOCALE_EN_US.size()
-                && locale_str->compare(0, LOCALE_EN_US.size(), LOCALE_EN_US);
+                && LOCALE_EN_US.compare(0, LOCALE_EN_US.size(), *locale_str);
     }
 
  public:
-    static int getAdditionalCharsSize(const std::string* locale_str, const uint16_t c) {
+    static int getAdditionalCharsSize(const std::string* locale_str, const int32_t c) {
         if (!isEnLocale(locale_str)) {
             return 0;
         }
@@ -62,7 +64,7 @@
         }
     }
 
-    static const uint32_t* getAdditionalChars(const std::string* locale_str, const uint32_t c) {
+    static const int32_t* getAdditionalChars(const std::string *locale_str, const int32_t c) {
         if (!isEnLocale(locale_str)) {
             return 0;
         }
@@ -82,7 +84,7 @@
         }
     }
 
-    static bool hasAdditionalChars(const std::string* locale_str, const uint32_t c) {
+    static bool hasAdditionalChars(const std::string *locale_str, const int32_t c) {
         return getAdditionalCharsSize(locale_str, c) > 0;
     }
 };
diff --git a/native/src/defines.h b/native/src/defines.h
index afa1e04..b0dbffa 100644
--- a/native/src/defines.h
+++ b/native/src/defines.h
@@ -115,6 +115,7 @@
 #define DEBUG_NODE DEBUG_DICT_FULL
 #define DEBUG_TRACE DEBUG_DICT_FULL
 #define DEBUG_PROXIMITY_INFO false
+#define DEBUG_PROXIMITY_CHARS false
 #define DEBUG_CORRECTION false
 #define DEBUG_CORRECTION_FREQ false
 #define DEBUG_WORDS_PRIORITY_QUEUE false
@@ -128,6 +129,7 @@
 #define DEBUG_NODE false
 #define DEBUG_TRACE false
 #define DEBUG_PROXIMITY_INFO false
+#define DEBUG_PROXIMITY_CHARS false
 #define DEBUG_CORRECTION false
 #define DEBUG_CORRECTION_FREQ false
 #define DEBUG_WORDS_PRIORITY_QUEUE false
diff --git a/native/src/proximity_info.cpp b/native/src/proximity_info.cpp
index e590740..dd60ed6 100644
--- a/native/src/proximity_info.cpp
+++ b/native/src/proximity_info.cpp
@@ -37,7 +37,7 @@
 ProximityInfo::ProximityInfo(const std::string localeStr, const int maxProximityCharsSize,
         const int keyboardWidth, const int keyboardHeight, const int gridWidth,
         const int gridHeight, const int mostCommonKeyWidth,
-        const uint32_t *proximityCharsArray, const int keyCount, const int32_t *keyXCoordinates,
+        const int32_t *proximityCharsArray, const int keyCount, const int32_t *keyXCoordinates,
         const int32_t *keyYCoordinates, const int32_t *keyWidths, const int32_t *keyHeights,
         const int32_t *keyCharCodes, const float *sweetSpotCenterXs, const float *sweetSpotCenterYs,
         const float *sweetSpotRadii)
@@ -54,7 +54,7 @@
           mInputXCoordinates(0), mInputYCoordinates(0),
           mTouchPositionCorrectionEnabled(false) {
     const int proximityGridLength = GRID_WIDTH * GRID_HEIGHT * MAX_PROXIMITY_CHARS_SIZE;
-    mProximityCharsArray = new uint32_t[proximityGridLength];
+    mProximityCharsArray = new int32_t[proximityGridLength];
     if (DEBUG_PROXIMITY_INFO) {
         AKLOGI("Create proximity info array %d", proximityGridLength);
     }
@@ -148,35 +148,43 @@
 }
 
 void ProximityInfo::calculateNearbyKeyCodes(
-        const int x, const int y, const uint32_t primaryKey, int *inputCodes) {
+        const int x, const int y, const int32_t primaryKey, int *inputCodes) {
     int insertPos = 0;
     inputCodes[insertPos++] = primaryKey;
     const int startIndex = getStartIndexFromCoordinates(x, y);
     for (int i = 0; i < MAX_PROXIMITY_CHARS_SIZE; ++i) {
-        const uint32_t c = mProximityCharsArray[startIndex + i];
+        const int32_t c = mProximityCharsArray[startIndex + i];
         if (c < KEYCODE_SPACE || c == primaryKey) {
             continue;
         }
-        for (int j = 0; j < KEY_COUNT; ++j) {
-            const bool onKey = isOnKey(j, x, y);
-            const int distance = squaredDistanceToEdge(j, x, y);
-            if (onKey || distance < MOST_COMMON_KEY_WIDTH_SQUARE) {
-                inputCodes[insertPos++] = c;
+        int keyIndex = getKeyIndex(c);
+        const bool onKey = isOnKey(keyIndex, x, y);
+        const int distance = squaredDistanceToEdge(keyIndex, x, y);
+        if (onKey || distance < MOST_COMMON_KEY_WIDTH_SQUARE) {
+            inputCodes[insertPos++] = c;
+            if (insertPos >= MAX_PROXIMITY_CHARS_SIZE) {
+                if (DEBUG_DICT) {
+                    assert(false);
+                }
+                return;
             }
         }
     }
-    const int existingProximitySize = insertPos;
-    for (int i = 0; i < existingProximitySize; ++i) {
-        const uint32_t c = inputCodes[i];
-        const int additionalProximitySize =
-                AdditionalProximityChars::hasAdditionalChars(&mLocaleStr, c);
-        if (additionalProximitySize <= 0) {
-            continue;
+    inputCodes[insertPos++] = ADDITIONAL_PROXIMITY_CHAR_DELIMITER_CODE;
+    if (insertPos >= MAX_PROXIMITY_CHARS_SIZE) {
+        if (DEBUG_DICT) {
+            assert(false);
         }
-        const uint32_t* additionalProximityChars =
-                AdditionalProximityChars::getAdditionalChars(&mLocaleStr, c);
+        return;
+    }
+
+    const int additionalProximitySize =
+            AdditionalProximityChars::getAdditionalCharsSize(&mLocaleStr, primaryKey);
+    if (additionalProximitySize > 0) {
+        const int32_t* additionalProximityChars =
+                AdditionalProximityChars::getAdditionalChars(&mLocaleStr, primaryKey);
         for (int j = 0; j < additionalProximitySize; ++j) {
-            const uint32_t ac = additionalProximityChars[j];
+            const int32_t ac = additionalProximityChars[j];
             int k = 0;
             for (; k < insertPos; ++k) {
                 if ((int)ac == inputCodes[k]) {
@@ -187,9 +195,16 @@
                 continue;
             }
             inputCodes[insertPos++] = ac;
+            if (insertPos >= MAX_PROXIMITY_CHARS_SIZE) {
+                if (DEBUG_DICT) {
+                    assert(false);
+                }
+                return;
+            }
         }
     }
-    // TODO: calculate additional chars
+    // Add a delimiter for the proximity characters
+    inputCodes[insertPos] = 0;
 }
 
 // TODO: Calculate nearby codes here.
@@ -205,8 +220,30 @@
         mPrimaryInputWord[i] = getPrimaryCharAt(i);
     }
     mPrimaryInputWord[inputLength] = 0;
+    if (DEBUG_PROXIMITY_CHARS) {
+        AKLOGI("--- setInputParams");
+    }
     for (int i = 0; i < mInputLength; ++i) {
         const int *proximityChars = getProximityCharsAt(i);
+        const int primaryKey = proximityChars[0];
+        const int x = xCoordinates[i];
+        const int y = yCoordinates[i];
+        if (DEBUG_PROXIMITY_CHARS) {
+            int a = x + y + primaryKey;
+            a += 0;
+            AKLOGI("--- Primary = %c, x = %d, y = %d", primaryKey, x, y);
+            // Keep debug code just in case
+            //int proximities[50];
+            //for (int m = 0; m < 50; ++m) {
+            //proximities[m] = 0;
+            //}
+            //calculateNearbyKeyCodes(x, y, primaryKey, proximities);
+            //for (int l = 0; l < 50 && proximities[l] > 0; ++l) {
+            //if (DEBUG_PROXIMITY_CHARS) {
+            //AKLOGI("--- native Proximity (%d) = %c", l, proximities[l]);
+            //}
+            //}
+        }
         for (int j = 0; j < MAX_PROXIMITY_CHARS_SIZE && proximityChars[j] > 0; ++j) {
             const int currentChar = proximityChars[j];
             const int keyIndex = getKeyIndex(currentChar);
@@ -219,6 +256,9 @@
                         ? EQUIVALENT_CHAR_WITHOUT_DISTANCE_INFO
                         : PROXIMITY_CHAR_WITHOUT_DISTANCE_INFO;
             }
+            if (DEBUG_PROXIMITY_CHARS) {
+                AKLOGI("--- Proximity (%d) = %c", j, currentChar);
+            }
         }
     }
 }
diff --git a/native/src/proximity_info.h b/native/src/proximity_info.h
index 8c342e0..1a47aff 100644
--- a/native/src/proximity_info.h
+++ b/native/src/proximity_info.h
@@ -47,7 +47,7 @@
     ProximityInfo(const std::string localeStr, const int maxProximityCharsSize,
             const int keyboardWidth, const int keybaordHeight, const int gridWidth,
             const int gridHeight, const int mostCommonkeyWidth,
-            const uint32_t *proximityCharsArray, const int keyCount, const int32_t *keyXCoordinates,
+            const int32_t *proximityCharsArray, const int keyCount, const int32_t *keyXCoordinates,
             const int32_t *keyYCoordinates, const int32_t *keyWidths, const int32_t *keyHeights,
             const int32_t *keyCharCodes, const float *sweetSpotCenterXs,
             const float *sweetSpotCenterYs, const float *sweetSpotRadii);
@@ -92,7 +92,7 @@
     bool isOnKey(const int keyId, const int x, const int y);
     int squaredDistanceToEdge(const int keyId, const int x, const int y);
     void calculateNearbyKeyCodes(
-            const int x, const int y, const uint32_t primaryKey, int *inputCodes);
+            const int x, const int y, const int32_t primaryKey, int *inputCodes);
 
     const int MAX_PROXIMITY_CHARS_SIZE;
     const int KEYBOARD_WIDTH;
@@ -109,7 +109,7 @@
     const int *mInputXCoordinates;
     const int *mInputYCoordinates;
     bool mTouchPositionCorrectionEnabled;
-    uint32_t *mProximityCharsArray;
+    int32_t *mProximityCharsArray;
     int *mNormalizedSquaredDistances;
     int32_t mKeyXCoordinates[MAX_KEY_COUNT_IN_A_KEYBOARD];
     int32_t mKeyYCoordinates[MAX_KEY_COUNT_IN_A_KEYBOARD];