Program: 157308
Project: 157308
Buggy source:
@Override public void onUpdateSelection(int oldSelStart,int oldSelEnd,int newSelStart,int newSelEnd,int candidatesStart,int candidatesEnd){
  super.onUpdateSelection(oldSelStart,oldSelEnd,newSelStart,newSelEnd,candidatesStart,candidatesEnd);
  if (BuildConfig.DEBUG)   Logger.d(TAG,"String_Node_Str",oldSelStart,oldSelEnd,newSelStart,newSelEnd,candidatesStart,candidatesEnd);
  mGlobalCursorPosition=newSelEnd;
  mGlobalSelectionStartPosition=newSelStart;
  if (mUndoCommitCursorPosition == UNDO_COMMIT_WAITING_TO_RECORD_POSITION) {
    Logger.d(TAG,"String_Node_Str");
    mUndoCommitCursorPosition=newSelStart;
  }
  updateShiftStateNow();
  final boolean isExpectedEvent=SystemClock.uptimeMillis() < mExpectingSelectionUpdateBy;
  mExpectingSelectionUpdateBy=NEVER_TIME_STAMP;
  if (isExpectedEvent) {
    Logger.v(TAG,"String_Node_Str");
    return;
  }
  if (!isPredictionOn()) {
    return;
  }
  final InputConnection ic=getCurrentInputConnection();
  if (ic == null)   return;
  Logger.d(TAG,"String_Node_Str");
  if (mCandidateView != null)   mCandidateView.dismissAddToDictionaryHint();
  if (newSelStart != newSelEnd) {
    Logger.d(TAG,"String_Node_Str");
    abortCorrection(true,false);
  }
 else {
    if (mPredicting) {
      if (newSelStart >= candidatesStart && newSelStart <= candidatesEnd) {
        int cursorPosition=newSelEnd - candidatesStart;
        if (mWord.setCursorPosition(cursorPosition)) {
          Logger.d(TAG,"String_Node_Str");
        }
      }
 else {
        Logger.d(TAG,"String_Node_Str");
        abortCorrection(true,false);
        postRestartWordSuggestion();
      }
    }
 else {
      Logger.d(TAG,"String_Node_Str");
      if (TextEntryState.willUndoCommitOnBackspace()) {
        if (mUndoCommitCursorPosition == oldSelStart && mUndoCommitCursorPosition != newSelStart) {
          Logger.d(TAG,"String_Node_Str");
          abortCorrection(true,false);
        }
      }
      postRestartWordSuggestion();
    }
  }
}

Fixed version (ground truth):
@Override public void onUpdateSelection(int oldSelStart,int oldSelEnd,int newSelStart,int newSelEnd,int candidatesStart,int candidatesEnd){
  super.onUpdateSelection(oldSelStart,oldSelEnd,newSelStart,newSelEnd,candidatesStart,candidatesEnd);
  if (BuildConfig.DEBUG)   Logger.d(TAG,"String_Node_Str",oldSelStart,oldSelEnd,newSelStart,newSelEnd,candidatesStart,candidatesEnd);
  mGlobalCursorPosition=newSelEnd;
  mGlobalSelectionStartPosition=newSelStart;
  if (mUndoCommitCursorPosition == UNDO_COMMIT_WAITING_TO_RECORD_POSITION) {
    Logger.d(TAG,"String_Node_Str");
    mUndoCommitCursorPosition=newSelStart;
  }
  updateShiftStateNow();
  final boolean isExpectedEvent=SystemClock.uptimeMillis() < mExpectingSelectionUpdateBy;
  mExpectingSelectionUpdateBy=NEVER_TIME_STAMP;
  if (isExpectedEvent) {
    Logger.v(TAG,"String_Node_Str");
    return;
  }
  if (!isPredictionOn()) {
    return;
  }
  final InputConnection ic=getCurrentInputConnection();
  if (ic == null)   return;
  Logger.d(TAG,"String_Node_Str");
  if (newSelStart != newSelEnd) {
    Logger.d(TAG,"String_Node_Str");
    abortCorrection(true,false);
  }
 else {
    if (mPredicting) {
      if (newSelStart >= candidatesStart && newSelStart <= candidatesEnd) {
        int cursorPosition=newSelEnd - candidatesStart;
        if (mWord.setCursorPosition(cursorPosition)) {
          Logger.d(TAG,"String_Node_Str");
        }
      }
 else {
        Logger.d(TAG,"String_Node_Str");
        abortCorrection(true,false);
        postRestartWordSuggestion();
      }
    }
 else {
      Logger.d(TAG,"String_Node_Str");
      if (TextEntryState.willUndoCommitOnBackspace()) {
        if (mUndoCommitCursorPosition == oldSelStart && mUndoCommitCursorPosition != newSelStart) {
          Logger.d(TAG,"String_Node_Str");
          abortCorrection(true,false);
        }
      }
      postRestartWordSuggestion();
    }
  }
}