diff options
| -rw-r--r-- | core/java/android/view/inputmethod/InputMethodManager.java | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 42985501d818..7eb840047c9f 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -1519,17 +1519,25 @@ public final class InputMethodManager { } void setInputChannelLocked(InputChannel channel) { - if (mCurChannel != channel) { - if (mCurSender != null) { - flushPendingEventsLocked(); - mCurSender.dispose(); - mCurSender = null; - } - if (mCurChannel != null) { - mCurChannel.dispose(); - } - mCurChannel = channel; + if (mCurChannel == channel) { + return; + } + if (mCurChannel != null && channel != null + && mCurChannel.getToken() == channel.getToken()) { + // channel is a dupe of 'mCurChannel', because they have the same token, and represent + // the same connection. Ignore the incoming channel and keep using 'mCurChannel' to + // avoid confusing the InputEventReceiver. + return; + } + if (mCurSender != null) { + flushPendingEventsLocked(); + mCurSender.dispose(); + mCurSender = null; + } + if (mCurChannel != null) { + mCurChannel.dispose(); } + mCurChannel = channel; } /** |