public void updateKey(int keyIndex) {
   if (mKeyAlreadyProcessed) return;
   int oldKeyIndex = mPreviousKey;
   mPreviousKey = keyIndex;
   if (keyIndex != oldKeyIndex) {
     if (isValidKeyIndex(oldKeyIndex)) {
       // if new key index is not a key, old key was just released inside of the key.
       final boolean inside = (keyIndex == NOT_A_KEY);
       mKeys[oldKeyIndex].onReleased(inside);
       mProxy.invalidateKey(mKeys[oldKeyIndex]);
     }
     if (isValidKeyIndex(keyIndex)) {
       mKeys[keyIndex].onPressed();
       mProxy.invalidateKey(mKeys[keyIndex]);
     }
   }
 }
 public void onCancelEvent(int x, int y, long eventTime) {
   if (DEBUG) debugLog("onCancelEvt:", x, y);
   mHandler.cancelKeyTimers();
   mHandler.cancelPopupPreview();
   showKeyPreviewAndUpdateKey(NOT_A_KEY);
   mIsInSlidingKeyInput = false;
   int keyIndex = mKeyState.getKeyIndex();
   if (isValidKeyIndex(keyIndex)) mProxy.invalidateKey(mKeys[keyIndex]);
 }
  public void onUpEvent(int x, int y, long eventTime) {
    if (DEBUG) debugLog("onUpEvent  :", x, y);
    mHandler.cancelKeyTimers();
    mHandler.cancelPopupPreview();
    showKeyPreviewAndUpdateKey(NOT_A_KEY);
    mIsInSlidingKeyInput = false;
    sendSlideKeys();
    if (mKeyAlreadyProcessed) return;
    int keyIndex = mKeyState.onUpKey(x, y);
    if (isMinorMoveBounce(x, y, keyIndex)) {
      // Use previous fixed key index and coordinates.
      keyIndex = mKeyState.getKeyIndex();
      x = mKeyState.getKeyX();
      y = mKeyState.getKeyY();
    }
    if (!mIsRepeatableKey) {
      detectAndSendKey(keyIndex, x, y, eventTime);
    }

    if (isValidKeyIndex(keyIndex)) mProxy.invalidateKey(mKeys[keyIndex]);
  }