Program: 86185
Project: 86185
Buggy source:
@Override public boolean onTouchEvent(@NonNull final MotionEvent event){
  if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
    eventDown=System.currentTimeMillis();
  }
 else   if (event.getActionMasked() == MotionEvent.ACTION_UP || event.getActionMasked() == MotionEvent.ACTION_CANCEL) {
    eventUp=System.currentTimeMillis();
    long touchDuration=eventUp - eventDown;
    touchDuration=touchDuration < 250 ? 250 : (touchDuration > 2000 ? 2000 : touchDuration);
    long longTouch=2000;
    float ratio=(float)Math.sqrt((float)longTouch / (float)touchDuration);
    int endRadius=(int)getEndRadius(event.getX(),event.getY());
    final Animator animator=new Animator(this,event.getX(),event.getY(),endRadius);
    int totalDuration=endRadius / 2;
    final ObjectAnimator fadeInAnimator=ObjectAnimator.ofInt(animator,"String_Node_Str",0,25);
    fadeInAnimator.setInterpolator(new AccelerateInterpolator());
    fadeInAnimator.setDuration(100);
    final ObjectAnimator circleAnimator=ObjectAnimator.ofFloat(animator,"String_Node_Str",0,endRadius);
    circleAnimator.setInterpolator(new DecelerateInterpolator());
    circleAnimator.setDuration(totalDuration);
    final ObjectAnimator fadeOutAnimator=ObjectAnimator.ofInt(animator,"String_Node_Str",25,0);
    fadeOutAnimator.setInterpolator(new LinearInterpolator());
    fadeOutAnimator.setStartDelay(totalDuration / 2);
    fadeOutAnimator.setDuration(totalDuration / 2);
    animatorSet.add(animator);
    new Handler().postDelayed(new Runnable(){
      @Override public void run(){
        animatorSet.remove(animator);
      }
    }
,totalDuration);
    fadeInAnimator.start();
    circleAnimator.start();
    fadeOutAnimator.start();
  }
  return true;
}

Fixed version (ground truth):
@Override public boolean onTouchEvent(@NonNull final MotionEvent event){
  if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
    eventDown=System.currentTimeMillis();
  }
 else   if (event.getActionMasked() == MotionEvent.ACTION_UP) {
    eventUp=System.currentTimeMillis();
    long touchDuration=eventUp - eventDown;
    touchDuration=touchDuration < 250 ? 250 : (touchDuration > 2000 ? 2000 : touchDuration);
    long longTouch=2000;
    float ratio=(float)Math.sqrt((float)longTouch / (float)touchDuration);
    int endRadius=(int)getEndRadius(event.getX(),event.getY());
    final Animator animator=new Animator(this,event.getX(),event.getY(),endRadius);
    int totalDuration=endRadius / 2;
    final ObjectAnimator fadeInAnimator=ObjectAnimator.ofInt(animator,"String_Node_Str",0,25);
    fadeInAnimator.setInterpolator(new AccelerateInterpolator());
    fadeInAnimator.setDuration(100);
    final ObjectAnimator circleAnimator=ObjectAnimator.ofFloat(animator,"String_Node_Str",0,endRadius);
    circleAnimator.setInterpolator(new DecelerateInterpolator());
    circleAnimator.setDuration(totalDuration);
    final ObjectAnimator fadeOutAnimator=ObjectAnimator.ofInt(animator,"String_Node_Str",25,0);
    fadeOutAnimator.setInterpolator(new LinearInterpolator());
    fadeOutAnimator.setStartDelay(totalDuration / 2);
    fadeOutAnimator.setDuration(totalDuration / 2);
    animatorSet.add(animator);
    new Handler().postDelayed(new Runnable(){
      @Override public void run(){
        animatorSet.remove(animator);
      }
    }
,totalDuration);
    fadeInAnimator.start();
    circleAnimator.start();
    fadeOutAnimator.start();
  }
  return true;
}