// Path: core/src/main/java/com/kaichunlin/transition/animation/Animation.java
// @UiThread
// public interface Animation {
// 
//     /**
//      * @param listener
//      */
//     void addAnimationListener(AnimationListener listener);
// 
//     /**
//      * @param listener
//      */
//     void removeAnimationListener(AnimationListener listener);
// 
//     /**
//      *
//      * @param duration Length of the animation.
//      */
//     void setDuration(@IntRange(from = 0) int duration);
// 
//     int getDuration();
// 
//     /**
//      *
//      * @param reverse If true, the animation will be played backward.
//      */
//     void setReverseAnimation(boolean reverse);
// 
//     /**
//      * @return true if {@link #setReverseAnimation(boolean)} has been set to true.
//      */
//     boolean isReverseAnimation();
// 
//     /**
//      * Starts the animation with the default duration (300 ms).
//      */
//     void startAnimation();
// 
//     /**
//      * Starts the animation with the specified duration.
//      *
//      * @param duration
//      */
//     void startAnimation(@IntRange(from = 0) int duration);
// 
//     /**
//      * Same as {@link #startAnimation()}, but with an added delay before the animation is started.
// 
//      * @param delay
//      */
//     void startAnimationDelayed(@IntRange(from = 0) int delay);
// 
//     /**
//      * Same as {@link #startAnimation(int)}, but with an added delay before the animation is started.
//      *
//      * @param duration
//      * @param delay
//      */
//     void startAnimationDelayed(@IntRange(from = 0) int duration, @IntRange(from = 0) int delay);
// 
//     /**
//      *
//      * @return Is the Animation in the started state.
//      */
//     boolean isAnimating();
// 
//     /**
//      * Cancels the animation, i.e. the affected Views will retain their current states but will no longer
//      * advance the animation. A canceled animation cannot be resumed.
//      */
//     void cancelAnimation();
// 
//     /**
//      * Pauses the animation, i.e. the affected Views will retain their current states but will no longer
//      * advance the animation. {@link #resumeAnimation()} can be called afterwards.
//      */
//     void pauseAnimation();
// 
//     /**
//      * Resumes the animation, i.e. the affected Views will continue the animations from the paused states.
//      */
//     void resumeAnimation();
// 
//     /**
//      * Ends the animation, i.e. the affected Views will be assigned their final states.
//      */
//     void endAnimation();
// 
//     /**
//      * Forces the animation's end state to be applied immediately even if the animation has not started.
//      * If the animation has started, it will end immediately, the effect would be the same as calling
//      * {@link #endAnimation()}.
//      */
//     void forceEndState();
// 
//     /**
//      * Stops the animation, i.e. the affected Views will be reverted to their original states at the
//      * beginning of the animation.
//      */
//     void resetAnimation();
// }
// 
// Path: core/src/main/java/com/kaichunlin/transition/animation/AnimationListener.java
// public interface AnimationListener {
//     /**
//      * Notifies the start of the animation.
//      *
//      * @param animation The started animation.
//      */
//     void onAnimationStart(Animation animation);
// 
//     /**
//      * Notifies the end of the animation; the affected Views have been assigned their final states.
//      *
//      * @param animation The animation which reached its end.
//      */
//     void onAnimationEnd(Animation animation);
// 
//     /**
//      * Notifies the cancellation of the animation; the affected Views retain the states assigned in the last animated frame.
//      *
//      * @param animation The animation which was cancelled.
//      */
//     void onAnimationCancel(Animation animation);
// 
//     /**
//      * Notifies the animation's been reset; the affected Views have been reverted to the states when the animation was started.
//      *
//      * @param animation The animation which was reset.
//      */
//     void onAnimationReset(Animation animation);
// }
// 
// Path: core/src/main/java/com/kaichunlin/transition/TransitionConfig.java
// public class TransitionConfig {
//     static boolean _debug;
//     static boolean _printDebug;
// 
//     /**
//      * @param debug set debugging
//      */
//     public static void setDebug(boolean debug) {
//         _debug = debug;
//     }
// 
//     /**
//      * @return is debugging enabled
//      */
//     public static boolean isDebug() {
//         return _debug;
//     }
// 
//     /**
//      * @param printDebug set auto printing transition detail messages on transition/animation end
//      */
//     public static void setPrintDebug(boolean printDebug) {
//         _printDebug = printDebug;
//     }
// 
//     /**
//      * @return is auto printing transition detail messages on transition/animation end enabled
//      */
//     public static boolean isPrintDebug() {
//         return _printDebug;
//     }
// }


import com.kaichunlin.transition.animation.Animation;
import com.kaichunlin.transition.animation.AnimationListener;
import com.kaichunlin.transition.TransitionConfig;
package com.kaichunlin.transition.internal.debug;


/**
 * Use Log.i to output the start and end of an animation
 */
public class TraceAnimationListener implements AnimationListener {
    private long mStart;

    @Override
// Path: core/src/main/java/com/kaichunlin/transition/animation/Animation.java
// @UiThread
// public interface Animation {
// 
//     /**
//      * @param listener
//      */
//     void addAnimationListener(AnimationListener listener);
// 
//     /**
//      * @param listener
//      */
//     void removeAnimationListener(AnimationListener listener);
// 
//     /**
//      *
//      * @param duration Length of the animation.
//      */
//     void setDuration(@IntRange(from = 0) int duration);
// 
//     int getDuration();
// 
//     /**
//      *
//      * @param reverse If true, the animation will be played backward.
//      */
//     void setReverseAnimation(boolean reverse);
// 
//     /**
//      * @return true if {@link #setReverseAnimation(boolean)} has been set to true.
//      */
//     boolean isReverseAnimation();
// 
//     /**
//      * Starts the animation with the default duration (300 ms).
//      */
//     void startAnimation();
// 
//     /**
//      * Starts the animation with the specified duration.
//      *
//      * @param duration
//      */
//     void startAnimation(@IntRange(from = 0) int duration);
// 
//     /**
//      * Same as {@link #startAnimation()}, but with an added delay before the animation is started.
// 
//      * @param delay
//      */
//     void startAnimationDelayed(@IntRange(from = 0) int delay);
// 
//     /**
//      * Same as {@link #startAnimation(int)}, but with an added delay before the animation is started.
//      *
//      * @param duration
//      * @param delay
//      */
//     void startAnimationDelayed(@IntRange(from = 0) int duration, @IntRange(from = 0) int delay);
// 
//     /**
//      *
//      * @return Is the Animation in the started state.
//      */
//     boolean isAnimating();
// 
//     /**
//      * Cancels the animation, i.e. the affected Views will retain their current states but will no longer
//      * advance the animation. A canceled animation cannot be resumed.
//      */
//     void cancelAnimation();
// 
//     /**
//      * Pauses the animation, i.e. the affected Views will retain their current states but will no longer
//      * advance the animation. {@link #resumeAnimation()} can be called afterwards.
//      */
//     void pauseAnimation();
// 
//     /**
//      * Resumes the animation, i.e. the affected Views will continue the animations from the paused states.
//      */
//     void resumeAnimation();
// 
//     /**
//      * Ends the animation, i.e. the affected Views will be assigned their final states.
//      */
//     void endAnimation();
// 
//     /**
//      * Forces the animation's end state to be applied immediately even if the animation has not started.
//      * If the animation has started, it will end immediately, the effect would be the same as calling
//      * {@link #endAnimation()}.
//      */
//     void forceEndState();
// 
//     /**
//      * Stops the animation, i.e. the affected Views will be reverted to their original states at the
//      * beginning of the animation.
//      */
//     void resetAnimation();
// }
// 
// Path: core/src/main/java/com/kaichunlin/transition/animation/AnimationListener.java
// public interface AnimationListener {
//     /**
//      * Notifies the start of the animation.
//      *
//      * @param animation The started animation.
//      */
//     void onAnimationStart(Animation animation);
// 
//     /**
//      * Notifies the end of the animation; the affected Views have been assigned their final states.
//      *
//      * @param animation The animation which reached its end.
//      */
//     void onAnimationEnd(Animation animation);
// 
//     /**
//      * Notifies the cancellation of the animation; the affected Views retain the states assigned in the last animated frame.
//      *
//      * @param animation The animation which was cancelled.
//      */
//     void onAnimationCancel(Animation animation);
// 
//     /**
//      * Notifies the animation's been reset; the affected Views have been reverted to the states when the animation was started.
//      *
//      * @param animation The animation which was reset.
//      */
//     void onAnimationReset(Animation animation);
// }
// 
// Path: core/src/main/java/com/kaichunlin/transition/TransitionConfig.java
// public class TransitionConfig {
//     static boolean _debug;
//     static boolean _printDebug;
// 
//     /**
//      * @param debug set debugging
//      */
//     public static void setDebug(boolean debug) {
//         _debug = debug;
//     }
// 
//     /**
//      * @return is debugging enabled
//      */
//     public static boolean isDebug() {
//         return _debug;
//     }
// 
//     /**
//      * @param printDebug set auto printing transition detail messages on transition/animation end
//      */
//     public static void setPrintDebug(boolean printDebug) {
//         _printDebug = printDebug;
//     }
// 
//     /**
//      * @return is auto printing transition detail messages on transition/animation end enabled
//      */
//     public static boolean isPrintDebug() {
//         return _printDebug;
//     }
// }


// Path: core/src/main/java/com/kaichunlin/transition/internal/debug/TraceAnimationListener.java
import com.kaichunlin.transition.animation.Animation;
import com.kaichunlin.transition.animation.AnimationListener;
import com.kaichunlin.transition.TransitionConfig;

package com.kaichunlin.transition.internal.debug;


/**
 * Use Log.i to output the start and end of an animation
 */
public class TraceAnimationListener implements AnimationListener {
    private long mStart;

    @Override
    public void onAnimationStart(Animation animationManager) {