Program: 54143
Project: 54143
Buggy source:
private ObjectAnimator createTransformAnimator(TransitionValues startValues,TransitionValues endValues,final boolean handleParentChange){
  Matrix startMatrix=(Matrix)startValues.values.get(PROPNAME_MATRIX);
  Matrix endMatrix=(Matrix)endValues.values.get(PROPNAME_MATRIX);
  if (startMatrix == null) {
    startMatrix=MatrixUtils.IDENTITY_MATRIX;
  }
  if (endMatrix == null) {
    endMatrix=MatrixUtils.IDENTITY_MATRIX;
  }
  if (startMatrix.equals(endMatrix)) {
    return null;
  }
  final Transforms transforms=(Transforms)endValues.values.get(PROPNAME_TRANSFORMS);
  final View view=endValues.view;
  setIdentityTransforms(view);
  ObjectAnimator animator=ObjectAnimator.ofObject(view,ANIMATION_MATRIX_PROPERTY,new TransitionUtils.MatrixEvaluator(),startMatrix,endMatrix);
  final Matrix finalEndMatrix=endMatrix;
  AnimatorListenerAdapter listener=new AnimatorListenerAdapter(){
    private boolean mIsCanceled;
    private Matrix mTempMatrix=new Matrix();
    @Override public void onAnimationCancel(    Animator animation){
      mIsCanceled=true;
    }
    @Override public void onAnimationEnd(    Animator animation){
      if (!mIsCanceled) {
        if (handleParentChange && mUseOverlay) {
          setCurrentMatrix(finalEndMatrix);
        }
 else {
          view.setTag(R.id.transitionTransform,null);
          view.setTag(R.id.parentMatrix,null);
        }
      }
      ANIMATION_MATRIX_PROPERTY.set(view,null);
      transforms.restore(view);
    }
    @Override public void onAnimationPause(    Animator animation){
      ValueAnimator animator=(ValueAnimator)animation;
      Matrix currentMatrix=(Matrix)animator.getAnimatedValue();
      setCurrentMatrix(currentMatrix);
    }
    @Override public void onAnimationResume(    Animator animation){
      setIdentityTransforms(view);
    }
    private void setCurrentMatrix(    Matrix currentMatrix){
      mTempMatrix.set(currentMatrix);
      view.setTag(R.id.transitionTransform,mTempMatrix);
      transforms.restore(view);
    }
  }
;
  animator.addListener(listener);
  animator.addPauseListener(listener);
  return animator;
}

Fixed version (ground truth):
private ObjectAnimator createTransformAnimator(TransitionValues startValues,TransitionValues endValues,final boolean handleParentChange){
  Matrix startMatrix=(Matrix)startValues.values.get(PROPNAME_MATRIX);
  Matrix endMatrix=(Matrix)endValues.values.get(PROPNAME_MATRIX);
  if (startMatrix == null) {
    startMatrix=MatrixUtils.IDENTITY_MATRIX;
  }
  if (endMatrix == null) {
    endMatrix=MatrixUtils.IDENTITY_MATRIX;
  }
  if (startMatrix.equals(endMatrix)) {
    return null;
  }
  final Transforms transforms=(Transforms)endValues.values.get(PROPNAME_TRANSFORMS);
  final View view=endValues.view;
  setIdentityTransforms(view);
  ObjectAnimator animator=ObjectAnimator.ofObject(view,ANIMATION_MATRIX_PROPERTY,new MatrixUtils.MatrixEvaluator(),startMatrix,endMatrix);
  final Matrix finalEndMatrix=endMatrix;
  AnimatorListenerAdapter listener=new AnimatorListenerAdapter(){
    private boolean mIsCanceled;
    private Matrix mTempMatrix=new Matrix();
    @Override public void onAnimationCancel(    Animator animation){
      mIsCanceled=true;
    }
    @Override public void onAnimationEnd(    Animator animation){
      if (!mIsCanceled) {
        if (handleParentChange && mUseOverlay) {
          setCurrentMatrix(finalEndMatrix);
        }
 else {
          view.setTag(R.id.transitionTransform,null);
          view.setTag(R.id.parentMatrix,null);
        }
      }
      ANIMATION_MATRIX_PROPERTY.set(view,null);
      transforms.restore(view);
    }
    @Override public void onAnimationPause(    Animator animation){
      ValueAnimator animator=(ValueAnimator)animation;
      Matrix currentMatrix=(Matrix)animator.getAnimatedValue();
      setCurrentMatrix(currentMatrix);
    }
    @Override public void onAnimationResume(    Animator animation){
      setIdentityTransforms(view);
    }
    private void setCurrentMatrix(    Matrix currentMatrix){
      mTempMatrix.set(currentMatrix);
      view.setTag(R.id.transitionTransform,mTempMatrix);
      transforms.restore(view);
    }
  }
;
  animator.addListener(listener);
  animator.addPauseListener(listener);
  return animator;
}