diff options
22 files changed, 113 insertions, 55 deletions
diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml index afd6a0db6..1ebe4d33a 100644 --- a/java/res/values-af/strings.xml +++ b/java/res/values-af/strings.xml @@ -42,7 +42,7 @@ <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Sleutelopspringer-wagperiode"</string> <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Geen wagperiode nie"</string> <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Verstek"</string> - <string name="settings_keypress_vibration_duration" msgid="489402970497503329">"<xliff:g id="MILLISECONDS">%s</xliff:g>ms"</string> + <string name="settings_keypress_vibration_duration" msgid="489402970497503329">"<xliff:g id="MILLISECONDS">%s</xliff:g>ms."</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Stel kontakname voor"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Gebruik name van kontakte vir voorstelle en korreksies"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Dubbelspasie-punt"</string> diff --git a/java/res/values-hi/strings.xml b/java/res/values-hi/strings.xml index 738368205..1333f0f04 100644 --- a/java/res/values-hi/strings.xml +++ b/java/res/values-hi/strings.xml @@ -42,8 +42,7 @@ <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"कुंजी पॉपअप खारिज़ विलंब"</string> <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"कोई विलंब नहीं"</string> <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"डिफ़ॉल्ट"</string> - <!-- no translation found for settings_keypress_vibration_duration (489402970497503329) --> - <skip /> + <string name="settings_keypress_vibration_duration" msgid="489402970497503329">"<xliff:g id="MILLISECONDS">%s</xliff:g> मिलीसेकंड"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"संपर्क नाम सुझाएं"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"सुझाव और सुधार के लिए संपर्क से नामों का उपयोग करें"</string> <string name="use_double_space_period" msgid="8781529969425082860">"दोहरे स्पेस वाला पीरियड"</string> diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml index c0085bb7a..ad0029efb 100644 --- a/java/res/values-sr/strings.xml +++ b/java/res/values-sr/strings.xml @@ -42,7 +42,7 @@ <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Одложи одбац. иск. прозора тастера"</string> <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Без одлагања"</string> <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Подразумевано"</string> - <string name="settings_keypress_vibration_duration" msgid="489402970497503329">"<xliff:g id="MILLISECONDS">%s</xliff:g> мс"</string> + <string name="settings_keypress_vibration_duration" msgid="489402970497503329">"<xliff:g id="MILLISECONDS">%s</xliff:g> ms"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Предложи имена контаката"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Користи имена из Контаката за предлоге и исправке"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Тачка и размак"</string> diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index 462f7c938..e98a31e73 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/strings.xml @@ -42,8 +42,7 @@ <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Tuş popup\'ının kapatılmasını geciktirme"</string> <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Gecikme yok"</string> <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Varsayılan"</string> - <!-- no translation found for settings_keypress_vibration_duration (489402970497503329) --> - <skip /> + <string name="settings_keypress_vibration_duration" msgid="489402970497503329">"<xliff:g id="MILLISECONDS">%s</xliff:g> ms"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Kişi Adları öner"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Öneri ve düzeltmeler için Kişiler\'deki adları kullan"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Çift boşlukla nokta ekleme"</string> diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml index 32544fa75..f6688c2e2 100644 --- a/java/res/values-uk/strings.xml +++ b/java/res/values-uk/strings.xml @@ -42,7 +42,7 @@ <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Затримка клавіши закриття"</string> <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Без затримки"</string> <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"За умовчанням"</string> - <string name="settings_keypress_vibration_duration" msgid="489402970497503329">"<xliff:g id="MILLISECONDS">%s</xliff:g> мсек"</string> + <string name="settings_keypress_vibration_duration" msgid="489402970497503329">"<xliff:g id="MILLISECONDS">%s</xliff:g> мс"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Пропон. імена контактів"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Використ. імена зі списку контактів для пропозицій і виправлень"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Крапка подвійним пробілом"</string> diff --git a/java/src/com/android/inputmethod/event/Event.java b/java/src/com/android/inputmethod/event/Event.java index 215e4dee5..3fe5d5b68 100644 --- a/java/src/com/android/inputmethod/event/Event.java +++ b/java/src/com/android/inputmethod/event/Event.java @@ -54,39 +54,33 @@ public class Event { final private static int NOT_A_CODE_POINT = 0; - private int mType; // The type of event - one of the constants above + final private int mType; // The type of event - one of the constants above // The code point associated with the event, if relevant. This is a unicode code point, and // has nothing to do with other representations of the key. It is only relevant if this event // is the right type: COMMITTABLE or DEAD or TOGGLE, but for a mode key like hankaku/zenkaku or // ctrl, there is no code point associated so this should be NOT_A_CODE_POINT to avoid // unintentional use of its value when it's not relevant. - private int mCodePoint; + final public int mCodePoint; - static Event obtainEvent() { - // TODO: create an event pool instead - return new Event(); + // This method is private - to create a new event, use one of the create* utility methods. + private Event(final int type, final int codePoint) { + mType = type; + mCodePoint = codePoint; } - public void setDeadEvent(final int codePoint) { - mType = EVENT_DEAD; - mCodePoint = codePoint; + public static Event createDeadEvent(final int codePoint) { + return new Event(EVENT_DEAD, codePoint); } - public void setCommittableEvent(final int codePoint) { - mType = EVENT_COMMITTABLE; - mCodePoint = codePoint; + public static Event createCommittableEvent(final int codePoint) { + return new Event(EVENT_COMMITTABLE, codePoint); } - public void setNotHandledEvent() { - mType = EVENT_NOT_HANDLED; - mCodePoint = NOT_A_CODE_POINT; // Just in case + public static Event createNotHandledEvent() { + return new Event(EVENT_NOT_HANDLED, NOT_A_CODE_POINT); } public boolean isCommittable() { return EVENT_COMMITTABLE == mType; } - - public int getCodePoint() { - return mCodePoint; - } } diff --git a/java/src/com/android/inputmethod/event/EventInterpreter.java b/java/src/com/android/inputmethod/event/EventInterpreter.java index 1bd0cca00..f9185788e 100644 --- a/java/src/com/android/inputmethod/event/EventInterpreter.java +++ b/java/src/com/android/inputmethod/event/EventInterpreter.java @@ -107,7 +107,7 @@ public class EventInterpreter { private boolean onEvent(final Event event) { if (event.isCommittable()) { - mLatinIme.onCodeInput(event.getCodePoint(), + mLatinIme.onCodeInput(event.mCodePoint, Constants.EXTERNAL_KEYBOARD_COORDINATE, Constants.EXTERNAL_KEYBOARD_COORDINATE); return true; } diff --git a/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java b/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java index 2dbc9f00b..554319e51 100644 --- a/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java +++ b/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java @@ -38,7 +38,6 @@ public class HardwareKeyboardEventDecoder implements HardwareEventDecoder { @Override public Event decodeHardwareKey(final KeyEvent keyEvent) { - final Event event = Event.obtainEvent(); // KeyEvent#getUnicodeChar() does not exactly returns a unicode char, but rather a value // that includes both the unicode char in the lower 21 bits and flags in the upper bits, // hence the name "codePointAndFlags". {@see KeyEvent#getUnicodeChar()} for more info. @@ -48,22 +47,20 @@ public class HardwareKeyboardEventDecoder implements HardwareEventDecoder { // the key for 'A' or Space, but also Backspace or Ctrl or Caps Lock. final int keyCode = keyEvent.getKeyCode(); if (KeyEvent.KEYCODE_DEL == keyCode) { - event.setCommittableEvent(Constants.CODE_DELETE); - return event; + return Event.createCommittableEvent(Constants.CODE_DELETE); } if (keyEvent.isPrintingKey() || KeyEvent.KEYCODE_SPACE == keyCode || KeyEvent.KEYCODE_ENTER == keyCode) { if (0 != (codePointAndFlags & KeyCharacterMap.COMBINING_ACCENT)) { // A dead key. - event.setDeadEvent(codePointAndFlags & KeyCharacterMap.COMBINING_ACCENT_MASK); + return Event.createDeadEvent(codePointAndFlags & KeyCharacterMap.COMBINING_ACCENT_MASK); } else { // A committable character. This should be committed right away, taking into // account the current state. - event.setCommittableEvent(codePointAndFlags); + return Event.createCommittableEvent(codePointAndFlags); } } else { - event.setNotHandledEvent(); + return Event.createNotHandledEvent(); } - return event; } } diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java index 130fad851..625575d53 100644 --- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java @@ -366,6 +366,11 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack } @Override + public void cancelUpdateBatchInputTimer(final PointerTracker tracker) { + removeMessages(MSG_UPDATE_BATCH_INPUT, tracker); + } + + @Override public void cancelAllUpdateBatchInputTimers() { removeMessages(MSG_UPDATE_BATCH_INPUT); } diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java index 59a3c99aa..62e674ad5 100644 --- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -98,6 +98,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { public boolean isInDoubleTapTimeout(); public void cancelKeyTimers(); public void startUpdateBatchInputTimer(PointerTracker tracker); + public void cancelUpdateBatchInputTimer(PointerTracker tracker); public void cancelAllUpdateBatchInputTimers(); public static class Adapter implements TimerProxy { @@ -124,6 +125,8 @@ public final class PointerTracker implements PointerTrackerQueue.Element { @Override public void startUpdateBatchInputTimer(PointerTracker tracker) {} @Override + public void cancelUpdateBatchInputTimer(PointerTracker tracker) {} + @Override public void cancelAllUpdateBatchInputTimers() {} } } @@ -791,6 +794,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { private void cancelBatchInput() { sPointerTrackerQueue.cancelAllPointerTracker(); + mIsDetectingGesture = false; if (!sInGesture) { return; } @@ -918,6 +922,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { if (mIsDetectingGesture) { final boolean onValidArea = mGestureStrokeWithPreviewPoints.addPointOnKeyboard( x, y, gestureTime, isMajorEvent); + // If the move event goes out from valid batch input area, cancel batch input. if (!onValidArea) { cancelBatchInput(); return; @@ -938,6 +943,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { if (DEBUG_MOVE_EVENT) { printTouchEvent("onMoveEvent:", x, y, eventTime); } + mTimerProxy.cancelUpdateBatchInputTimer(this); if (mIsTrackingCanceled) { return; } @@ -1122,6 +1128,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { printTouchEvent("onUpEvent :", x, y, eventTime); } + mTimerProxy.cancelUpdateBatchInputTimer(this); if (!sInGesture) { if (mCurrentKey != null && mCurrentKey.isModifier()) { // Before processing an up event of modifier key, all pointers already being @@ -1196,6 +1203,9 @@ public final class PointerTracker implements PointerTrackerQueue.Element { @Override public void cancelTracking() { + if (isShowingMoreKeysPanel()) { + return; + } mIsTrackingCanceled = true; } diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java b/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java index a43e94a75..adf223602 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java +++ b/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java @@ -233,6 +233,10 @@ public class GestureStroke { if (lastIndex >= 0) { final int x = mXCoordinates.get(lastIndex); final int y = mYCoordinates.get(lastIndex); + if (DEBUG) { + Log.d(TAG, String.format("[%d] duplicateLastPointWith: %d,%d|%d", mPointerId, + x, y, time)); + } // TODO: Have appendMajorPoint() appendPoint(x, y, time); updateIncrementalRecognitionSize(x, y, time); @@ -251,6 +255,16 @@ public class GestureStroke { } private void appendPoint(final int x, final int y, final int time) { + final int lastIndex = mEventTimes.getLength() - 1; + // The point that is created by {@link duplicateLastPointWith(int)} may have later event + // time than the next {@link MotionEvent}. To maintain the monotonicity of the event time, + // drop the successive point here. + if (lastIndex >= 0 && mEventTimes.get(lastIndex) > time) { + Log.w(TAG, String.format("[%d] drop stale event: %d,%d|%d last: %d,%d|%d", mPointerId, + x, y, time, mXCoordinates.get(lastIndex), mYCoordinates.get(lastIndex), + mEventTimes.get(lastIndex))); + return; + } mEventTimes.add(time); mXCoordinates.add(x); mYCoordinates.add(y); diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index a6326bf39..38f137784 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -1717,6 +1717,11 @@ public final class LatinIME extends InputMethodService implements KeyboardAction // If there is a selection, remove it. final int lengthToDelete = mLastSelectionEnd - mLastSelectionStart; mConnection.setSelection(mLastSelectionEnd, mLastSelectionEnd); + // Reset mLastSelectionEnd to mLastSelectionStart. This is what is supposed to + // happen, and if it's wrong, the next call to onUpdateSelection will correct it, + // but we want to set it right away to avoid it being used with the wrong values + // later (typically, in a subsequent press on backspace). + mLastSelectionEnd = mLastSelectionStart; mConnection.deleteSurroundingText(lengthToDelete, 0); } else { // There is no selection, just delete one character. diff --git a/native/jni/Android.mk b/native/jni/Android.mk index c99f291d0..75f85b120 100644 --- a/native/jni/Android.mk +++ b/native/jni/Android.mk @@ -66,11 +66,15 @@ LOCAL_SRC_FILES := \ ifeq ($(FLAG_DO_PROFILE), true) $(warning Making profiling version of native library) - LOCAL_CFLAGS += -DFLAG_DO_PROFILE + LOCAL_CFLAGS += -DFLAG_DO_PROFILE -funwind-tables else # FLAG_DO_PROFILE ifeq ($(FLAG_DBG), true) $(warning Making debug version of native library) - LOCAL_CFLAGS += -DFLAG_DBG + LOCAL_CFLAGS += -DFLAG_DBG -funwind-tables +ifeq ($(FLAG_FULL_DBG), true) + $(warning Making full debug version of native library) + LOCAL_CFLAGS += -DFLAG_FULL_DBG +endif # FLAG_FULL_DBG endif # FLAG_DBG endif # FLAG_DO_PROFILE diff --git a/native/jni/jni_common.cpp b/native/jni/jni_common.cpp index 7b97cf4db..1ea204102 100644 --- a/native/jni/jni_common.cpp +++ b/native/jni/jni_common.cpp @@ -16,8 +16,6 @@ #define LOG_TAG "LatinIME: jni" -#include <cassert> - #include "com_android_inputmethod_keyboard_ProximityInfo.h" #include "com_android_inputmethod_latin_BinaryDictionary.h" #include "com_android_inputmethod_latin_DicTraverseSession.h" @@ -35,7 +33,7 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved) { AKLOGE("ERROR: GetEnv failed"); return -1; } - assert(env); + ASSERT(env); if (!env) { AKLOGE("ERROR: JNIEnv is invalid"); return -1; diff --git a/native/jni/src/correction.cpp b/native/jni/src/correction.cpp index 24221c98c..a0256ee40 100644 --- a/native/jni/src/correction.cpp +++ b/native/jni/src/correction.cpp @@ -247,7 +247,7 @@ Correction::CorrectionType Correction::processCharAndCalcState(const int c, cons if (mSkippedCount == 0 && mSkipPos < mOutputIndex) { if (DEBUG_DICT) { // TODO: Enable this assertion. - //assert(mSkipPos == mOutputIndex - 1); + //ASSERT(mSkipPos == mOutputIndex - 1); } mSkipPos = mOutputIndex; } diff --git a/native/jni/src/correction.h b/native/jni/src/correction.h index 046935579..8c477716a 100644 --- a/native/jni/src/correction.h +++ b/native/jni/src/correction.h @@ -17,7 +17,6 @@ #ifndef LATINIME_CORRECTION_H #define LATINIME_CORRECTION_H -#include <cassert> #include <cstring> // for memset() #include "correction_state.h" @@ -150,7 +149,7 @@ class Correction { // Branch if multiplier == 2 for the optimization if (multiplier < 0) { if (DEBUG_DICT) { - assert(false); + ASSERT(false); } AKLOGI("--- Invalid multiplier: %d", multiplier); } else if (multiplier == 0) { diff --git a/native/jni/src/defines.h b/native/jni/src/defines.h index 46595d80a..96abfe8d4 100644 --- a/native/jni/src/defines.h +++ b/native/jni/src/defines.h @@ -93,6 +93,7 @@ static AK_FORCE_INLINE void dumpWord(const int *word, const int length) { #include <execinfo.h> #include <stdlib.h> +#define DO_ASSERT_TEST #define ASSERT(success) do { if (!(success)) { showStackTrace(); assert(success);} } while (0) #define SHOW_STACK_TRACE do { showStackTrace(); } while (0) @@ -111,6 +112,7 @@ static inline void showStackTrace() { } #else #include <cassert> +#define DO_ASSERT_TEST #define ASSERT(success) assert(success) #define SHOW_STACK_TRACE #endif @@ -120,6 +122,7 @@ static inline void showStackTrace() { #define AKLOGI(fmt, ...) #define DUMP_RESULT(words, frequencies, maxWordCount, maxWordLength) #define DUMP_WORD(word, length) +#undef DO_ASSERT_TEST #define ASSERT(success) #define SHOW_STACK_TRACE #define INTS_TO_CHARS(input, length, output) @@ -349,6 +352,9 @@ static inline void prof_out(void) { #define MAX_SPACES_INTERNAL 16 +// TODO: Change this to MAX_WORDS, remove MAX_WORDS in Java, and stop getting it from Java +#define MAX_WORDS_INTERNAL 18 + // Max Distance between point to key #define MAX_POINT_TO_KEY_LENGTH 10000000 diff --git a/native/jni/src/proximity_info.cpp b/native/jni/src/proximity_info.cpp index ffe12ce49..8ad9c77dc 100644 --- a/native/jni/src/proximity_info.cpp +++ b/native/jni/src/proximity_info.cpp @@ -14,7 +14,6 @@ * limitations under the License. */ -#include <cassert> #include <cstring> #define LOG_TAG "LatinIME: proximity_info.cpp" @@ -75,7 +74,7 @@ ProximityInfo::ProximityInfo(JNIEnv *env, const jstring localeJStr, const int ma const jsize localeCStrUtf8Length = env->GetStringUTFLength(localeJStr); if (localeCStrUtf8Length >= MAX_LOCALE_STRING_LENGTH) { AKLOGI("Locale string length too long: length=%d", localeCStrUtf8Length); - assert(false); + ASSERT(false); } memset(mLocaleStr, 0, sizeof(mLocaleStr)); env->GetStringUTFRegion(localeJStr, 0, env->GetStringLength(localeJStr), mLocaleStr); @@ -105,7 +104,7 @@ bool ProximityInfo::hasSpaceProximity(const int x, const int y) const { if (DEBUG_DICT) { AKLOGI("HasSpaceProximity: Illegal coordinates (%d, %d)", x, y); // TODO: Enable this assertion. - //assert(false); + //ASSERT(false); } return false; } @@ -180,7 +179,7 @@ void ProximityInfo::calculateNearbyKeyCodes( inputCodes[insertPos++] = c; if (insertPos >= MAX_PROXIMITY_CHARS_SIZE) { if (DEBUG_DICT) { - assert(false); + ASSERT(false); } return; } @@ -192,7 +191,7 @@ void ProximityInfo::calculateNearbyKeyCodes( inputCodes[insertPos++] = ADDITIONAL_PROXIMITY_CHAR_DELIMITER_CODE; if (insertPos >= MAX_PROXIMITY_CHARS_SIZE) { if (DEBUG_DICT) { - assert(false); + ASSERT(false); } return; } @@ -213,7 +212,7 @@ void ProximityInfo::calculateNearbyKeyCodes( inputCodes[insertPos++] = ac; if (insertPos >= MAX_PROXIMITY_CHARS_SIZE) { if (DEBUG_DICT) { - assert(false); + ASSERT(false); } return; } diff --git a/native/jni/src/proximity_info_state.cpp b/native/jni/src/proximity_info_state.cpp index bd2149ad1..5362d69f0 100644 --- a/native/jni/src/proximity_info_state.cpp +++ b/native/jni/src/proximity_info_state.cpp @@ -123,6 +123,15 @@ void ProximityInfoState::initInputParams(const int pointerId, const float maxPoi } } } +#ifdef DO_ASSERT_TEST + if (times) { + for (int i = 0; i < inputSize; ++i) { + if (i > 0) { + ASSERT(times[i] >= times[i - 1]); + } + } + } +#endif const bool proximityOnly = !isGeometric && (xCoordinates[0] < 0 || yCoordinates[0] < 0); int lastInputIndex = pushTouchPointStartIndex; for (int i = lastInputIndex; i < inputSize; ++i) { diff --git a/native/jni/src/unigram_dictionary.cpp b/native/jni/src/unigram_dictionary.cpp index ebeef13b9..0a144253a 100644 --- a/native/jni/src/unigram_dictionary.cpp +++ b/native/jni/src/unigram_dictionary.cpp @@ -14,7 +14,6 @@ * limitations under the License. */ -#include <cassert> #include <cstring> #define LOG_TAG "LatinIME: unigram_dictionary.cpp" @@ -100,9 +99,9 @@ void UnigramDictionary::getWordWithDigraphSuggestionsRec(ProximityInfo *proximit const int codesRemain, const int currentDepth, int *codesDest, Correction *correction, WordsPriorityQueuePool *queuePool, const digraph_t *const digraphs, const unsigned int digraphsSize) const { - assert(sizeof(codesDest[0]) == sizeof(codesSrc[0])); - assert(sizeof(xCoordinatesBuffer[0]) == sizeof(xcoordinates[0])); - assert(sizeof(yCoordinatesBuffer[0]) == sizeof(ycoordinates[0])); + ASSERT(sizeof(codesDest[0]) == sizeof(codesSrc[0])); + ASSERT(sizeof(xCoordinatesBuffer[0]) == sizeof(xcoordinates[0])); + ASSERT(sizeof(yCoordinatesBuffer[0]) == sizeof(ycoordinates[0])); const int startIndex = static_cast<int>(codesDest - codesBuffer); if (currentDepth < MAX_DIGRAPH_SEARCH_DEPTH) { @@ -894,7 +893,7 @@ bool UnigramDictionary::processCurrentNode(const int initialPos, // else if MASK_GROUP_ADDRESS_TYPE is not NONE: the children address // Note that you can't have a node that both is not a terminal and has no children. int c = BinaryFormat::getCodePointAndForwardPointer(DICT_ROOT, &pos); - assert(NOT_A_CODE_POINT != c); + ASSERT(NOT_A_CODE_POINT != c); // We are going to loop through each character and make it look like it's a different // node each time. To do that, we will process characters in this node in order until @@ -987,7 +986,7 @@ bool UnigramDictionary::processCurrentNode(const int initialPos, // Now we finished processing this node, and we want to traverse children. If there are no // children, we can't come here. - assert(BinaryFormat::hasChildrenInFlags(flags)); + ASSERT(BinaryFormat::hasChildrenInFlags(flags)); // If this node was a terminal it still has the frequency under the pointer (it may have been // read, but not skipped - see readFrequencyWithoutMovingPointer). diff --git a/native/jni/src/words_priority_queue_pool.h b/native/jni/src/words_priority_queue_pool.h index c14afa07b..f7c08fb52 100644 --- a/native/jni/src/words_priority_queue_pool.h +++ b/native/jni/src/words_priority_queue_pool.h @@ -17,7 +17,7 @@ #ifndef LATINIME_WORDS_PRIORITY_QUEUE_POOL_H #define LATINIME_WORDS_PRIORITY_QUEUE_POOL_H -#include <cassert> +#include "defines.h" #include "words_priority_queue.h" namespace latinime { @@ -55,7 +55,7 @@ class WordsPriorityQueuePool { } if (inputWordLength < 0 || inputWordLength >= SUB_QUEUE_MAX_COUNT) { if (DEBUG_WORDS_PRIORITY_QUEUE) { - assert(false); + ASSERT(false); } return 0; } diff --git a/tests/src/com/android/inputmethod/latin/InputLogicTests.java b/tests/src/com/android/inputmethod/latin/InputLogicTests.java index 38f5305de..6412a9db5 100644 --- a/tests/src/com/android/inputmethod/latin/InputLogicTests.java +++ b/tests/src/com/android/inputmethod/latin/InputLogicTests.java @@ -102,6 +102,27 @@ public class InputLogicTests extends InputTestsBase { assertEquals("delete selection", EXPECTED_RESULT, mTextView.getText().toString()); } + public void testDeleteSelectionTwice() { + final String STRING_TO_TYPE = "some text delete me some text"; + final int typedLength = STRING_TO_TYPE.length(); + final int SELECTION_START = 10; + final int SELECTION_END = 19; + final String EXPECTED_RESULT = "some text some text"; + type(STRING_TO_TYPE); + // There is no IMF to call onUpdateSelection for us so we must do it by hand. + // Send once to simulate the cursor actually responding to the move caused by typing. + // This is necessary because LatinIME is bookkeeping to avoid confusing a real cursor + // move with a move triggered by LatinIME inputting stuff. + mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1); + mInputConnection.setSelection(SELECTION_START, SELECTION_END); + // And now we simulate the user actually selecting some text. + mLatinIME.onUpdateSelection(typedLength, typedLength, + SELECTION_START, SELECTION_END, -1, -1); + type(Constants.CODE_DELETE); + type(Constants.CODE_DELETE); + assertEquals("delete selection twice", EXPECTED_RESULT, mTextView.getText().toString()); + } + public void testAutoCorrect() { final String STRING_TO_TYPE = "tgis "; final String EXPECTED_RESULT = "this "; |