Skip to content

Commit

Permalink
add unit test and builder for animation behavior
Browse files Browse the repository at this point in the history
  • Loading branch information
zoonooz committed Jan 5, 2018
1 parent ca2e4ea commit 10eb3ca
Show file tree
Hide file tree
Showing 3 changed files with 145 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import android.content.Context;
import android.content.res.TypedArray;
import android.support.annotation.AnimRes;
import android.support.design.widget.CoordinatorLayout;
import android.util.AttributeSet;
import android.view.View;
Expand All @@ -11,30 +12,37 @@

/**
* Created by zoonooz on 5/1/2018 AD.
* Behavior use with animation XML
* Behavior use with {@link Animation}
*/
public class AnimationViewBehavior extends PercentageViewBehavior<View> {

private int mAnimationId;
private Animation mAnimation;
private BehaviorAnimation mTransformAnimation;

public AnimationViewBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.EasyCoordinatorView);
mAnimationId = a.getResourceId(R.styleable.EasyCoordinatorView_animation, 0);
int animationId = a.getResourceId(R.styleable.EasyCoordinatorView_animation, 0);
a.recycle();

if (animationId != 0) {
mAnimation = AnimationUtils.loadAnimation(context, animationId);
}
}

private AnimationViewBehavior(Builder builder) {
super(builder);
mAnimation = builder.animation;
}

@Override
void prepare(CoordinatorLayout parent, View child, View dependency) {
super.prepare(parent, child, dependency);

// if there is animation id, load it and initialize
if (mAnimationId != 0) {
mAnimation = AnimationUtils.loadAnimation(child.getContext(), mAnimationId);
if (mAnimation != null) {
mAnimation.initialize(child.getWidth(), child.getHeight(), parent.getWidth(), parent.getHeight());
mAnimation.setStartTime(0);
mAnimation.setDuration(1000);
}
}

Expand Down Expand Up @@ -79,4 +87,33 @@ void setTransformation(Transformation transformation) {
this.mTransformation = transformation;
}
}

/**
* Builder
*/
public static class Builder extends PercentageViewBehavior.Builder<Builder> {

private Animation animation;

@Override
Builder getThis() {
return this;
}

public Builder animation(Animation animation) {
this.animation = animation;
return this;
}

public Builder animationId(Context context, @AnimRes int animationId) {
if (animationId != 0) {
this.animation = AnimationUtils.loadAnimation(context, animationId);
}
return this;
}

public AnimationViewBehavior build() {
return new AnimationViewBehavior(this);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.zoonref.viewbehavior;

import android.app.Activity;
import android.support.design.widget.CoordinatorLayout;
import android.view.View;
import android.view.animation.ScaleAnimation;

import com.zoonref.viewbehavior.shadow.ShadowAnimation;

import static junit.framework.Assert.*;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.shadow.api.Shadow;

/**
* Created by zoonooz on 6/1/2018 AD.
* Test {@link AnimationViewBehavior}
*/
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowAnimation.class})
public class AnimationViewBehaviorTest {

private CoordinatorLayout coordinatorLayout;
private View firstView;
private View secondView;

@Before
public void setup() {
Activity activity = Robolectric.setupActivity(Activity.class);
activity.setTheme(R.style.Theme_AppCompat);
coordinatorLayout = new CoordinatorLayout(activity);
activity.setContentView(coordinatorLayout);
firstView = new View(activity);
secondView = new View(activity);

CoordinatorLayout.LayoutParams params = new CoordinatorLayout.LayoutParams(320, 200);
coordinatorLayout.addView(firstView, params);
coordinatorLayout.addView(secondView, params);
}

@Test
public void animations() {
ScaleAnimation animation = new ScaleAnimation(1f, 0f, 1f, 0f);
AnimationViewBehavior behavior = new AnimationViewBehavior.Builder()
.dependsOn(firstView.getId(), SimpleViewBehavior.DEPEND_TYPE_Y)
.targetValue(100)
.animation(animation)
.build();

CoordinatorLayout.LayoutParams params = new CoordinatorLayout.LayoutParams(320, 200);
params.setBehavior(behavior);
secondView.setLayoutParams(params);

ShadowAnimation shadowAnimation = Shadow.extract(animation);

firstView.setY(50);
coordinatorLayout.requestLayout();
assertEquals(500L, shadowAnimation.getLastTimeGetTransform());

firstView.setY(100);
coordinatorLayout.requestLayout();
assertEquals(1000L, shadowAnimation.getLastTimeGetTransform());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.zoonref.viewbehavior.shadow;

import android.view.animation.Animation;
import android.view.animation.Transformation;

import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.RealObject;
import org.robolectric.shadow.api.Shadow;

/**
* Created by zoonooz on 6/1/2018 AD.
* Custom Robolectric shadow for Animation
*/
@Implements(Animation.class)
public class ShadowAnimation {

@RealObject
private Animation realAnimation;

// save the time of the last getTransformation() for test
private long lastTimeGetTransform;

@Implementation
public boolean getTransformation(long currentTime, Transformation outTransformation) {
lastTimeGetTransform = currentTime;
return Shadow.directlyOn(realAnimation, Animation.class).getTransformation(currentTime, outTransformation);
}

public long getLastTimeGetTransform() {
return lastTimeGetTransform;
}
}

0 comments on commit 10eb3ca

Please sign in to comment.