Program: 54133
Project: 54133
Buggy source:
/** 
 * This method, essentially a wrapper around all calls to createAnimator for all possible target views, is called with the entire set of start/end values. The implementation in Transition iterates through these lists and calls   {@link #createAnimator(ViewGroup,TransitionValues,TransitionValues)}with each set of start/end values on this transition. The TransitionSet subclass overrides this method and delegates it to each of its children in succession.
 * @hide
 */
protected void createAnimators(ViewGroup sceneRoot,TransitionValuesMaps startValues,TransitionValuesMaps endValues,ArrayList<TransitionValues> startValuesList,ArrayList<TransitionValues> endValuesList){
  if (DBG) {
    Log.d(LOG_TAG,"String_Node_Str" + this);
  }
  ArrayMap<Animator,AnimationInfo> runningAnimators=getRunningAnimators();
  long minStartDelay=Long.MAX_VALUE;
  int minAnimator=mAnimators.size();
  SparseArray<Long> startDelays=new SparseArray<Long>();
  int startValuesListCount=startValuesList.size();
  for (int i=0; i < startValuesListCount; ++i) {
    TransitionValues start=startValuesList.get(i);
    TransitionValues end=endValuesList.get(i);
    if (start != null && !start.targetedTransitions.contains(this)) {
      start=null;
    }
    if (end != null && !end.targetedTransitions.contains(this)) {
      end=null;
    }
    if (start == null && end == null) {
      continue;
    }
    boolean isChanged=start == null || end == null || areValuesChanged(start,end);
    if (isChanged) {
      if (DBG) {
        View view=(end != null) ? end.view : start.view;
        Log.d(LOG_TAG,"String_Node_Str" + view);
        if (start == null || end == null) {
          Log.d(LOG_TAG,"String_Node_Str" + ((start == null) ? "String_Node_Str" : "String_Node_Str"));
        }
 else {
          for (          String key : start.values.keySet()) {
            Object startValue=start.values.get(key);
            Object endValue=end.values.get(key);
            if (startValue != endValue && !startValue.equals(endValue)) {
              Log.d(LOG_TAG,"String_Node_Str" + key + "String_Node_Str"+ startValue+ "String_Node_Str"+ endValue+ "String_Node_Str");
            }
          }
        }
      }
      Animator animator=createAnimator(sceneRoot,start,end);
      if (animator != null) {
        View view;
        TransitionValues infoValues=null;
        if (end != null) {
          view=end.view;
          String[] properties=getTransitionProperties();
          if (view != null && properties != null && properties.length > 0) {
            infoValues=new TransitionValues();
            infoValues.view=view;
            TransitionValues newValues=endValues.viewValues.get(view);
            if (newValues != null) {
              for (int j=0; j < properties.length; ++j) {
                infoValues.values.put(properties[j],newValues.values.get(properties[j]));
              }
            }
            int numExistingAnims=runningAnimators.size();
            for (int j=0; j < numExistingAnims; ++j) {
              Animator anim=runningAnimators.keyAt(j);
              AnimationInfo info=runningAnimators.get(anim);
              if (info.values != null && info.view == view && ((info.name == null && getName() == null) || (info.name != null && info.name.equals(getName())))) {
                if (info.values.equals(infoValues)) {
                  animator=null;
                  break;
                }
              }
            }
          }
        }
 else {
          view=start.view;
        }
        if (animator != null) {
          if (mPropagation != null) {
            long delay=mPropagation.getStartDelay(sceneRoot,this,start,end);
            startDelays.put(mAnimators.size(),delay);
            minStartDelay=Math.min(delay,minStartDelay);
          }
          AnimationInfo info=new AnimationInfo(view,getName(),this,ViewUtils.getWindowId(sceneRoot),infoValues);
          runningAnimators.put(animator,info);
          mAnimators.add(animator);
        }
      }
    }
  }
  if (minStartDelay != 0) {
    for (int i=0; i < startDelays.size(); i++) {
      int index=startDelays.keyAt(i);
      Animator animator=mAnimators.get(index);
      long delay=startDelays.valueAt(i) - minStartDelay + animator.getStartDelay();
      animator.setStartDelay(delay);
    }
  }
}

Fixed version (ground truth):
/** 
 * This method, essentially a wrapper around all calls to createAnimator for all possible target views, is called with the entire set of start/end values. The implementation in Transition iterates through these lists and calls   {@link #createAnimator(ViewGroup,TransitionValues,TransitionValues)}with each set of start/end values on this transition. The TransitionSet subclass overrides this method and delegates it to each of its children in succession.
 * @hide
 */
protected void createAnimators(ViewGroup sceneRoot,TransitionValuesMaps startValues,TransitionValuesMaps endValues,ArrayList<TransitionValues> startValuesList,ArrayList<TransitionValues> endValuesList){
  if (DBG) {
    Log.d(LOG_TAG,"String_Node_Str" + this);
  }
  ArrayMap<Animator,AnimationInfo> runningAnimators=getRunningAnimators();
  long minStartDelay=Long.MAX_VALUE;
  int minAnimator=mAnimators.size();
  SparseArray<Long> startDelays=new SparseArray<Long>();
  int startValuesListCount=startValuesList.size();
  for (int i=0; i < startValuesListCount; ++i) {
    TransitionValues start=startValuesList.get(i);
    TransitionValues end=endValuesList.get(i);
    if (start != null && !start.targetedTransitions.contains(this)) {
      start=null;
    }
    if (end != null && !end.targetedTransitions.contains(this)) {
      end=null;
    }
    if (start == null && end == null) {
      continue;
    }
    boolean isChanged=start == null || end == null || areValuesChanged(start,end);
    if (isChanged) {
      if (DBG) {
        View view=(end != null) ? end.view : start.view;
        Log.d(LOG_TAG,"String_Node_Str" + view);
        if (start == null || end == null) {
          Log.d(LOG_TAG,"String_Node_Str" + ((start == null) ? "String_Node_Str" : "String_Node_Str"));
        }
 else {
          for (          String key : start.values.keySet()) {
            Object startValue=start.values.get(key);
            Object endValue=end.values.get(key);
            if (startValue != endValue && !startValue.equals(endValue)) {
              Log.d(LOG_TAG,"String_Node_Str" + key + "String_Node_Str"+ startValue+ "String_Node_Str"+ endValue+ "String_Node_Str");
            }
          }
        }
      }
      Animator animator=createAnimator(sceneRoot,start,end);
      if (animator != null) {
        View view;
        TransitionValues infoValues=null;
        if (end != null) {
          view=end.view;
          String[] properties=getTransitionProperties();
          if (view != null && properties != null && properties.length > 0) {
            infoValues=new TransitionValues();
            infoValues.view=view;
            TransitionValues newValues=endValues.viewValues.get(view);
            if (newValues != null) {
              for (int j=0; j < properties.length; ++j) {
                infoValues.values.put(properties[j],newValues.values.get(properties[j]));
              }
            }
synchronized (sRunningAnimators) {
              int numExistingAnims=runningAnimators.size();
              for (int j=0; j < numExistingAnims; ++j) {
                Animator anim=runningAnimators.keyAt(j);
                AnimationInfo info=runningAnimators.get(anim);
                if (info.values != null && info.view == view && ((info.name == null && getName() == null) || (info.name != null && info.name.equals(getName())))) {
                  if (info.values.equals(infoValues)) {
                    animator=null;
                    break;
                  }
                }
              }
            }
          }
        }
 else {
          view=start.view;
        }
        if (animator != null) {
          if (mPropagation != null) {
            long delay=mPropagation.getStartDelay(sceneRoot,this,start,end);
            startDelays.put(mAnimators.size(),delay);
            minStartDelay=Math.min(delay,minStartDelay);
          }
          AnimationInfo info=new AnimationInfo(view,getName(),this,ViewUtils.getWindowId(sceneRoot),infoValues);
          runningAnimators.put(animator,info);
          mAnimators.add(animator);
        }
      }
    }
  }
  if (minStartDelay != 0) {
    for (int i=0; i < startDelays.size(); i++) {
      int index=startDelays.keyAt(i);
      Animator animator=mAnimators.get(index);
      long delay=startDelays.valueAt(i) - minStartDelay + animator.getStartDelay();
      animator.setStartDelay(delay);
    }
  }
}