package com.fsck.k9.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ViewAnimator;
import com.fsck.k9.R;
/** This view extends the common ViewAnimator, allowing different sets of animations
* for increasing and decreasing the displayed child.
*/
public class LinearViewAnimator extends ViewAnimator {
private Animation upInAnimation;
private Animation upOutAnimation;
private Animation downInAnimation;
private Animation downOutAnimation;
public LinearViewAnimator(Context context) {
super(context);
}
public LinearViewAnimator(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
@SuppressWarnings("UnusedParameters")
public LinearViewAnimator(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.LinearViewAnimator);
int resource = a.getResourceId(R.styleable.LinearViewAnimator_downInAnimation, 0);
if (resource > 0) {
setDownInAnimation(context, resource);
}
resource = a.getResourceId(R.styleable.LinearViewAnimator_downOutAnimation, 0);
if (resource > 0) {
setDownOutAnimation(context, resource);
}
resource = a.getResourceId(R.styleable.LinearViewAnimator_upInAnimation, 0);
if (resource > 0) {
setUpInAnimation(context, resource);
}
resource = a.getResourceId(R.styleable.LinearViewAnimator_upOutAnimation, 0);
if (resource > 0) {
setUpOutAnimation(context, resource);
}
a.recycle();
}
public void setUpOutAnimation(Context context, int resourceID) {
setUpOutAnimation(AnimationUtils.loadAnimation(context, resourceID));
}
public void setUpOutAnimation(Animation animation) {
upOutAnimation = animation;
}
public void setUpInAnimation(Context context, int resourceID) {
setUpInAnimation(AnimationUtils.loadAnimation(context, resourceID));
}
public void setUpInAnimation(Animation animation) {
upInAnimation = animation;
}
public void setDownOutAnimation(Context context, int resourceID) {
setDownOutAnimation(AnimationUtils.loadAnimation(context, resourceID));
}
public void setDownOutAnimation(Animation animation) {
downOutAnimation = animation;
}
public void setDownInAnimation(Context context, int resourceID) {
setDownInAnimation(AnimationUtils.loadAnimation(context, resourceID));
}
public void setDownInAnimation(Animation animation) {
downInAnimation = animation;
}
@Override
public void setDisplayedChild(int whichChild) {
setDisplayedChild(whichChild, true);
}
public void setDisplayedChild(int whichChild, boolean animate) {
int displayedChild = getDisplayedChild();
if (displayedChild == whichChild) {
return;
}
if (!animate) {
setInAnimation(null);
setOutAnimation(null);
} else if (displayedChild < whichChild) {
setInAnimation(downInAnimation);
setOutAnimation(downOutAnimation);
} else {
setInAnimation(upInAnimation);
setOutAnimation(upOutAnimation);
}
super.setDisplayedChild(whichChild);
}
}