package com.kaichunlin.transition.adapter; import android.support.annotation.IntRange; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.UiThread; import com.kaichunlin.transition.AbstractTransitionBuilder; import com.kaichunlin.transition.Transition; 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.AnimationManager; import java.util.List; /** * Allows the combination of both transition (through {@link TransitionAdapter}) and animation (through {@link AnimationManager}). */ @UiThread public class UnifiedAdapter extends AbstractAdapter implements Animation, TransitionManagerListener { private final TransitionAdapter mAdapter; private final AnimationManager mAnimationManager; private boolean mUpdateProgressAdapter = true; private boolean mUpdateAnimationAdapter = true; public UnifiedAdapter(@Nullable TransitionAdapter adapter) { this(adapter, new AnimationManager()); } /** * @param adapter its methods should not be called elsewhere * @param manager its methods should not be called elsewhere */ public UnifiedAdapter(@NonNull TransitionAdapter adapter, @NonNull AnimationManager manager) { super(adapter == null ? new AdapterState() : adapter.getAdapterState()); mAdapter = adapter; getAdapter().addTransitionListener(this); mAnimationManager = manager; } @Nullable protected TransitionAdapter getAdapter() { return mAdapter; } @Override public void addTransition(@NonNull AbstractTransitionBuilder builder) { invalidateTransitions(); super.addTransition(builder); } @Override public void addTransition(@NonNull Transition transition) { invalidateTransitions(); super.addTransition(transition); } @Override public void addAllTransitions(@NonNull List<Transition> transitionsList) { invalidateTransitions(); super.addAllTransitions(transitionsList); } @Override public boolean removeTransition(@NonNull Transition transition) { invalidateTransitions(); return super.removeTransition(transition); } @Override public void removeAllTransitions() { invalidateTransitions(); super.removeAllTransitions(); } private void invalidateTransitions() { mUpdateProgressAdapter = true; mUpdateAnimationAdapter = true; } @Override public boolean startTransition(float progress) { cancelAnimation(); if (mUpdateProgressAdapter) { getAdapter().removeAllTransitions(); getAdapter().addAllTransitions(getTransitions()); mUpdateProgressAdapter = false; } return getAdapter().startTransition(progress); } @Override public void updateProgress(float value) { getAdapter().updateProgress(value); } @Override public void stopTransition() { if (mAdapter == null) { super.stopTransition(); } else { mAdapter.stopTransition(); } } public void addTransitionListener(TransitionManagerListener listener) { super.addTransitionListener(listener); if (mAdapter != null) { mAdapter.addTransitionListener(this); } } public void removeTransitionListener(TransitionManagerListener listener) { super.removeTransitionListener(listener); if (mAdapter != null) { mAdapter.removeTransitionListener(this); } } @Override public void onTransitionStart(TransitionManager manager) { if (mUpdateProgressAdapter) { getAdapter().removeAllTransitions(); getAdapter().addAllTransitions(getTransitions()); mUpdateProgressAdapter = false; } notifyTransitionStart(); } @Override public void onTransitionEnd(TransitionManager manager) { notifyTransitionEnd(); } @Override public void addAnimationListener(AnimationListener listener) { mAnimationManager.addAnimationListener(listener); } @Override public void removeAnimationListener(AnimationListener listener) { mAnimationManager.removeAnimationListener(listener); } @Override public void setDuration(@IntRange(from = 0) int duration) { mAnimationManager.setDuration(duration); } @Override public int getDuration() { return mAnimationManager.getDuration(); } @Override public void setReverseAnimation(boolean reverse) { mAnimationManager.setReverseAnimation(reverse); } @Override public boolean isReverseAnimation() { return mAnimationManager.isReverseAnimation(); } private void startAnimation(boolean setDuration, int duration) { cancelAnimation(); if (mUpdateAnimationAdapter) { mAnimationManager.removeAllAnimations(); mAnimationManager.addAllTransitions(getTransitions()); mUpdateAnimationAdapter = false; } if(setDuration) { mAnimationManager.startAnimation(duration); } else { mAnimationManager.startAnimation(); } } @Override public void startAnimation() { startAnimation(false, -1); } @Override public void startAnimation(@IntRange(from = 0) int duration) { startAnimation(true, duration); } public void startAnimationDelayed(@IntRange(from = 0) int delay) { mAnimationManager.startAnimationDelayed(delay); } public void startAnimationDelayed(@IntRange(from = 0) final int duration, @IntRange(from = 0) int delay) { mAnimationManager.startAnimationDelayed(duration, delay); } public boolean isAnimating() { return mAnimationManager.isAnimating(); } @Override public void cancelAnimation() { mAnimationManager.cancelAnimation(); } @Override public void pauseAnimation() { mAnimationManager.pauseAnimation(); } @Override public void resumeAnimation() { mAnimationManager.resumeAnimation(); } @Override public void endAnimation() { mAnimationManager.endAnimation(); } @Override public void forceEndState() { mAnimationManager.forceEndState(); } @Override public void resetAnimation() { mAnimationManager.resetAnimation(); } }