Loading java/src/com/android/inputmethod/keyboard/Keyboard.java +2 −2 Original line number Diff line number Diff line Loading @@ -174,7 +174,7 @@ public class Keyboard { mDefaultHeight = mDefaultWidth; mId = id; loadKeyboard(context, xmlLayoutResId); mProximityInfo = new ProximityInfo(mDisplayWidth, mDisplayHeight, GRID_WIDTH, GRID_HEIGHT); mProximityInfo = new ProximityInfo(GRID_WIDTH, GRID_HEIGHT); } public int getProximityInfo() { Loading Loading @@ -378,7 +378,7 @@ public class Keyboard { mGridNeighbors[(y / mCellHeight) * GRID_WIDTH + (x / mCellWidth)] = cell; } } mProximityInfo.setProximityInfo(mGridNeighbors); mProximityInfo.setProximityInfo(mGridNeighbors, getMinWidth(), getHeight(), mKeys); } public boolean isInside(Key key, int x, int y) { Loading java/src/com/android/inputmethod/keyboard/ProximityInfo.java +12 −14 Original line number Diff line number Diff line Loading @@ -18,18 +18,17 @@ package com.android.inputmethod.keyboard; import com.android.inputmethod.latin.Utils; import java.util.Arrays; import java.util.List; public class ProximityInfo { public static final int MAX_PROXIMITY_CHARS_SIZE = 16; private final int mDisplayWidth; private final int mDisplayHeight; private final int mGridWidth; private final int mGridHeight; private final int mGridSize; ProximityInfo(int displayWidth, int displayHeight, int gridWidth, int gridHeight) { mDisplayWidth = displayWidth; mDisplayHeight = displayHeight; ProximityInfo(int gridWidth, int gridHeight) { mGridWidth = gridWidth; mGridHeight = gridHeight; mGridSize = mGridWidth * mGridHeight; Loading @@ -43,20 +42,19 @@ public class ProximityInfo { int displayHeight, int gridWidth, int gridHeight, int[] proximityCharsArray); private native void releaseProximityInfoNative(int nativeProximityInfo); public final void setProximityInfo(int[][] gridNeighbors) { public final void setProximityInfo(int[][] gridNeighborKeyIndexes, int keyboardWidth, int keyboardHeight, List<Key> keys) { int[] proximityCharsArray = new int[mGridSize * MAX_PROXIMITY_CHARS_SIZE]; Arrays.fill(proximityCharsArray, KeyDetector.NOT_A_CODE); for (int i = 0; i < mGridSize; ++i) { final int proximityCharsLength = gridNeighbors[i].length; for (int j = 0; j < MAX_PROXIMITY_CHARS_SIZE; ++j) { int charCode = KeyDetector.NOT_A_KEY; if (j < proximityCharsLength) { charCode = gridNeighbors[i][j]; } proximityCharsArray[i * MAX_PROXIMITY_CHARS_SIZE + j] = charCode; final int proximityCharsLength = gridNeighborKeyIndexes[i].length; for (int j = 0; j < proximityCharsLength; ++j) { proximityCharsArray[i * MAX_PROXIMITY_CHARS_SIZE + j] = keys.get(gridNeighborKeyIndexes[i][j]).mCode; } } mNativeProximityInfo = setProximityInfoNative(MAX_PROXIMITY_CHARS_SIZE, mDisplayWidth, mDisplayHeight, mGridWidth, mGridHeight, proximityCharsArray); keyboardWidth, keyboardHeight, mGridWidth, mGridHeight, proximityCharsArray); } // TODO: Get rid of this function's input (keyboard). Loading native/src/defines.h +3 −0 Original line number Diff line number Diff line Loading @@ -129,10 +129,13 @@ static void prof_out(void) { #define DICTIONARY_HEADER_SIZE 2 #define NOT_VALID_WORD -99 #define KEYCODE_SPACE ' ' #define SUGGEST_WORDS_WITH_MISSING_CHARACTER true #define SUGGEST_WORDS_WITH_MISSING_SPACE_CHARACTER true #define SUGGEST_WORDS_WITH_EXCESSIVE_CHARACTER true #define SUGGEST_WORDS_WITH_TRANSPOSED_CHARACTERS true #define SUGGEST_WORDS_WITH_SPACE_PROXIMITY true // The following "rate"s are used as a multiplier before dividing by 100, so they are in percent. #define WORDS_WITH_MISSING_CHARACTER_DEMOTION_RATE 75 Loading native/src/proximity_info.cpp +36 −6 Original line number Diff line number Diff line Loading @@ -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 native/src/proximity_info.h +10 −5 Original line number Diff line number Diff line Loading @@ -25,15 +25,20 @@ namespace latinime { class ProximityInfo { public: ProximityInfo(int maxProximityCharsSize, int displayWidth, int displayHeight, int gridWidth, int gridHeight, uint32_t const *proximityCharsArray); ProximityInfo(const int maxProximityCharsSize, const int keyboardWidth, const int keybaordHeight, const int gridWidth, const int gridHeight, const uint32_t *proximityCharsArray); ~ProximityInfo(); bool hasSpaceProximity(const int x, const int y) const; private: const int MAX_PROXIMITY_CHARS_SIZE; const int DISPLAY_WIDTH; const int DISPLAY_HEIGHT; int getStartIndexFromCoordinates(const int x, const int y) const; const int CELL_WIDTH; const int CELL_HEIGHT; const int KEYBOARD_WIDTH; const int KEYBOARD_HEIGHT; const int GRID_WIDTH; const int GRID_HEIGHT; const int MAX_PROXIMITY_CHARS_SIZE; uint32_t *mProximityCharsArray; }; }; // namespace latinime Loading Loading
java/src/com/android/inputmethod/keyboard/Keyboard.java +2 −2 Original line number Diff line number Diff line Loading @@ -174,7 +174,7 @@ public class Keyboard { mDefaultHeight = mDefaultWidth; mId = id; loadKeyboard(context, xmlLayoutResId); mProximityInfo = new ProximityInfo(mDisplayWidth, mDisplayHeight, GRID_WIDTH, GRID_HEIGHT); mProximityInfo = new ProximityInfo(GRID_WIDTH, GRID_HEIGHT); } public int getProximityInfo() { Loading Loading @@ -378,7 +378,7 @@ public class Keyboard { mGridNeighbors[(y / mCellHeight) * GRID_WIDTH + (x / mCellWidth)] = cell; } } mProximityInfo.setProximityInfo(mGridNeighbors); mProximityInfo.setProximityInfo(mGridNeighbors, getMinWidth(), getHeight(), mKeys); } public boolean isInside(Key key, int x, int y) { Loading
java/src/com/android/inputmethod/keyboard/ProximityInfo.java +12 −14 Original line number Diff line number Diff line Loading @@ -18,18 +18,17 @@ package com.android.inputmethod.keyboard; import com.android.inputmethod.latin.Utils; import java.util.Arrays; import java.util.List; public class ProximityInfo { public static final int MAX_PROXIMITY_CHARS_SIZE = 16; private final int mDisplayWidth; private final int mDisplayHeight; private final int mGridWidth; private final int mGridHeight; private final int mGridSize; ProximityInfo(int displayWidth, int displayHeight, int gridWidth, int gridHeight) { mDisplayWidth = displayWidth; mDisplayHeight = displayHeight; ProximityInfo(int gridWidth, int gridHeight) { mGridWidth = gridWidth; mGridHeight = gridHeight; mGridSize = mGridWidth * mGridHeight; Loading @@ -43,20 +42,19 @@ public class ProximityInfo { int displayHeight, int gridWidth, int gridHeight, int[] proximityCharsArray); private native void releaseProximityInfoNative(int nativeProximityInfo); public final void setProximityInfo(int[][] gridNeighbors) { public final void setProximityInfo(int[][] gridNeighborKeyIndexes, int keyboardWidth, int keyboardHeight, List<Key> keys) { int[] proximityCharsArray = new int[mGridSize * MAX_PROXIMITY_CHARS_SIZE]; Arrays.fill(proximityCharsArray, KeyDetector.NOT_A_CODE); for (int i = 0; i < mGridSize; ++i) { final int proximityCharsLength = gridNeighbors[i].length; for (int j = 0; j < MAX_PROXIMITY_CHARS_SIZE; ++j) { int charCode = KeyDetector.NOT_A_KEY; if (j < proximityCharsLength) { charCode = gridNeighbors[i][j]; } proximityCharsArray[i * MAX_PROXIMITY_CHARS_SIZE + j] = charCode; final int proximityCharsLength = gridNeighborKeyIndexes[i].length; for (int j = 0; j < proximityCharsLength; ++j) { proximityCharsArray[i * MAX_PROXIMITY_CHARS_SIZE + j] = keys.get(gridNeighborKeyIndexes[i][j]).mCode; } } mNativeProximityInfo = setProximityInfoNative(MAX_PROXIMITY_CHARS_SIZE, mDisplayWidth, mDisplayHeight, mGridWidth, mGridHeight, proximityCharsArray); keyboardWidth, keyboardHeight, mGridWidth, mGridHeight, proximityCharsArray); } // TODO: Get rid of this function's input (keyboard). Loading
native/src/defines.h +3 −0 Original line number Diff line number Diff line Loading @@ -129,10 +129,13 @@ static void prof_out(void) { #define DICTIONARY_HEADER_SIZE 2 #define NOT_VALID_WORD -99 #define KEYCODE_SPACE ' ' #define SUGGEST_WORDS_WITH_MISSING_CHARACTER true #define SUGGEST_WORDS_WITH_MISSING_SPACE_CHARACTER true #define SUGGEST_WORDS_WITH_EXCESSIVE_CHARACTER true #define SUGGEST_WORDS_WITH_TRANSPOSED_CHARACTERS true #define SUGGEST_WORDS_WITH_SPACE_PROXIMITY true // The following "rate"s are used as a multiplier before dividing by 100, so they are in percent. #define WORDS_WITH_MISSING_CHARACTER_DEMOTION_RATE 75 Loading
native/src/proximity_info.cpp +36 −6 Original line number Diff line number Diff line Loading @@ -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
native/src/proximity_info.h +10 −5 Original line number Diff line number Diff line Loading @@ -25,15 +25,20 @@ namespace latinime { class ProximityInfo { public: ProximityInfo(int maxProximityCharsSize, int displayWidth, int displayHeight, int gridWidth, int gridHeight, uint32_t const *proximityCharsArray); ProximityInfo(const int maxProximityCharsSize, const int keyboardWidth, const int keybaordHeight, const int gridWidth, const int gridHeight, const uint32_t *proximityCharsArray); ~ProximityInfo(); bool hasSpaceProximity(const int x, const int y) const; private: const int MAX_PROXIMITY_CHARS_SIZE; const int DISPLAY_WIDTH; const int DISPLAY_HEIGHT; int getStartIndexFromCoordinates(const int x, const int y) const; const int CELL_WIDTH; const int CELL_HEIGHT; const int KEYBOARD_WIDTH; const int KEYBOARD_HEIGHT; const int GRID_WIDTH; const int GRID_HEIGHT; const int MAX_PROXIMITY_CHARS_SIZE; uint32_t *mProximityCharsArray; }; }; // namespace latinime Loading