summaryrefslogtreecommitdiffstats
path: root/core/java/android/inputmethodservice
diff options
context:
space:
mode:
authorAmith Yamasani <yamasani@google.com>2009-09-17 11:27:14 -0700
committerAmith Yamasani <yamasani@google.com>2009-09-17 15:03:40 -0700
commitebe3d518ffaeb14f3f2e0e74cdbc15fd2ddf4453 (patch)
tree299298b67a7092a632aa15ba997e711554a877a7 /core/java/android/inputmethodservice
parentd55de40481c6ec7d8fbd1a38c80a6c66bf462a71 (diff)
downloadframeworks_base-ebe3d518ffaeb14f3f2e0e74cdbc15fd2ddf4453.zip
frameworks_base-ebe3d518ffaeb14f3f2e0e74cdbc15fd2ddf4453.tar.gz
frameworks_base-ebe3d518ffaeb14f3f2e0e74cdbc15fd2ddf4453.tar.bz2
Fix possible race condition when switching keyboards while there are pending messages.
Diffstat (limited to 'core/java/android/inputmethodservice')
-rwxr-xr-xcore/java/android/inputmethodservice/KeyboardView.java19
1 files changed, 12 insertions, 7 deletions
diff --git a/core/java/android/inputmethodservice/KeyboardView.java b/core/java/android/inputmethodservice/KeyboardView.java
index a141a2a..e59a987 100755
--- a/core/java/android/inputmethodservice/KeyboardView.java
+++ b/core/java/android/inputmethodservice/KeyboardView.java
@@ -408,6 +408,8 @@ public class KeyboardView extends View implements View.OnClickListener {
if (mKeyboard != null) {
showPreview(NOT_A_KEY);
}
+ // Remove any pending messages
+ removeMessages();
mKeyboard = keyboard;
List<Key> keys = mKeyboard.getKeys();
mKeys = keys.toArray(new Key[keys.size()]);
@@ -828,6 +830,7 @@ public class KeyboardView extends View implements View.OnClickListener {
private void showKey(final int keyIndex) {
final PopupWindow previewPopup = mPreviewPopup;
final Key[] keys = mKeys;
+ if (keyIndex < 0 || keyIndex >= mKeys.length) return;
Key key = keys[keyIndex];
if (key.icon != null) {
mPreviewText.setCompoundDrawables(null, null, null,
@@ -1145,9 +1148,7 @@ public class KeyboardView extends View implements View.OnClickListener {
break;
case MotionEvent.ACTION_UP:
- mHandler.removeMessages(MSG_SHOW_PREVIEW);
- mHandler.removeMessages(MSG_REPEAT);
- mHandler.removeMessages(MSG_LONGPRESS);
+ removeMessages();
if (keyIndex == mCurrentKey) {
mCurrentKeyTime += eventTime - mLastMoveTime;
} else {
@@ -1203,16 +1204,20 @@ public class KeyboardView extends View implements View.OnClickListener {
if (mPreviewPopup.isShowing()) {
mPreviewPopup.dismiss();
}
- mHandler.removeMessages(MSG_REPEAT);
- mHandler.removeMessages(MSG_LONGPRESS);
- mHandler.removeMessages(MSG_SHOW_PREVIEW);
+ removeMessages();
dismissPopupKeyboard();
mBuffer = null;
mCanvas = null;
mMiniKeyboardCache.clear();
}
-
+
+ private void removeMessages() {
+ mHandler.removeMessages(MSG_REPEAT);
+ mHandler.removeMessages(MSG_LONGPRESS);
+ mHandler.removeMessages(MSG_SHOW_PREVIEW);
+ }
+
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();