Program: 111185
Project: 111185
Buggy source:
@Override protected boolean onGraphOverlayTouchEvent(MotionEvent _Event){
  performClick();
  float newX=_Event.getX();
  float newY=_Event.getY();
switch (_Event.getAction()) {
case MotionEvent.ACTION_DOWN:
    return true;
case MotionEvent.ACTION_MOVE:
  break;
case MotionEvent.ACTION_UP:
break;
}
if (mShowIndicator && mSeries.size() == 1) {
int size=mSeries.get(0).getSeries().size();
for (int i=0; i < size; i++) {
if (mSeries.get(0).getSeries().get(i).getCoordinates().getX() == newX) {
  mFocusedPoint=mSeries.get(0).getSeries().get(i);
  break;
}
 else {
  if (i == size - 1) {
    mFocusedPoint=mSeries.get(0).getSeries().get(i);
    break;
  }
 else {
    float x=mSeries.get(0).getSeries().get(i).getCoordinates().getX();
    float nextX=mSeries.get(0).getSeries().get(i + 1).getCoordinates().getX();
    if (newX > x && newX < nextX) {
      if (newX - x > nextX - newX) {
        mFocusedPoint=mSeries.get(0).getSeries().get(i + 1);
        break;
      }
 else {
        mFocusedPoint=mSeries.get(0).getSeries().get(i);
        break;
      }
    }
 else     if (newX > x && newX < nextX) {
      mFocusedPoint=mSeries.get(0).getSeries().get(i);
      break;
    }
  }
}
}
if (mFocusedPoint != null) {
mTouchedArea=mFocusedPoint.getCoordinates();
}
 else {
mTouchedArea.setX(newX);
mTouchedArea.setY(newY);
}
if (mLastPoint != mFocusedPoint) {
mLastPoint=mFocusedPoint;
calculateValueTextHeight();
if (mListener != null) {
  mListener.onPointFocused(mSeries.get(0).getSeries().indexOf(mFocusedPoint));
}
}
invalidateGlobal();
}
return true;
}

Fixed version (ground truth):
@Override protected boolean onGraphOverlayTouchEvent(MotionEvent _Event){
  super.onGraphOverlayTouchEvent(_Event);
  float newX=_Event.getX();
  float newY=_Event.getY();
switch (_Event.getAction()) {
case MotionEvent.ACTION_DOWN:
    return true;
}
if (mShowIndicator && mSeries.size() == 1) {
  int size=mSeries.get(0).getSeries().size();
  for (int i=0; i < size; i++) {
    if (mSeries.get(0).getSeries().get(i).getCoordinates().getX() == newX) {
      mFocusedPoint=mSeries.get(0).getSeries().get(i);
      break;
    }
 else {
      if (i == size - 1) {
        mFocusedPoint=mSeries.get(0).getSeries().get(i);
        break;
      }
 else {
        float x=mSeries.get(0).getSeries().get(i).getCoordinates().getX();
        float nextX=mSeries.get(0).getSeries().get(i + 1).getCoordinates().getX();
        if (newX > x && newX < nextX) {
          if (newX - x > nextX - newX) {
            mFocusedPoint=mSeries.get(0).getSeries().get(i + 1);
            break;
          }
 else {
            mFocusedPoint=mSeries.get(0).getSeries().get(i);
            break;
          }
        }
 else         if (newX > x && newX < nextX) {
          mFocusedPoint=mSeries.get(0).getSeries().get(i);
          break;
        }
      }
    }
  }
  if (mFocusedPoint != null) {
    mTouchedArea=mFocusedPoint.getCoordinates();
  }
 else {
    mTouchedArea.setX(newX);
    mTouchedArea.setY(newY);
  }
  if (mLastPoint != mFocusedPoint) {
    mLastPoint=mFocusedPoint;
    calculateValueTextHeight();
    if (mListener != null) {
      mListener.onPointFocused(mSeries.get(0).getSeries().indexOf(mFocusedPoint));
    }
  }
  invalidateGlobal();
}
return true;
}