From 5eec574cf0eb6b8ec23723b5f566563453edd42f Mon Sep 17 00:00:00 2001 From: satok Date: Tue, 13 Mar 2012 18:26:23 +0900 Subject: [PATCH] Use additional proximity chars in the native code Bug: 4343280 Change-Id: Ida690fe246cea80a82fcdb3ad0c28e2907b882ac --- ...oid_inputmethod_keyboard_ProximityInfo.cpp | 3 ++- native/src/additional_proximity_chars.cpp | 10 ++++---- native/src/additional_proximity_chars.h | 18 ++++++------- native/src/proximity_info.cpp | 25 +++++++++++++++++++ native/src/proximity_info.h | 1 + 5 files changed, 42 insertions(+), 15 deletions(-) diff --git a/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp b/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp index a9b6cca5b..e47a64a9e 100644 --- a/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp +++ b/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp @@ -47,7 +47,8 @@ static jlong latinime_Keyboard_setProximityInfo(JNIEnv *env, jobject object, 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 74c96ae0b..401c85aae 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 b76726c69..e0049d949 100644 --- a/native/src/additional_proximity_chars.h +++ b/native/src/additional_proximity_chars.h @@ -26,23 +26,23 @@ class AdditionalProximityChars { 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 @@ class AdditionalProximityChars { } } - 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 @@ class AdditionalProximityChars { } } - 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 561fffa90..e590740d2 100644 --- a/native/src/proximity_info.cpp +++ b/native/src/proximity_info.cpp @@ -50,6 +50,7 @@ ProximityInfo::ProximityInfo(const std::string localeStr, const int maxProximity 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 @@ void ProximityInfo::calculateNearbyKeyCodes( } } } + 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 bfcef63d1..8c342e0ef 100644 --- a/native/src/proximity_info.h +++ b/native/src/proximity_info.h @@ -104,6 +104,7 @@ class ProximityInfo { 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;