Program: 34472
Project: 34472
Buggy source:
private void updateByProgress(float progress){
  mArcPath.reset();
  float startX=mDirection == DIRECTION_LEFT ? 0 : getWidth();
  float progressX=endX * (progress - 1f);
  if (progress >= 0 && progress <= 2 && mNeedFade) {
    mFadeView.setAlpha(progress / 2);
  }
  if (progress >= 1f) {
    float realX=mDirection == DIRECTION_LEFT ? progressX : startX - progressX;
    mArcPath.moveTo(startX,0);
    mArcPath.lineTo(realX,0);
    mArcPath.quadTo(mDirection == DIRECTION_LEFT ? endX : startX - endX,arcDrawY == 0 ? getHeight() / 2 : arcDrawY,realX,getHeight());
    mArcPath.lineTo(startX,getHeight());
    mContent.setTranslationX(mDirection == DIRECTION_LEFT ? progressX : -progressX);
    if (progress >= 2f) {
      isBouncing=true;
    }
  }
 else {
    mArcPath.moveTo(startX,0);
    if (isOpen) {
      mArcPath.quadTo(mDirection == DIRECTION_LEFT ? endX * progress : getScreenWidth() - endX * progress,arcDrawY == 0 ? getHeight() / 2 : arcDrawY,startX,getHeight());
      if (progress <= 0f) {
        isBouncing=true;
      }
      if (!isBouncing) {
        mContent.setTranslationX(mDirection == DIRECTION_LEFT ? progressX : -progressX);
      }
 else {
        mContent.setTranslationX(0);
      }
    }
 else {
      mArcPath.quadTo(mDirection == DIRECTION_LEFT ? endX * 2 * progress : startX - (endX * 2 * progress),arcDrawY == 0 ? getHeight() / 2 : arcDrawY,startX,getHeight());
    }
  }
  mArcPath.close();
  if (menuListener != null) {
    menuListener.onProgressUpdate(progress,isBouncing);
  }
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    if (mSpring.getCurrentValue() <= 2f) {
      invalidateOutline();
    }
  }
  postInvalidate();
}

Fixed version (ground truth):
private void updateByProgress(float progress){
  mArcPath.reset();
  float startX=mDirection == DIRECTION_LEFT ? 0 : getWidth();
  if (progress >= 0 && progress <= 2 && mNeedFade) {
    mFadeView.setAlpha(progress / 2);
  }
  if (progress >= 1f) {
    float progressX=endX * (progress - 1f);
    float realX=mDirection == DIRECTION_LEFT ? progressX : startX - progressX;
    mArcPath.moveTo(startX,0);
    mArcPath.lineTo(realX,0);
    mArcPath.quadTo(mDirection == DIRECTION_LEFT ? endX : startX - endX,arcDrawY == 0 ? getHeight() / 2 : arcDrawY,realX,getHeight());
    mArcPath.lineTo(startX,getHeight());
    mContent.setTranslationX(mDirection == DIRECTION_LEFT ? progressX : -progressX);
    if (progress >= 2f) {
      isBouncing=true;
    }
  }
 else {
    mArcPath.moveTo(startX,0);
    if (isOpen) {
      mArcPath.quadTo(mDirection == DIRECTION_LEFT ? endX * progress : getScreenWidth() - endX * progress,arcDrawY == 0 ? getHeight() / 2 : arcDrawY,startX,getHeight());
      if (progress <= 0f) {
        isBouncing=true;
      }
      mContent.setTranslationX(0);
    }
 else {
      mArcPath.quadTo(mDirection == DIRECTION_LEFT ? endX * 2 * progress : startX - (endX * 2 * progress),arcDrawY == 0 ? getHeight() / 2 : arcDrawY,startX,getHeight());
    }
  }
  mArcPath.close();
  if (menuListener != null) {
    menuListener.onProgressUpdate(progress,isBouncing);
  }
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    if (mSpring.getCurrentValue() <= 2f) {
      invalidateOutline();
    }
  }
  postInvalidate();
}