Add the suggestion algorithm of words with space proximity

Bug: 3311719

Change-Id: Ide12a4a6280103c092fa0f563dd5b9e3f7f5c89b
diff --git a/native/src/proximity_info.cpp b/native/src/proximity_info.cpp
index d0cba3e..5f2d09f 100644
--- a/native/src/proximity_info.cpp
+++ b/native/src/proximity_info.cpp
@@ -17,18 +17,48 @@
 #include <stdio.h>
 #include <string.h>
 
+#define LOG_TAG "LatinIME: proximity_info.cpp"
+
 #include "proximity_info.h"
 
 namespace latinime {
-ProximityInfo::ProximityInfo(int maxProximityCharsSize, int displayWidth, int displayHeight,
-        int gridWidth, int gridHeight, uint32_t const *proximityCharsArray)
-        : MAX_PROXIMITY_CHARS_SIZE(maxProximityCharsSize), DISPLAY_WIDTH(displayWidth),
-          DISPLAY_HEIGHT(displayHeight), GRID_WIDTH(gridWidth), GRID_HEIGHT(gridHeight) {
-    mProximityCharsArray = new uint32_t[GRID_WIDTH * GRID_HEIGHT * MAX_PROXIMITY_CHARS_SIZE];
-    memcpy(mProximityCharsArray, proximityCharsArray, sizeof(mProximityCharsArray));
+ProximityInfo::ProximityInfo(const int maxProximityCharsSize, const int keyboardWidth,
+        const int keyboardHeight, const int gridWidth, const int gridHeight,
+        const uint32_t *proximityCharsArray)
+        : MAX_PROXIMITY_CHARS_SIZE(maxProximityCharsSize), KEYBOARD_WIDTH(keyboardWidth),
+          KEYBOARD_HEIGHT(keyboardHeight), GRID_WIDTH(gridWidth), GRID_HEIGHT(gridHeight),
+          CELL_WIDTH((keyboardWidth + gridWidth - 1) / gridWidth),
+          CELL_HEIGHT((keyboardHeight + gridHeight - 1) / gridHeight) {
+    const int len = GRID_WIDTH * GRID_HEIGHT * MAX_PROXIMITY_CHARS_SIZE;
+    mProximityCharsArray = new uint32_t[len];
+    if (DEBUG_PROXIMITY_INFO) {
+        LOGI("Create proximity info array %d", len);
+    }
+    memcpy(mProximityCharsArray, proximityCharsArray, len * sizeof(mProximityCharsArray[0]));
 }
 
 ProximityInfo::~ProximityInfo() {
     delete[] mProximityCharsArray;
 }
+
+inline int ProximityInfo::getStartIndexFromCoordinates(const int x, const int y) const {
+    return (y / CELL_HEIGHT) * GRID_WIDTH + (x / CELL_WIDTH)
+            * MAX_PROXIMITY_CHARS_SIZE;
 }
+
+bool ProximityInfo::hasSpaceProximity(const int x, const int y) const {
+    const int startIndex = getStartIndexFromCoordinates(x, y);
+    if (DEBUG_PROXIMITY_INFO) {
+        LOGI("hasSpaceProximity: index %d", startIndex);
+    }
+    for (int i = 0; i < MAX_PROXIMITY_CHARS_SIZE; ++i) {
+        if (DEBUG_PROXIMITY_INFO) {
+            LOGI("Index: %d", mProximityCharsArray[startIndex + i]);
+        }
+        if (mProximityCharsArray[startIndex + i] == KEYCODE_SPACE) {
+            return true;
+        }
+    }
+    return false;
+}
+}  // namespace latinime