Program: 18789
Project: 18789
Buggy source:
@Override protected void drawValues(){
  if (!mDrawXVals && !mDrawYValues)   return;
  PointF center=getCenterCircleBox();
  float r=getRadius();
  float off=r / 2f;
  if (mDrawHole) {
    off=(r - (r / 100f * mHoleRadiusPercent)) / 2f;
  }
  r-=off;
  ArrayList<PieDataSet> dataSets=mCurrentData.getDataSets();
  int cnt=0;
  for (int i=0; i < mCurrentData.getDataSetCount(); i++) {
    PieDataSet dataSet=dataSets.get(i);
    ArrayList<Entry> entries=dataSet.getYVals();
    for (int j=0; j < entries.size() * mPhaseX; j++) {
      float offset=mDrawAngles[cnt] / 2;
      float x=(float)(r * Math.cos(Math.toRadians((mRotationAngle + mAbsoluteAngles[cnt] - offset) * mPhaseY)) + center.x);
      float y=(float)(r * Math.sin(Math.toRadians((mRotationAngle + mAbsoluteAngles[cnt] - offset) * mPhaseY)) + center.y);
      String val="String_Node_Str";
      float value=entries.get(j).getVal();
      if (mUsePercentValues)       val=mValueFormat.format(getPercentOfTotal(value)) + "String_Node_Str";
 else       val=mValueFormat.format(value);
      if (mDrawUnitInChart)       val=val + mUnit;
      if (mDrawXVals && mDrawYValues) {
        float lineHeight=(mValuePaint.ascent() + mValuePaint.descent()) * 1.6f;
        y-=lineHeight / 2;
        mDrawCanvas.drawText(val,x,y,mValuePaint);
        mDrawCanvas.drawText(mCurrentData.getXVals().get(j),x,y + lineHeight,mValuePaint);
      }
 else       if (mDrawXVals && !mDrawYValues) {
        mDrawCanvas.drawText(mCurrentData.getXVals().get(j),x,y,mValuePaint);
      }
 else       if (!mDrawXVals && mDrawYValues) {
        mDrawCanvas.drawText(val,x,y,mValuePaint);
      }
      cnt++;
    }
  }
}

Fixed version (ground truth):
@Override protected void drawValues(){
  if (!mDrawXVals && !mDrawYValues)   return;
  PointF center=getCenterCircleBox();
  float r=getRadius();
  float off=r / 2f;
  if (mDrawHole) {
    off=(r - (r / 100f * mHoleRadiusPercent)) / 2f;
  }
  r-=off;
  ArrayList<PieDataSet> dataSets=mCurrentData.getDataSets();
  int cnt=0;
  for (int i=0; i < mCurrentData.getDataSetCount(); i++) {
    PieDataSet dataSet=dataSets.get(i);
    ArrayList<Entry> entries=dataSet.getYVals();
    for (int j=0; j < entries.size() * mPhaseX; j++) {
      float offset=mDrawAngles[cnt] / 2;
      float x=(float)(r * Math.cos(Math.toRadians((mRotationAngle + mAbsoluteAngles[cnt] - offset) * mPhaseY)) + center.x);
      float y=(float)(r * Math.sin(Math.toRadians((mRotationAngle + mAbsoluteAngles[cnt] - offset) * mPhaseY)) + center.y);
      String val="String_Node_Str";
      float value=entries.get(j).getVal();
      if (mUsePercentValues)       val=mValueFormat.format(Math.abs(getPercentOfTotal(value))) + "String_Node_Str";
 else       val=mValueFormat.format(value);
      if (mDrawUnitInChart)       val=val + mUnit;
      if (mDrawXVals && mDrawYValues) {
        float lineHeight=(mValuePaint.ascent() + mValuePaint.descent()) * 1.6f;
        y-=lineHeight / 2;
        mDrawCanvas.drawText(val,x,y,mValuePaint);
        mDrawCanvas.drawText(mCurrentData.getXVals().get(j),x,y + lineHeight,mValuePaint);
      }
 else       if (mDrawXVals && !mDrawYValues) {
        mDrawCanvas.drawText(mCurrentData.getXVals().get(j),x,y,mValuePaint);
      }
 else       if (!mDrawXVals && mDrawYValues) {
        mDrawCanvas.drawText(val,x,y,mValuePaint);
      }
      cnt++;
    }
  }
}