Program: 15403
Project: 15403
Buggy source:
@Override public synchronized void onFingersMoved(){
  mScaleAnimation=null;
  mScrollbars.showBars();
switch (mCurrentTouchState) {
case DOUBLE_TAP_ONE_FINGER_DOWN:
{
      if (mDragFinger.mTotalPosDifference.distanceSquared() >= 400f * mScreenDensity * mScreenDensity) {
        mCurrentTouchState=TouchState.DOUBLE_TAP_ONE_FINGER_DRAG;
      }
      break;
    }
case DOUBLE_TAP_ONE_FINGER_DRAG:
{
    final MutableFloatPoint2D screenCentre=mTmpPoint1_onFingersMoved;
    screenCentre.set(mResolutionX / 2,mResolutionY / 2);
    mCoordinateHelper.scaleAboutScreenPoint(screenCentre,(float)Math.pow(1.01,mDragFinger.mPosDifference.y / mScreenDensity));
    break;
  }
case ONE_FINGER_DOWN:
{
  if (mDragFinger.mTotalPosDifference.distanceSquared() >= 100f * mScreenDensity * mScreenDensity) {
    mCurrentTouchState=TouchState.ONE_FINGER_DRAG;
  }
}
case ONE_FINGER_DRAG:
mCoordinateHelper.translateScreen(mDragFinger.mLastPos,mDragFinger.mCurrentPos);
break;
case TWO_FINGER_PINCH:
{
final double oldDistance=mPinchFinger1.mLastPos.euclideanDistanceTo(mPinchFinger2.mLastPos);
final double newDistance=mPinchFinger1.mCurrentPos.euclideanDistanceTo(mPinchFinger2.mCurrentPos);
final MutableFloatPoint2D oldCentre=mTmpPoint1_onFingersMoved;
mPinchFinger1.mLastPos.add(mPinchFinger2.mLastPos,oldCentre);
oldCentre.scale(0.5);
final MutableFloatPoint2D newCentre=mTmpPoint2_onFingersMoved;
mPinchFinger1.mCurrentPos.add(mPinchFinger2.mCurrentPos,newCentre);
newCentre.scale(0.5);
final float scaleDifference=(float)(newDistance / oldDistance);
mCoordinateHelper.scaleAboutScreenPoint(newCentre,scaleDifference);
mCoordinateHelper.translateScreen(oldCentre,newCentre);
break;
}
}
}

Fixed version (ground truth):
@Override public synchronized void onFingersMoved(){
  if (mScrollbars == null) {
    return;
  }
  mScaleAnimation=null;
  mScrollbars.showBars();
switch (mCurrentTouchState) {
case DOUBLE_TAP_ONE_FINGER_DOWN:
{
      if (mDragFinger.mTotalPosDifference.distanceSquared() >= 400f * mScreenDensity * mScreenDensity) {
        mCurrentTouchState=TouchState.DOUBLE_TAP_ONE_FINGER_DRAG;
      }
      break;
    }
case DOUBLE_TAP_ONE_FINGER_DRAG:
{
    final MutableFloatPoint2D screenCentre=mTmpPoint1_onFingersMoved;
    screenCentre.set(mResolutionX / 2,mResolutionY / 2);
    mCoordinateHelper.scaleAboutScreenPoint(screenCentre,(float)Math.pow(1.01,mDragFinger.mPosDifference.y / mScreenDensity));
    break;
  }
case ONE_FINGER_DOWN:
{
  if (mDragFinger.mTotalPosDifference.distanceSquared() >= 100f * mScreenDensity * mScreenDensity) {
    mCurrentTouchState=TouchState.ONE_FINGER_DRAG;
  }
}
case ONE_FINGER_DRAG:
mCoordinateHelper.translateScreen(mDragFinger.mLastPos,mDragFinger.mCurrentPos);
break;
case TWO_FINGER_PINCH:
{
final double oldDistance=mPinchFinger1.mLastPos.euclideanDistanceTo(mPinchFinger2.mLastPos);
final double newDistance=mPinchFinger1.mCurrentPos.euclideanDistanceTo(mPinchFinger2.mCurrentPos);
final MutableFloatPoint2D oldCentre=mTmpPoint1_onFingersMoved;
mPinchFinger1.mLastPos.add(mPinchFinger2.mLastPos,oldCentre);
oldCentre.scale(0.5);
final MutableFloatPoint2D newCentre=mTmpPoint2_onFingersMoved;
mPinchFinger1.mCurrentPos.add(mPinchFinger2.mCurrentPos,newCentre);
newCentre.scale(0.5);
final float scaleDifference=(float)(newDistance / oldDistance);
mCoordinateHelper.scaleAboutScreenPoint(newCentre,scaleDifference);
mCoordinateHelper.translateScreen(oldCentre,newCentre);
break;
}
}
}