Program: 27284
Project: 27284
Buggy source:
@Override public boolean onTouchEvent(final MotionEvent event){
  Log.d("String_Node_Str",String.valueOf(event.getActionMasked()));
  Log.d("String_Node_Str",String.valueOf(mIsAnimating));
  Log.d("String_Node_Str",String.valueOf(mAnimationIsCancel));
  boolean superResult=super.onTouchEvent(event);
  if (event.getActionMasked() == MotionEvent.ACTION_DOWN && this.isEnabled() && mHover) {
    mRect=new Rect(getLeft(),getTop(),getRight(),getBottom());
    mAnimationIsCancel=false;
    mDownX=event.getX();
    mDownY=event.getY();
    mRadiusAnimator=ObjectAnimator.ofFloat(this,"String_Node_Str",0,dp(50)).setDuration(400);
    mRadiusAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
    mRadiusAnimator.start();
    if (!superResult) {
      return true;
    }
  }
 else   if (event.getActionMasked() == MotionEvent.ACTION_MOVE && this.isEnabled() && mHover) {
    mDownX=event.getX();
    mDownY=event.getY();
    if (mAnimationIsCancel=!mRect.contains(getLeft() + (int)event.getX(),getTop() + (int)event.getY())) {
      setRadius(0);
    }
 else {
      setRadius(dp(50));
    }
    if (!superResult) {
      return true;
    }
  }
 else   if (event.getActionMasked() == MotionEvent.ACTION_UP && !mAnimationIsCancel && this.isEnabled()) {
    mDownX=event.getX();
    mDownY=event.getY();
    final float tempRadius=(float)Math.sqrt(mDownX * mDownX + mDownY * mDownY);
    float targetRadius=Math.max(tempRadius,mMaxRadius);
    if (mIsAnimating) {
      mRadiusAnimator.cancel();
    }
    mRadiusAnimator=ObjectAnimator.ofFloat(this,"String_Node_Str",dp(50),targetRadius);
    mRadiusAnimator.setDuration(500);
    mRadiusAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
    mRadiusAnimator.addListener(new Animator.AnimatorListener(){
      @Override public void onAnimationStart(      Animator animator){
        mIsAnimating=true;
      }
      @Override public void onAnimationEnd(      Animator animator){
        setRadius(0);
        ViewHelper.setAlpha(RippleView.this,1);
        mIsAnimating=false;
      }
      @Override public void onAnimationCancel(      Animator animator){
      }
      @Override public void onAnimationRepeat(      Animator animator){
      }
    }
);
    mRadiusAnimator.start();
    if (!superResult) {
      return true;
    }
  }
  return superResult;
}

Fixed version (ground truth):
@Override public boolean onTouchEvent(final MotionEvent event){
  Log.d("String_Node_Str",String.valueOf(event.getActionMasked()));
  Log.d("String_Node_Str",String.valueOf(mIsAnimating));
  Log.d("String_Node_Str",String.valueOf(mAnimationIsCancel));
  boolean superResult=super.onTouchEvent(event);
  if (event.getActionMasked() == MotionEvent.ACTION_DOWN && this.isEnabled() && mHover) {
    mRect=new Rect(getLeft(),getTop(),getRight(),getBottom());
    mAnimationIsCancel=false;
    mDownX=event.getX();
    mDownY=event.getY();
    mRadiusAnimator=ObjectAnimator.ofFloat(this,"String_Node_Str",0,dp(50)).setDuration(400);
    mRadiusAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
    mRadiusAnimator.addListener(new Animator.AnimatorListener(){
      @Override public void onAnimationStart(      Animator animator){
        mIsAnimating=true;
      }
      @Override public void onAnimationEnd(      Animator animator){
        setRadius(0);
        ViewHelper.setAlpha(RippleView.this,1);
        mIsAnimating=false;
      }
      @Override public void onAnimationCancel(      Animator animator){
      }
      @Override public void onAnimationRepeat(      Animator animator){
      }
    }
);
    mRadiusAnimator.start();
    if (!superResult) {
      return true;
    }
  }
 else   if (event.getActionMasked() == MotionEvent.ACTION_MOVE && this.isEnabled() && mHover) {
    mDownX=event.getX();
    mDownY=event.getY();
    if (mAnimationIsCancel=!mRect.contains(getLeft() + (int)event.getX(),getTop() + (int)event.getY())) {
      setRadius(0);
    }
 else {
      setRadius(dp(50));
    }
    if (!superResult) {
      return true;
    }
  }
 else   if (event.getActionMasked() == MotionEvent.ACTION_UP && !mAnimationIsCancel && this.isEnabled()) {
    mDownX=event.getX();
    mDownY=event.getY();
    final float tempRadius=(float)Math.sqrt(mDownX * mDownX + mDownY * mDownY);
    float targetRadius=Math.max(tempRadius,mMaxRadius);
    if (mIsAnimating) {
      mRadiusAnimator.cancel();
    }
    mRadiusAnimator=ObjectAnimator.ofFloat(this,"String_Node_Str",dp(50),targetRadius);
    mRadiusAnimator.setDuration(500);
    mRadiusAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
    mRadiusAnimator.addListener(new Animator.AnimatorListener(){
      @Override public void onAnimationStart(      Animator animator){
        mIsAnimating=true;
      }
      @Override public void onAnimationEnd(      Animator animator){
        setRadius(0);
        ViewHelper.setAlpha(RippleView.this,1);
        mIsAnimating=false;
      }
      @Override public void onAnimationCancel(      Animator animator){
      }
      @Override public void onAnimationRepeat(      Animator animator){
      }
    }
);
    mRadiusAnimator.start();
    if (!superResult) {
      return true;
    }
  }
  return superResult;
}