Merge "Make an add into a set."
diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java
index 5346712..b7f1ddd 100644
--- a/java/src/com/android/inputmethod/keyboard/Keyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -154,7 +154,7 @@
         mIconsSet = params.mIconsSet;
         mAdditionalProximityChars = params.mAdditionalProximityChars;
 
-        mProximityInfo = new ProximityInfo(
+        mProximityInfo = new ProximityInfo(params.mId.mLocale.toString(),
                 params.GRID_WIDTH, params.GRID_HEIGHT, mOccupiedWidth, mOccupiedHeight,
                 mMostCommonKeyWidth, mMostCommonKeyHeight, mKeys, params.mTouchPositionCorrection,
                 params.mAdditionalProximityChars);
diff --git a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java
index 13d18e5..8a65a5f 100644
--- a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java
+++ b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java
@@ -17,6 +17,7 @@
 package com.android.inputmethod.keyboard;
 
 import android.graphics.Rect;
+import android.text.TextUtils;
 
 import com.android.inputmethod.keyboard.Keyboard.Params.TouchPositionCorrection;
 import com.android.inputmethod.latin.JniUtils;
@@ -46,10 +47,17 @@
     private final int mKeyboardHeight;
     private final int mMostCommonKeyWidth;
     private final Key[][] mGridNeighbors;
+    private final String mLocaleStr;
 
-    ProximityInfo(int gridWidth, int gridHeight, int minWidth, int height, int mostCommonKeyWidth,
+    ProximityInfo(String localeStr, int gridWidth, int gridHeight, int minWidth, int height,
+            int mostCommonKeyWidth,
             int mostCommonKeyHeight, Set<Key> keys, TouchPositionCorrection touchPositionCorrection,
             Map<Integer, List<Integer>> additionalProximityChars) {
+        if (TextUtils.isEmpty(localeStr)) {
+            mLocaleStr = "";
+        } else {
+            mLocaleStr = localeStr;
+        }
         mGridWidth = gridWidth;
         mGridHeight = gridHeight;
         mGridSize = mGridWidth * mGridHeight;
@@ -69,7 +77,7 @@
     }
 
     public static ProximityInfo createDummyProximityInfo() {
-        return new ProximityInfo(1, 1, 1, 1, 1, 1, Collections.<Key> emptySet(),
+        return new ProximityInfo("", 1, 1, 1, 1, 1, 1, Collections.<Key> emptySet(),
                 null, Collections.<Integer, List<Integer>> emptyMap());
     }
 
@@ -155,7 +163,7 @@
             calculateSweetSpotParams = false;
         }
 
-        mNativeProximityInfo = setProximityInfoNative("", MAX_PROXIMITY_CHARS_SIZE,
+        mNativeProximityInfo = setProximityInfoNative(mLocaleStr, MAX_PROXIMITY_CHARS_SIZE,
                 keyboardWidth, keyboardHeight, mGridWidth, mGridHeight, mMostCommonKeyWidth,
                 proximityCharsArray,
                 keyCount, keyXCoordinates, keyYCoordinates, keyWidths, keyHeights, keyCharCodes,
diff --git a/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp b/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp
index a9b6cca..e47a64a 100644
--- a/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp
+++ b/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp
@@ -47,7 +47,8 @@
     jfloat *sweetSpotCenterXs = safeGetFloatArrayElements(env, sweetSpotCenterXArray);
     jfloat *sweetSpotCenterYs = safeGetFloatArrayElements(env, sweetSpotCenterYArray);
     jfloat *sweetSpotRadii = safeGetFloatArrayElements(env, sweetSpotRadiusArray);
-    ProximityInfo *proximityInfo = new ProximityInfo(localeStr, maxProximityCharsSize, displayWidth,
+    ProximityInfo *proximityInfo = new ProximityInfo(
+            localeStr, maxProximityCharsSize, displayWidth,
             displayHeight, gridWidth, gridHeight, mostCommonkeyWidth,
             (const uint32_t*)proximityChars,
             keyCount, (const int32_t*)keyXCoordinates, (const int32_t*)keyYCoordinates,
diff --git a/native/src/additional_proximity_chars.cpp b/native/src/additional_proximity_chars.cpp
index 74c96ae..401c85a 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 uint16_t AdditionalProximityChars::EN_US_ADDITIONAL_A[EN_US_ADDITIONAL_A_SIZE] = {
+const uint32_t AdditionalProximityChars::EN_US_ADDITIONAL_A[EN_US_ADDITIONAL_A_SIZE] = {
     'e', 'i', 'o', 'u'
 };
 
-const uint16_t AdditionalProximityChars::EN_US_ADDITIONAL_E[EN_US_ADDITIONAL_E_SIZE] = {
+const uint32_t AdditionalProximityChars::EN_US_ADDITIONAL_E[EN_US_ADDITIONAL_E_SIZE] = {
     'a', 'i', 'o', 'u'
 };
 
-const uint16_t AdditionalProximityChars::EN_US_ADDITIONAL_I[EN_US_ADDITIONAL_I_SIZE] = {
+const uint32_t AdditionalProximityChars::EN_US_ADDITIONAL_I[EN_US_ADDITIONAL_I_SIZE] = {
     'a', 'e', 'o', 'u'
 };
 
-const uint16_t AdditionalProximityChars::EN_US_ADDITIONAL_O[EN_US_ADDITIONAL_O_SIZE] = {
+const uint32_t AdditionalProximityChars::EN_US_ADDITIONAL_O[EN_US_ADDITIONAL_O_SIZE] = {
     'a', 'e', 'i', 'u'
 };
 
-const uint16_t AdditionalProximityChars::EN_US_ADDITIONAL_U[EN_US_ADDITIONAL_U_SIZE] = {
+const uint32_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 b76726c..e0049d9 100644
--- a/native/src/additional_proximity_chars.h
+++ b/native/src/additional_proximity_chars.h
@@ -26,23 +26,23 @@
  private:
     static const std::string LOCALE_EN_US;
     static const int EN_US_ADDITIONAL_A_SIZE = 4;
-    static const uint16_t EN_US_ADDITIONAL_A[];
+    static const uint32_t EN_US_ADDITIONAL_A[];
     static const int EN_US_ADDITIONAL_E_SIZE = 4;
-    static const uint16_t EN_US_ADDITIONAL_E[];
+    static const uint32_t EN_US_ADDITIONAL_E[];
     static const int EN_US_ADDITIONAL_I_SIZE = 4;
-    static const uint16_t EN_US_ADDITIONAL_I[];
+    static const uint32_t EN_US_ADDITIONAL_I[];
     static const int EN_US_ADDITIONAL_O_SIZE = 4;
-    static const uint16_t EN_US_ADDITIONAL_O[];
+    static const uint32_t EN_US_ADDITIONAL_O[];
     static const int EN_US_ADDITIONAL_U_SIZE = 4;
-    static const uint16_t EN_US_ADDITIONAL_U[];
+    static const uint32_t EN_US_ADDITIONAL_U[];
 
-    static bool isEnLocale(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);
     }
 
  public:
-    static int getAdditionalCharsSize(std::string* locale_str, uint16_t c) {
+    static int getAdditionalCharsSize(const std::string* locale_str, const uint16_t c) {
         if (!isEnLocale(locale_str)) {
             return 0;
         }
@@ -62,7 +62,7 @@
         }
     }
 
-    static const uint16_t* getAdditionalChars(std::string* locale_str, uint16_t c) {
+    static const uint32_t* getAdditionalChars(const std::string* locale_str, const uint32_t c) {
         if (!isEnLocale(locale_str)) {
             return 0;
         }
@@ -82,7 +82,7 @@
         }
     }
 
-    static bool hasAdditionalChars(std::string* locale_str, uint16_t c) {
+    static bool hasAdditionalChars(const std::string* locale_str, const uint32_t c) {
         return getAdditionalCharsSize(locale_str, c) > 0;
     }
 };
diff --git a/native/src/proximity_info.cpp b/native/src/proximity_info.cpp
index 561fffa..e590740 100644
--- a/native/src/proximity_info.cpp
+++ b/native/src/proximity_info.cpp
@@ -50,6 +50,7 @@
           HAS_TOUCH_POSITION_CORRECTION_DATA(keyCount > 0 && keyXCoordinates && keyYCoordinates
                   && keyWidths && keyHeights && keyCharCodes && sweetSpotCenterXs
                   && sweetSpotCenterYs && sweetSpotRadii),
+          mLocaleStr(localeStr),
           mInputXCoordinates(0), mInputYCoordinates(0),
           mTouchPositionCorrectionEnabled(false) {
     const int proximityGridLength = GRID_WIDTH * GRID_HEIGHT * MAX_PROXIMITY_CHARS_SIZE;
@@ -164,6 +165,30 @@
             }
         }
     }
+    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;
+        }
+        const uint32_t* additionalProximityChars =
+                AdditionalProximityChars::getAdditionalChars(&mLocaleStr, c);
+        for (int j = 0; j < additionalProximitySize; ++j) {
+            const uint32_t ac = additionalProximityChars[j];
+            int k = 0;
+            for (; k < insertPos; ++k) {
+                if ((int)ac == inputCodes[k]) {
+                    break;
+                }
+            }
+            if (k < insertPos) {
+                continue;
+            }
+            inputCodes[insertPos++] = ac;
+        }
+    }
     // TODO: calculate additional chars
 }
 
diff --git a/native/src/proximity_info.h b/native/src/proximity_info.h
index bfcef63..8c342e0 100644
--- a/native/src/proximity_info.h
+++ b/native/src/proximity_info.h
@@ -104,6 +104,7 @@
     const int CELL_HEIGHT;
     const int KEY_COUNT;
     const bool HAS_TOUCH_POSITION_CORRECTION_DATA;
+    const std::string mLocaleStr;
     const int *mInputCodes;
     const int *mInputXCoordinates;
     const int *mInputYCoordinates;