package com.kaichunlin.transition.adapter; import android.support.annotation.IntRange; import android.support.annotation.Nullable; import android.support.annotation.UiThread; import com.kaichunlin.transition.TransitionManagerListener; import com.kaichunlin.transition.TransitionManager; import com.kaichunlin.transition.animation.Animation; import com.kaichunlin.transition.animation.AnimationListener; import com.kaichunlin.transition.animation.TransitionAnimation; /** * This adapter integrates traditional animations using the same methods and logic as the rest of the framework. It can be configured * to reuse transitions configured for another {@link AbstractAdapter} so transition effects can be easily shared between progress-based * adapters and time-based adapters. * <br> * However it must be noted that when AnimationAdapter reuses transitions configured for another {@link AbstractAdapter}, any changes made * to the other {@link AbstractAdapter} may effect AnimationAdapter and cause strange errors. For more complex case, {@link UnifiedAdapter} * should be used instead. */ @UiThread public class AnimationAdapter extends AbstractAdapter implements Animation, TransitionManagerListener { private final TransitionAdapter mAdapter; private Animation mAnimation; public AnimationAdapter() { this(null); } /** * Wraps an existing {@link AbstractAdapter} to reuse its onCreateOptionsMenu(...) logic and its transition effects * * @param adapter */ public AnimationAdapter(@Nullable TransitionAdapter adapter) { super(adapter == null ? new AdapterState() : adapter.getAdapterState()); mAdapter = adapter; mAnimation = new TransitionAnimation(mAdapter == null ? this : mAdapter); } @Override public void addTransitionListener(TransitionManagerListener listener) { super.addTransitionListener(listener); if (mAdapter != null) { mAdapter.addTransitionListener(this); } } @Override public void removeTransitionListener(TransitionManagerListener listener) { super.removeTransitionListener(listener); if (mAdapter != null) { mAdapter.removeTransitionListener(this); } } @Override public void addAnimationListener(AnimationListener animationListener) { } @Override public void removeAnimationListener(AnimationListener animationListener) { } @Override public void onTransitionStart(TransitionManager manager) { notifyTransitionStart(); } @Override public void onTransitionEnd(TransitionManager manager) { notifyTransitionEnd(); } @Override public void setDuration(@IntRange(from = 0) int duration) { mAnimation.setDuration(duration); } @Override public int getDuration() { return mAnimation.getDuration(); } @Override public void setReverseAnimation(boolean reverse) { mAnimation.setReverseAnimation(reverse); } @Override public boolean isReverseAnimation() { return mAnimation.isReverseAnimation(); } @Override public void startAnimation() { mAnimation.startAnimation(); } @Override public void startAnimation(@IntRange(from = 0) int duration) { mAnimation.startAnimation(duration); } public void startAnimationDelayed(@IntRange(from = 0) int delay) { mAnimation.startAnimationDelayed(delay); } public void startAnimationDelayed(@IntRange(from = 0) final int duration, @IntRange(from = 0) int delay) { mAnimation.startAnimationDelayed(duration, delay); } public boolean isAnimating() { return mAnimation.isAnimating(); } @Override public void cancelAnimation() { mAnimation.cancelAnimation(); } @Override public void pauseAnimation() { mAnimation.pauseAnimation(); } @Override public void resumeAnimation() { mAnimation.resumeAnimation(); } @Override public void endAnimation() { mAnimation.endAnimation(); } @Override public void forceEndState() { mAnimation.forceEndState(); } @Override public void resetAnimation() { mAnimation.resetAnimation(); } @Override public void stopTransition() { if (mAdapter == null) { super.stopTransition(); } else { mAdapter.stopTransition(); } } @Nullable protected TransitionAdapter getAdapter() { return mAdapter; } }