diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 4207832d5f585..7f9969cfcc5c0 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -372,6 +372,7 @@ public final class InputMethodManager { return; } + flushPendingEventsLocked(); mCurMethod = res.method; if (mCurChannel != null) { mCurChannel.dispose(); @@ -718,6 +719,7 @@ public final class InputMethodManager { */ void clearBindingLocked() { clearConnectionLocked(); + flushPendingEventsLocked(); mBindSequence = -1; mCurId = null; mCurMethod = null; @@ -1712,6 +1714,30 @@ public final class InputMethodManager { } } + private void flushPendingEventsLocked() { + mH.removeMessages(MSG_EVENT_TIMEOUT); + PendingEvent curr, prev, next; + curr = mFirstPendingEvent; + prev = null; + while (curr != null) { + next = curr.mNext; + curr.mNext = prev; + prev = curr; + curr = next; + } + curr = prev; + prev = null; + while (curr != null) { + Message msg = mH.obtainMessage(MSG_EVENT_TIMEOUT, curr.mSeq, 0, curr); + msg.setAsynchronous(true); + mH.sendMessage(msg); + next = curr.mNext; + curr.mNext = prev; + prev = curr; + curr = next; + } + } + public void showInputMethodPicker() { synchronized (mH) { showInputMethodPickerLocked();