From 60fbf9e9627063ad697809d62853f6b3ee5f6ad3 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Tue, 29 Jul 2014 15:43:59 +0000 Subject: Revert "[HW7.5] Introduce the @Nonnull annotation" This reverts commit 60a2cd8ac439bf41bfddc5f5f339feda7c7ff175. Reverting due to build breakage under the unbundled branch. Change-Id: Iab2988c53884166f62c95da920ac7a7079a0e5a0 --- java/Android.mk | 2 +- java/src/com/android/inputmethod/event/Combiner.java | 3 --- java/src/com/android/inputmethod/event/CombinerChain.java | 7 ++++--- java/src/com/android/inputmethod/event/DeadKeyCombiner.java | 3 --- java/src/com/android/inputmethod/event/MyanmarReordering.java | 3 --- java/src/com/android/inputmethod/latin/WordComposer.java | 3 --- 6 files changed, 5 insertions(+), 16 deletions(-) diff --git a/java/Android.mk b/java/Android.mk index 9b8b2b448..b580624d7 100644 --- a/java/Android.mk +++ b/java/Android.mk @@ -25,7 +25,7 @@ LOCAL_CERTIFICATE := shared LOCAL_JNI_SHARED_LIBRARIES := libjni_latinime -LOCAL_STATIC_JAVA_LIBRARIES := android-common inputmethod-common android-support-v4 jsr305 +LOCAL_STATIC_JAVA_LIBRARIES := android-common inputmethod-common android-support-v4 # Do not compress dictionary files to mmap dict data runtime LOCAL_AAPT_FLAGS := -0 .dict diff --git a/java/src/com/android/inputmethod/event/Combiner.java b/java/src/com/android/inputmethod/event/Combiner.java index fee93f0c6..8b808c6b3 100644 --- a/java/src/com/android/inputmethod/event/Combiner.java +++ b/java/src/com/android/inputmethod/event/Combiner.java @@ -18,8 +18,6 @@ package com.android.inputmethod.event; import java.util.ArrayList; -import javax.annotation.Nonnull; - /** * A generic interface for combiners. Combiners are objects that transform chains of input events * into committable strings and manage feedback to show to the user on the combining state. @@ -35,7 +33,6 @@ public interface Combiner { * @param event the event to combine with the existing state. * @return the resulting event. */ - @Nonnull Event processEvent(ArrayList previousEvents, Event event); /** diff --git a/java/src/com/android/inputmethod/event/CombinerChain.java b/java/src/com/android/inputmethod/event/CombinerChain.java index f69bf4fd0..8ddc9e7d9 100644 --- a/java/src/com/android/inputmethod/event/CombinerChain.java +++ b/java/src/com/android/inputmethod/event/CombinerChain.java @@ -24,8 +24,6 @@ import com.android.inputmethod.latin.Constants; import java.util.ArrayList; import java.util.HashMap; -import javax.annotation.Nonnull; - /** * This class implements the logic chain between receiving events and generating code points. * @@ -89,7 +87,6 @@ public class CombinerChain { * @return the processed event. It may be the same event, or a consumed event, or a completely * new event. However it may never be null. */ - @Nonnull public Event processEvent(final ArrayList previousEvents, final Event newEvent) { final ArrayList modifiablePreviousEvents = new ArrayList<>(previousEvents); Event event = newEvent; @@ -97,6 +94,10 @@ public class CombinerChain { // A combiner can never return more than one event; it can return several // code points, but they should be encapsulated within one event. event = combiner.processEvent(modifiablePreviousEvents, event); + if (null == event) { + // Combiners return null if they eat the event. + break; + } } return event; } diff --git a/java/src/com/android/inputmethod/event/DeadKeyCombiner.java b/java/src/com/android/inputmethod/event/DeadKeyCombiner.java index d816247d8..342f499c9 100644 --- a/java/src/com/android/inputmethod/event/DeadKeyCombiner.java +++ b/java/src/com/android/inputmethod/event/DeadKeyCombiner.java @@ -23,8 +23,6 @@ import com.android.inputmethod.latin.Constants; import java.util.ArrayList; -import javax.annotation.Nonnull; - /** * A combiner that handles dead keys. */ @@ -33,7 +31,6 @@ public class DeadKeyCombiner implements Combiner { final StringBuilder mDeadSequence = new StringBuilder(); @Override - @Nonnull public Event processEvent(final ArrayList previousEvents, final Event event) { if (TextUtils.isEmpty(mDeadSequence)) { if (event.isDead()) { diff --git a/java/src/com/android/inputmethod/event/MyanmarReordering.java b/java/src/com/android/inputmethod/event/MyanmarReordering.java index 7285512f9..80c711f4a 100644 --- a/java/src/com/android/inputmethod/event/MyanmarReordering.java +++ b/java/src/com/android/inputmethod/event/MyanmarReordering.java @@ -21,8 +21,6 @@ import com.android.inputmethod.latin.Constants; import java.util.ArrayList; import java.util.Arrays; -import javax.annotation.Nonnull; - /** * A combiner that reorders input for Myanmar. */ @@ -130,7 +128,6 @@ public class MyanmarReordering implements Combiner { : Event.createSoftwareTextEvent(combinedText, Event.NOT_A_KEY_CODE); } - @Nonnull @Override public Event processEvent(ArrayList previousEvents, Event newEvent) { final int codePoint = newEvent.mCodePoint; diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java index 75d616e38..171d0bba7 100644 --- a/java/src/com/android/inputmethod/latin/WordComposer.java +++ b/java/src/com/android/inputmethod/latin/WordComposer.java @@ -25,8 +25,6 @@ import com.android.inputmethod.latin.utils.StringUtils; import java.util.ArrayList; import java.util.Collections; -import javax.annotation.Nonnull; - /** * A place to store the currently composing word with information such as adjacent key codes as well */ @@ -181,7 +179,6 @@ public final class WordComposer { * @param event the unprocessed event. * @return the processed event. Never null, but may be marked as consumed. */ - @Nonnull public Event processEvent(final Event event) { final Event processedEvent = mCombinerChain.processEvent(mEvents, event); mEvents.add(event); -- cgit v1.2.3 From c40794547c54390d46fa120e8e70db707810abf6 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Wed, 30 Jul 2014 00:29:41 +0000 Subject: Revert "[HW10] Pull the processed event in its eventual place" This reverts commit bcb61da581edfef5120a7a38a5de98d35fa65255. Reverting due to a few critical bugs and unit test failures. Change-Id: I5f7ee2c7883496ed36e56b3ef12fac91f85f9866 --- .../android/inputmethod/latin/inputlogic/InputLogic.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java index cb8b9c4db..82a7660e1 100644 --- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java +++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java @@ -405,7 +405,6 @@ public final class InputLogic { final int keyboardShiftMode, // TODO: remove these arguments final int currentKeyboardScriptId, final LatinIME.UIHandler handler) { - final Event processedEvent = mWordComposer.processEvent(event); final InputTransaction inputTransaction = new InputTransaction(settingsValues, event, SystemClock.uptimeMillis(), mSpaceState, getActualCapsMode(settingsValues, keyboardShiftMode)); @@ -429,6 +428,7 @@ public final class InputLogic { // A special key, like delete, shift, emoji, or the settings key. switch (event.mKeyCode) { case Constants.CODE_DELETE: + final Event processedEvent = mWordComposer.processEvent(inputTransaction.mEvent); handleBackspace(inputTransaction, currentKeyboardScriptId, processedEvent); // Backspace is a functional key, but it affects the contents of the editor. inputTransaction.setDidAffectContents(); @@ -484,7 +484,7 @@ public final class InputLogic { inputTransaction.mSettingsValues, tmpEvent, inputTransaction.mTimestamp, inputTransaction.mSpaceState, inputTransaction.mShiftState); - didAutoCorrect = handleNonSpecialCharacter(tmpTransaction, handler, processedEvent); + didAutoCorrect = handleNonSpecialCharacter(tmpTransaction, handler); // Shift + Enter is treated as a functional key but it results in adding a new // line, so that does affect the contents of the editor. inputTransaction.setDidAffectContents(); @@ -515,13 +515,11 @@ public final class InputLogic { } else { // No action label, and the action from imeOptions is NONE: this is a regular // enter key that should input a carriage return. - didAutoCorrect = handleNonSpecialCharacter(inputTransaction, handler, - processedEvent); + didAutoCorrect = handleNonSpecialCharacter(inputTransaction, handler); } break; default: - didAutoCorrect = handleNonSpecialCharacter(inputTransaction, handler, - processedEvent); + didAutoCorrect = handleNonSpecialCharacter(inputTransaction, handler); break; } } @@ -683,9 +681,8 @@ public final class InputLogic { */ private boolean handleNonSpecialCharacter(final InputTransaction inputTransaction, // TODO: remove this argument - final LatinIME.UIHandler handler, - // TODO: remove this argument, put it inside the transaction - final Event processedEvent) { + final LatinIME.UIHandler handler) { + final Event processedEvent = mWordComposer.processEvent(inputTransaction.mEvent); final int codePoint = processedEvent.mCodePoint; mSpaceState = SpaceState.NONE; final boolean didAutoCorrect; -- cgit v1.2.3 From 2e81822c3ac394454eb45317bc9086c700ad69d1 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Wed, 30 Jul 2014 00:31:12 +0000 Subject: Revert "[HW9] Pull the processed event further." This reverts commit a8d80ec01202633709d161fb01df0126602d4eb6. Reverting due to a few critical bugs and unit test failures. Change-Id: I3f49b54f34d875e8986d6ddc2523ab0b706dc6f2 --- .../inputmethod/latin/inputlogic/InputLogic.java | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java index 82a7660e1..f2a6f3b2e 100644 --- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java +++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java @@ -428,8 +428,7 @@ public final class InputLogic { // A special key, like delete, shift, emoji, or the settings key. switch (event.mKeyCode) { case Constants.CODE_DELETE: - final Event processedEvent = mWordComposer.processEvent(inputTransaction.mEvent); - handleBackspace(inputTransaction, currentKeyboardScriptId, processedEvent); + handleBackspace(inputTransaction, currentKeyboardScriptId); // Backspace is a functional key, but it affects the contents of the editor. inputTransaction.setDidAffectContents(); break; @@ -682,14 +681,13 @@ public final class InputLogic { private boolean handleNonSpecialCharacter(final InputTransaction inputTransaction, // TODO: remove this argument final LatinIME.UIHandler handler) { - final Event processedEvent = mWordComposer.processEvent(inputTransaction.mEvent); - final int codePoint = processedEvent.mCodePoint; + final int codePoint = inputTransaction.mEvent.mCodePoint; mSpaceState = SpaceState.NONE; final boolean didAutoCorrect; if (inputTransaction.mSettingsValues.isWordSeparator(codePoint) || Character.getType(codePoint) == Character.OTHER_SYMBOL) { didAutoCorrect = handleSeparator(inputTransaction, - processedEvent.isSuggestionStripPress(), handler); + inputTransaction.mEvent.isSuggestionStripPress(), handler); } else { didAutoCorrect = false; if (SpaceState.PHANTOM == inputTransaction.mSpaceState) { @@ -702,7 +700,7 @@ public final class InputLogic { commitTyped(inputTransaction.mSettingsValues, LastComposedWord.NOT_A_SEPARATOR); } } - handleNonSeparator(inputTransaction.mSettingsValues, inputTransaction, processedEvent); + handleNonSeparator(inputTransaction.mSettingsValues, inputTransaction); } return didAutoCorrect; } @@ -713,9 +711,8 @@ public final class InputLogic { * @param inputTransaction The transaction in progress. */ private void handleNonSeparator(final SettingsValues settingsValues, - final InputTransaction inputTransaction, - // TODO: remove this arg, put it into the input transaction - final Event processedEvent) { + final InputTransaction inputTransaction) { + final Event processedEvent = mWordComposer.processEvent(inputTransaction.mEvent); final int codePoint = processedEvent.mCodePoint; // TODO: refactor this method to stop flipping isComposingWord around all the time, and // make it shorter (possibly cut into several pieces). Also factor handleNonSpecialCharacter @@ -905,9 +902,8 @@ public final class InputLogic { */ private void handleBackspace(final InputTransaction inputTransaction, // TODO: remove this argument, put it into settingsValues - final int currentKeyboardScriptId, - // TODO: remove this argument, put it into the transaction - final Event processedEvent) { + final int currentKeyboardScriptId) { + final Event processedEvent = mWordComposer.processEvent(inputTransaction.mEvent); mSpaceState = SpaceState.NONE; mDeleteCount++; -- cgit v1.2.3 From 1776ec841cea9d27746d4aa501997c50cbac955c Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Wed, 30 Jul 2014 00:31:57 +0000 Subject: Revert "[HW8] Pull up the processed event." This reverts commit ebdd641d585e7273bbce1e018d4632e3c3187762. Reverting due to a few critical bugs and unit test failures. Change-Id: Ie7958d749dc813c1752d03aec7f14f5586225ff7 --- .../com/android/inputmethod/latin/inputlogic/InputLogic.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java index f2a6f3b2e..bb2d304a6 100644 --- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java +++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java @@ -712,8 +712,7 @@ public final class InputLogic { */ private void handleNonSeparator(final SettingsValues settingsValues, final InputTransaction inputTransaction) { - final Event processedEvent = mWordComposer.processEvent(inputTransaction.mEvent); - final int codePoint = processedEvent.mCodePoint; + final int codePoint = inputTransaction.mEvent.mCodePoint; // TODO: refactor this method to stop flipping isComposingWord around all the time, and // make it shorter (possibly cut into several pieces). Also factor handleNonSpecialCharacter // which has the same name as other handle* methods but is not the same. @@ -763,6 +762,7 @@ public final class InputLogic { resetComposingState(false /* alsoResetLastComposedWord */); } if (isComposingWord) { + final Event processedEvent = mWordComposer.processEvent(inputTransaction.mEvent); mWordComposer.applyProcessedEvent(processedEvent); // If it's the first letter, make note of auto-caps state if (mWordComposer.isSingleLetter()) { @@ -772,7 +772,7 @@ public final class InputLogic { mWordComposer.getTypedWord()), 1); } else { final boolean swapWeakSpace = tryStripSpaceAndReturnWhetherShouldSwapInstead( - inputTransaction, processedEvent.isSuggestionStripPress()); + inputTransaction, inputTransaction.mEvent.isSuggestionStripPress()); if (swapWeakSpace && trySwapSwapperAndSpace(inputTransaction)) { mSpaceState = SpaceState.WEAK; @@ -903,7 +903,6 @@ public final class InputLogic { private void handleBackspace(final InputTransaction inputTransaction, // TODO: remove this argument, put it into settingsValues final int currentKeyboardScriptId) { - final Event processedEvent = mWordComposer.processEvent(inputTransaction.mEvent); mSpaceState = SpaceState.NONE; mDeleteCount++; @@ -915,7 +914,7 @@ public final class InputLogic { // Then again, even in the case of a key repeat, if the cursor is at start of text, it // can't go any further back, so we can update right away even if it's a key repeat. final int shiftUpdateKind = - processedEvent.isKeyRepeat() && mConnection.getExpectedSelectionStart() > 0 + inputTransaction.mEvent.isKeyRepeat() && mConnection.getExpectedSelectionStart() > 0 ? InputTransaction.SHIFT_UPDATE_LATER : InputTransaction.SHIFT_UPDATE_NOW; inputTransaction.requireShiftUpdate(shiftUpdateKind); @@ -935,6 +934,7 @@ public final class InputLogic { mDictionaryFacilitator.removeWordFromPersonalizedDicts(rejectedSuggestion); } } else { + final Event processedEvent = mWordComposer.processEvent(inputTransaction.mEvent); mWordComposer.applyProcessedEvent(processedEvent); } if (mWordComposer.isComposingWord()) { -- cgit v1.2.3 From 9c17ad1ccd77783354f4c2e9020c48ab7f71947c Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Wed, 30 Jul 2014 00:53:24 +0000 Subject: Revert "[HW7] Introduce consumed events" This reverts commit 99aff0af98e66b1d8515225a103f5beb84d098b9. Reverting due to a few critical bugs and unit test failures. Change-Id: Id41d802981d079f17134a03cc30ab36a3cdd4ac1 --- .../com/android/inputmethod/event/CombinerChain.java | 2 -- .../android/inputmethod/event/DeadKeyCombiner.java | 3 ++- java/src/com/android/inputmethod/event/Event.java | 15 --------------- .../android/inputmethod/event/MyanmarReordering.java | 20 ++++++++++---------- .../com/android/inputmethod/latin/WordComposer.java | 6 +++--- 5 files changed, 15 insertions(+), 31 deletions(-) diff --git a/java/src/com/android/inputmethod/event/CombinerChain.java b/java/src/com/android/inputmethod/event/CombinerChain.java index 8ddc9e7d9..8c6b3d949 100644 --- a/java/src/com/android/inputmethod/event/CombinerChain.java +++ b/java/src/com/android/inputmethod/event/CombinerChain.java @@ -84,8 +84,6 @@ public class CombinerChain { * Process an event through the combining chain, and return a processed event to apply. * @param previousEvents the list of previous events in this composition * @param newEvent the new event to process - * @return the processed event. It may be the same event, or a consumed event, or a completely - * new event. However it may never be null. */ public Event processEvent(final ArrayList previousEvents, final Event newEvent) { final ArrayList modifiablePreviousEvents = new ArrayList<>(previousEvents); diff --git a/java/src/com/android/inputmethod/event/DeadKeyCombiner.java b/java/src/com/android/inputmethod/event/DeadKeyCombiner.java index 342f499c9..bef4d8594 100644 --- a/java/src/com/android/inputmethod/event/DeadKeyCombiner.java +++ b/java/src/com/android/inputmethod/event/DeadKeyCombiner.java @@ -32,11 +32,12 @@ public class DeadKeyCombiner implements Combiner { @Override public Event processEvent(final ArrayList previousEvents, final Event event) { + if (null == event) return null; // Just in case some combiner is broken if (TextUtils.isEmpty(mDeadSequence)) { if (event.isDead()) { mDeadSequence.appendCodePoint(event.mCodePoint); } - return Event.createConsumedEvent(event); + return event; } else { // TODO: Allow combining for several dead chars rather than only the first one. // The framework doesn't know how to do this now. diff --git a/java/src/com/android/inputmethod/event/Event.java b/java/src/com/android/inputmethod/event/Event.java index 98c827423..d257441e0 100644 --- a/java/src/com/android/inputmethod/event/Event.java +++ b/java/src/com/android/inputmethod/event/Event.java @@ -67,8 +67,6 @@ public class Event { final private static int FLAG_DEAD = 0x1; // This event is coming from a key repeat, software or hardware. final private static int FLAG_REPEAT = 0x2; - // This event has already been consumed. - final private static int FLAG_CONSUMED = 0x4; final private int mEventType; // 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 @@ -221,17 +219,6 @@ public class Event { null /* next */); } - /** - * Creates an event identical to the passed event, but that has already been consumed. - * @param source the event to copy the properties of. - * @return an identical event marked as consumed. - */ - public static Event createConsumedEvent(final Event source) { - return new Event(source.mEventType, source.mText, source.mCodePoint, source.mKeyCode, - source.mX, source.mY, source.mSuggestedWordInfo, source.mFlags | FLAG_CONSUMED, - source.mNextEvent); - } - public static Event createNotHandledEvent() { return new Event(EVENT_TYPE_NOT_HANDLED, null /* text */, NOT_A_CODE_POINT, NOT_A_KEY_CODE, Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, @@ -254,8 +241,6 @@ public class Event { return 0 != (FLAG_REPEAT & mFlags); } - public boolean isConsumed() { return 0 != (FLAG_CONSUMED & mFlags); } - // Returns whether this is a fake key press from the suggestion strip. This happens with // punctuation signs selected from the suggestion strip. public boolean isSuggestionStripPress() { diff --git a/java/src/com/android/inputmethod/event/MyanmarReordering.java b/java/src/com/android/inputmethod/event/MyanmarReordering.java index 80c711f4a..32919932d 100644 --- a/java/src/com/android/inputmethod/event/MyanmarReordering.java +++ b/java/src/com/android/inputmethod/event/MyanmarReordering.java @@ -111,7 +111,7 @@ public class MyanmarReordering implements Combiner { * Clears the currently combining stream of events and returns the resulting software text * event corresponding to the stream. Optionally adds a new event to the cleared stream. * @param newEvent the new event to add to the stream. null if none. - * @return the resulting software text event. Never null. + * @return the resulting software text event. Null if none. */ private Event clearAndGetResultingEvent(final Event newEvent) { final CharSequence combinedText; @@ -124,7 +124,7 @@ public class MyanmarReordering implements Combiner { if (null != newEvent) { mCurrentEvents.add(newEvent); } - return null == combinedText ? Event.createConsumedEvent(newEvent) + return null == combinedText ? null : Event.createSoftwareTextEvent(combinedText, Event.NOT_A_KEY_CODE); } @@ -135,7 +135,7 @@ public class MyanmarReordering implements Combiner { final Event lastEvent = getLastEvent(); if (null == lastEvent) { mCurrentEvents.add(newEvent); - return Event.createConsumedEvent(newEvent); + return null; } else if (isConsonantOrMedial(lastEvent.mCodePoint)) { final Event resultingEvent = clearAndGetResultingEvent(null); mCurrentEvents.add(Event.createSoftwareKeypressEvent(ZERO_WIDTH_NON_JOINER, @@ -151,7 +151,7 @@ public class MyanmarReordering implements Combiner { final Event lastEvent = getLastEvent(); if (null == lastEvent) { mCurrentEvents.add(newEvent); - return Event.createConsumedEvent(newEvent); + return null; } else if (VOWEL_E == lastEvent.mCodePoint) { final int eventSize = mCurrentEvents.size(); if (eventSize >= 2 @@ -162,7 +162,7 @@ public class MyanmarReordering implements Combiner { mCurrentEvents.remove(eventSize - 2); mCurrentEvents.add(newEvent); mCurrentEvents.add(lastEvent); - return Event.createConsumedEvent(newEvent); + return null; } // If there is already a consonant, then we are starting a new syllable. for (int i = eventSize - 2; i >= 0; --i) { @@ -174,7 +174,7 @@ public class MyanmarReordering implements Combiner { mCurrentEvents.remove(eventSize - 1); mCurrentEvents.add(newEvent); mCurrentEvents.add(lastEvent); - return Event.createConsumedEvent(newEvent); + return null; } else { // lastCodePoint is a consonant/medial. But if it's something else it's fine return clearAndGetResultingEvent(newEvent); } @@ -182,7 +182,7 @@ public class MyanmarReordering implements Combiner { final Event lastEvent = getLastEvent(); if (null == lastEvent) { mCurrentEvents.add(newEvent); - return Event.createConsumedEvent(newEvent); + return null; } else if (VOWEL_E == lastEvent.mCodePoint) { final int eventSize = mCurrentEvents.size(); // If there is already a consonant, then we are in the middle of a syllable, and we @@ -198,7 +198,7 @@ public class MyanmarReordering implements Combiner { mCurrentEvents.remove(eventSize - 1); mCurrentEvents.add(newEvent); mCurrentEvents.add(lastEvent); - return Event.createConsumedEvent(newEvent); + return null; } // Otherwise, we just commit everything. return clearAndGetResultingEvent(null); @@ -228,10 +228,10 @@ public class MyanmarReordering implements Combiner { mCurrentEvents.remove(eventSize - 1); } } - return Event.createConsumedEvent(newEvent); + return null; } else if (eventSize > 0) { mCurrentEvents.remove(eventSize - 1); - return Event.createConsumedEvent(newEvent); + return null; } } } diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java index 171d0bba7..df7958470 100644 --- a/java/src/com/android/inputmethod/latin/WordComposer.java +++ b/java/src/com/android/inputmethod/latin/WordComposer.java @@ -177,7 +177,7 @@ public final class WordComposer { /** * Process an event and return an event, and return a processed event to apply. * @param event the unprocessed event. - * @return the processed event. Never null, but may be marked as consumed. + * @return the processed event. */ public Event processEvent(final Event event) { final Event processedEvent = mCombinerChain.processEvent(mEvents, event); @@ -191,14 +191,14 @@ public final class WordComposer { * All input events should be supported, including software/hardware events, characters as well * as deletions, multiple inputs and gestures. * - * @param event the event to apply. Must not be null. + * @param event the event to apply. */ public void applyProcessedEvent(final Event event) { - mCombinerChain.applyProcessedEvent(event); final int primaryCode = event.mCodePoint; final int keyX = event.mX; final int keyY = event.mY; final int newIndex = size(); + mCombinerChain.applyProcessedEvent(event); refreshTypedWordCache(); mCursorPositionWithinWord = mCodePointSize; // We may have deleted the last one. -- cgit v1.2.3 From 0666bc1c2ba5edb777ec8f2c93441e131272c2a1 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Wed, 30 Jul 2014 00:55:49 +0000 Subject: Revert "[HW6] Split processing and applying the event." This reverts commit 1db3d860ca0d7380c5a6a3a0f95751565f23043b. Reverting due to a few critical bugs and unit test failures. Change-Id: I5e2d02300320438ef9c29577ec5b0860ea91d822 --- .../com/android/inputmethod/event/CombinerChain.java | 12 ++---------- .../com/android/inputmethod/latin/WordComposer.java | 20 +++++--------------- .../inputmethod/latin/inputlogic/InputLogic.java | 6 ++---- 3 files changed, 9 insertions(+), 29 deletions(-) diff --git a/java/src/com/android/inputmethod/event/CombinerChain.java b/java/src/com/android/inputmethod/event/CombinerChain.java index 8c6b3d949..61bc11b39 100644 --- a/java/src/com/android/inputmethod/event/CombinerChain.java +++ b/java/src/com/android/inputmethod/event/CombinerChain.java @@ -81,11 +81,11 @@ public class CombinerChain { } /** - * Process an event through the combining chain, and return a processed event to apply. + * Pass a new event through the whole chain. * @param previousEvents the list of previous events in this composition * @param newEvent the new event to process */ - public Event processEvent(final ArrayList previousEvents, final Event newEvent) { + public void processEvent(final ArrayList previousEvents, final Event newEvent) { final ArrayList modifiablePreviousEvents = new ArrayList<>(previousEvents); Event event = newEvent; for (final Combiner combiner : mCombiners) { @@ -97,14 +97,6 @@ public class CombinerChain { break; } } - return event; - } - - /** - * Apply a processed event. - * @param event the event to be applied - */ - public void applyProcessedEvent(final Event event) { if (null != event) { // TODO: figure out the generic way of doing this if (Constants.CODE_DELETE == event.mKeyCode) { diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java index df7958470..cdd782244 100644 --- a/java/src/com/android/inputmethod/latin/WordComposer.java +++ b/java/src/com/android/inputmethod/latin/WordComposer.java @@ -175,30 +175,20 @@ public final class WordComposer { } /** - * Process an event and return an event, and return a processed event to apply. - * @param event the unprocessed event. - * @return the processed event. - */ - public Event processEvent(final Event event) { - final Event processedEvent = mCombinerChain.processEvent(mEvents, event); - mEvents.add(event); - return processedEvent; - } - - /** - * Apply a processed input event. + * Process an input event. * * All input events should be supported, including software/hardware events, characters as well * as deletions, multiple inputs and gestures. * - * @param event the event to apply. + * @param event the event to process. */ - public void applyProcessedEvent(final Event event) { + public void processEvent(final Event event) { final int primaryCode = event.mCodePoint; final int keyX = event.mX; final int keyY = event.mY; final int newIndex = size(); - mCombinerChain.applyProcessedEvent(event); + mCombinerChain.processEvent(mEvents, event); + mEvents.add(event); refreshTypedWordCache(); mCursorPositionWithinWord = mCodePointSize; // We may have deleted the last one. diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java index bb2d304a6..74d879919 100644 --- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java +++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java @@ -762,8 +762,7 @@ public final class InputLogic { resetComposingState(false /* alsoResetLastComposedWord */); } if (isComposingWord) { - final Event processedEvent = mWordComposer.processEvent(inputTransaction.mEvent); - mWordComposer.applyProcessedEvent(processedEvent); + mWordComposer.processEvent(inputTransaction.mEvent); // If it's the first letter, make note of auto-caps state if (mWordComposer.isSingleLetter()) { mWordComposer.setCapitalizedModeAtStartComposingTime(inputTransaction.mShiftState); @@ -934,8 +933,7 @@ public final class InputLogic { mDictionaryFacilitator.removeWordFromPersonalizedDicts(rejectedSuggestion); } } else { - final Event processedEvent = mWordComposer.processEvent(inputTransaction.mEvent); - mWordComposer.applyProcessedEvent(processedEvent); + mWordComposer.processEvent(inputTransaction.mEvent); } if (mWordComposer.isComposingWord()) { mConnection.setComposingText(getTextWithUnderline(mWordComposer.getTypedWord()), 1); -- cgit v1.2.3 From 9e68a467106f475fabe43f35e9ba4732e8522592 Mon Sep 17 00:00:00 2001 From: Yohei Yukawa Date: Wed, 27 Aug 2014 12:37:22 -0700 Subject: Make sure to obtain the IC before requesting CursorAnchorInfo RichInputConnection#requestUpdateCursorAnchorInfo must make sure to obtain the input connection before calling methods of it. BUG: 17299587 Change-Id: I8e0cd473a4cc32583cd47634c227d702f7c69c6c --- .../src/com/android/inputmethod/latin/RichInputConnection.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/RichInputConnection.java b/java/src/com/android/inputmethod/latin/RichInputConnection.java index 497823aeb..f1c7f4340 100644 --- a/java/src/com/android/inputmethod/latin/RichInputConnection.java +++ b/java/src/com/android/inputmethod/latin/RichInputConnection.java @@ -924,8 +924,14 @@ public final class RichInputConnection { */ public boolean requestUpdateCursorAnchorInfo(final boolean enableMonitor, final boolean requestImmediateCallback) { - final boolean scheduled = InputConnectionCompatUtils.requestUpdateCursorAnchorInfo(mIC, - enableMonitor, requestImmediateCallback); + mIC = mParent.getCurrentInputConnection(); + final boolean scheduled; + if (null != mIC) { + scheduled = InputConnectionCompatUtils.requestUpdateCursorAnchorInfo(mIC, + enableMonitor, requestImmediateCallback); + } else { + scheduled = false; + } mCursorAnchorInfoMonitorEnabled = (scheduled && enableMonitor); return scheduled; } -- cgit v1.2.3 From 91c75250a9f23a219ada5c7a1948efabd2424b5a Mon Sep 17 00:00:00 2001 From: Jean Chalard Date: Fri, 29 Aug 2014 13:18:23 +0900 Subject: Fix an IOOB exception Bug: 17316001 Change-Id: Iaa2cfd30ebbe0d49e10a5c3a30336e06817d0a8b --- java/src/com/android/inputmethod/latin/SuggestedWords.java | 2 +- .../src/com/android/inputmethod/latin/SuggestedWordsTests.java | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java index 1eebabece..6bc3da885 100644 --- a/java/src/com/android/inputmethod/latin/SuggestedWords.java +++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java @@ -429,7 +429,7 @@ public class SuggestedWords { */ @UsedForTesting public SuggestedWordInfo getTypedWordInfoOrNull() { - if (this == EMPTY) { + if (SuggestedWords.INDEX_OF_TYPED_WORD >= size()) { return null; } final SuggestedWordInfo info = getInfo(SuggestedWords.INDEX_OF_TYPED_WORD); diff --git a/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java b/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java index c28d08cdb..869c550e0 100644 --- a/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java +++ b/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java @@ -148,5 +148,15 @@ public class SuggestedWordsTests extends AndroidTestCase { // Make sure getTypedWordInfoOrNull() returns null. assertNull(SuggestedWords.EMPTY.getTypedWordInfoOrNull()); + + final SuggestedWords emptySuggestedWords = new SuggestedWords( + new ArrayList(), null /* rawSuggestions */, + false /* typedWordValid */, + false /* willAutoCorrect */, + false /* isObsoleteSuggestions */, + SuggestedWords.INPUT_STYLE_NONE); + assertNull(emptySuggestedWords.getTypedWordInfoOrNull()); + + assertNull(SuggestedWords.EMPTY.getTypedWordInfoOrNull()); } } -- cgit v1.2.3