Program: 1820
Project: 1820
Buggy source:
@Override protected Animator disappear(ViewGroup sceneRoot,TransitionValues startValues,int startVisibility,TransitionValues endValues,int endVisibility){
  if ((mFadingMode & OUT) != OUT) {
    return null;
  }
  View view;
  View startView=(startValues != null) ? startValues.view : null;
  View endView=(endValues != null) ? endValues.view : null;
  if (Transition.DBG) {
    Log.d(LOG_TAG,"String_Node_Str" + startView + "String_Node_Str"+ startVisibility+ "String_Node_Str"+ endView+ "String_Node_Str"+ endVisibility);
  }
  View overlayView=null;
  View viewToKeep=null;
  if (endView == null) {
    view=startView;
    overlayView=view;
  }
 else {
    if (endVisibility == View.INVISIBLE) {
      view=endView;
      viewToKeep=view;
    }
 else {
      if (startView == endView) {
        view=endView;
        viewToKeep=view;
      }
 else {
        view=startView;
        overlayView=view;
      }
    }
  }
  final int finalVisibility=endVisibility;
  if (overlayView != null) {
    int screenX=(Integer)startValues.values.get(PROPNAME_SCREEN_X);
    int screenY=(Integer)startValues.values.get(PROPNAME_SCREEN_Y);
    int[] loc=new int[2];
    sceneRoot.getLocationOnScreen(loc);
    overlayView.offsetLeftAndRight((screenX - loc[0]) - overlayView.getLeft());
    overlayView.offsetTopAndBottom((screenY - loc[1]) - overlayView.getTop());
    sceneRoot.getOverlay().add(overlayView);
    final float startAlpha=view.getAlpha();
    float endAlpha=0;
    final View finalView=view;
    final View finalOverlayView=overlayView;
    final View finalViewToKeep=viewToKeep;
    final ViewGroup finalSceneRoot=sceneRoot;
    final Animator.AnimatorListener endListener=new AnimatorListenerAdapter(){
      @Override public void onAnimationEnd(      Animator animation){
        finalView.setAlpha(startAlpha);
        if (finalViewToKeep != null) {
          finalViewToKeep.setVisibility(finalVisibility);
        }
        if (finalOverlayView != null) {
          finalSceneRoot.getOverlay().remove(finalOverlayView);
        }
      }
    }
;
    return runAnimation(view,startAlpha,endAlpha,endListener);
  }
  if (viewToKeep != null) {
    viewToKeep.setVisibility((View.VISIBLE));
    final float startAlpha=view.getAlpha();
    float endAlpha=0;
    final View finalView=view;
    final View finalOverlayView=overlayView;
    final View finalViewToKeep=viewToKeep;
    final ViewGroup finalSceneRoot=sceneRoot;
    final Animator.AnimatorListener endListener=new AnimatorListenerAdapter(){
      @Override public void onAnimationEnd(      Animator animation){
        finalView.setAlpha(startAlpha);
        if (finalViewToKeep != null) {
          finalViewToKeep.setVisibility(finalVisibility);
        }
        if (finalOverlayView != null) {
          finalSceneRoot.getOverlay().remove(finalOverlayView);
        }
      }
    }
;
    return runAnimation(view,startAlpha,endAlpha,endListener);
  }
  return null;
}

Fixed version (ground truth):
@Override protected Animator disappear(ViewGroup sceneRoot,TransitionValues startValues,int startVisibility,TransitionValues endValues,int endVisibility){
  if ((mFadingMode & OUT) != OUT) {
    return null;
  }
  View view;
  View startView=(startValues != null) ? startValues.view : null;
  View endView=(endValues != null) ? endValues.view : null;
  if (DBG) {
    Log.d(LOG_TAG,"String_Node_Str" + startView + "String_Node_Str"+ startVisibility+ "String_Node_Str"+ endView+ "String_Node_Str"+ endVisibility);
  }
  View overlayView=null;
  View viewToKeep=null;
  if (endView == null) {
    view=startView;
    overlayView=view;
  }
 else {
    if (endVisibility == View.INVISIBLE) {
      view=endView;
      viewToKeep=view;
    }
 else {
      if (startView == endView) {
        view=endView;
        viewToKeep=view;
      }
 else {
        view=startView;
        overlayView=view;
      }
    }
  }
  final int finalVisibility=endVisibility;
  if (overlayView != null) {
    int screenX=(Integer)startValues.values.get(PROPNAME_SCREEN_X);
    int screenY=(Integer)startValues.values.get(PROPNAME_SCREEN_Y);
    int[] loc=new int[2];
    sceneRoot.getLocationOnScreen(loc);
    overlayView.offsetLeftAndRight((screenX - loc[0]) - overlayView.getLeft());
    overlayView.offsetTopAndBottom((screenY - loc[1]) - overlayView.getTop());
    sceneRoot.getOverlay().add(overlayView);
    final float startAlpha=view.getAlpha();
    float endAlpha=0;
    final View finalView=view;
    final View finalOverlayView=overlayView;
    final View finalViewToKeep=viewToKeep;
    final ViewGroup finalSceneRoot=sceneRoot;
    final Animator.AnimatorListener endListener=new AnimatorListenerAdapter(){
      @Override public void onAnimationEnd(      Animator animation){
        finalView.setAlpha(startAlpha);
        if (finalViewToKeep != null) {
          finalViewToKeep.setVisibility(finalVisibility);
        }
        if (finalOverlayView != null) {
          finalSceneRoot.getOverlay().remove(finalOverlayView);
        }
      }
    }
;
    return runAnimation(view,startAlpha,endAlpha,endListener);
  }
  if (viewToKeep != null) {
    viewToKeep.setVisibility((View.VISIBLE));
    final float startAlpha=view.getAlpha();
    float endAlpha=0;
    final View finalView=view;
    final View finalOverlayView=overlayView;
    final View finalViewToKeep=viewToKeep;
    final ViewGroup finalSceneRoot=sceneRoot;
    final Animator.AnimatorListener endListener=new AnimatorListenerAdapter(){
      @Override public void onAnimationEnd(      Animator animation){
        finalView.setAlpha(startAlpha);
        if (finalViewToKeep != null) {
          finalViewToKeep.setVisibility(finalVisibility);
        }
        if (finalOverlayView != null) {
          finalSceneRoot.getOverlay().remove(finalOverlayView);
        }
      }
    }
;
    return runAnimation(view,startAlpha,endAlpha,endListener);
  }
  return null;
}