• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package android.animation.cts;
17 
18 import java.util.Iterator;
19 import java.util.LinkedList;
20 import java.util.List;
21 
22 import android.animation.cts.R;
23 
24 import android.animation.Animator;
25 import android.animation.LayoutTransition;
26 import android.animation.LayoutTransition.TransitionListener;
27 import android.animation.ObjectAnimator;
28 import android.animation.PropertyValuesHolder;
29 import android.animation.TimeInterpolator;
30 import android.test.ActivityInstrumentationTestCase2;
31 import android.view.View;
32 import android.view.ViewGroup;
33 import android.view.animation.AccelerateInterpolator;
34 import android.widget.Button;
35 import android.widget.LinearLayout;
36 
37 public class LayoutAnimationTest extends
38         ActivityInstrumentationTestCase2<LayoutAnimationActivity> {
39     private LayoutAnimationActivity mActivity;
40     private MyLayoutTransition mLayoutTransition;
41     private LinearLayout mView;
42     private Button mButton;
43 
LayoutAnimationTest()44     public LayoutAnimationTest() {
45         super(LayoutAnimationActivity.class);
46     }
47 
setUp()48     public void setUp() throws Exception {
49         super.setUp();
50         setActivityInitialTouchMode(true);
51         mActivity = getActivity();
52         mView = (LinearLayout) mActivity.findViewById(R.id.container);
53         mButton = (Button)mActivity.findViewById(R.id.button1);
54         mLayoutTransition = new MyLayoutTransition();
55     }
56 
testAddTransitionListener()57     public void testAddTransitionListener() throws Throwable {
58         MyTransitionListener listener = new MyTransitionListener();
59         assertNull(mLayoutTransition.getTransitionListeners());
60         mLayoutTransition.addTransitionListener(listener);
61 
62         List<TransitionListener> layoutTransitionList = mLayoutTransition.getTransitionListeners();
63         TransitionListener actualListener = layoutTransitionList.get(0);
64         assertEquals(1, layoutTransitionList.size());
65         assertEquals(listener, actualListener);
66     }
67 
testIsRunning()68     public void testIsRunning() throws Throwable {
69         setDefaultTransition();
70         assertFalse(mLayoutTransition.isRunning());
71         clickButton();
72         assertTrue(mLayoutTransition.isRunning());
73     }
74 
testIsChangingLayout()75     public void testIsChangingLayout() throws Throwable {
76         long duration = 2000l;
77         mView.setLayoutTransition(mLayoutTransition);
78         mLayoutTransition.setDuration(duration);
79         mLayoutTransition.setInterpolator(LayoutTransition.CHANGE_APPEARING,
80                 new AccelerateInterpolator());
81 
82         assertFalse(mLayoutTransition.isChangingLayout());
83         clickButton();
84         assertTrue(mLayoutTransition.isChangingLayout());
85     }
86 
testSetDuration()87     public void testSetDuration() {
88         long duration = 1000l;
89         mLayoutTransition.setDuration(duration);
90 
91         assertEquals(duration, mLayoutTransition.getDuration(LayoutTransition.APPEARING));
92         assertEquals(duration, mLayoutTransition.getDuration(LayoutTransition.CHANGE_APPEARING));
93         assertEquals(duration,
94                      mLayoutTransition.getDuration(LayoutTransition.CHANGE_DISAPPEARING));
95         assertEquals(duration, mLayoutTransition.getDuration(LayoutTransition.DISAPPEARING));
96     }
97 
testSetDurationForTransitionType()98     public void testSetDurationForTransitionType() {
99         long duration = 1000l;
100         mLayoutTransition.setDuration(LayoutTransition.APPEARING, duration);
101         assertEquals(duration, mLayoutTransition.getDuration(LayoutTransition.APPEARING));
102     }
103 
testSetInterpolator()104     public void testSetInterpolator() {
105         TimeInterpolator interpolator = new AccelerateInterpolator();
106         mLayoutTransition.setInterpolator(LayoutTransition.APPEARING, interpolator);
107         assertEquals(interpolator, mLayoutTransition.getInterpolator(
108                 LayoutTransition.APPEARING));
109     }
110 
testSetAnimator()111     public void testSetAnimator() {
112         float startAlpha = 0.0f;
113         float endAlpha = 0.5f;
114         PropertyValuesHolder pvhAlpha = PropertyValuesHolder.ofFloat("alpha", startAlpha,
115                 endAlpha);
116         ObjectAnimator appearingAnimator =  (ObjectAnimator) ObjectAnimator.ofPropertyValuesHolder(
117                 (Object)null, pvhAlpha);
118         appearingAnimator.setInterpolator(new AccelerateInterpolator());
119         mLayoutTransition.setAnimator(LayoutTransition.APPEARING, appearingAnimator);
120         assertEquals(appearingAnimator, mLayoutTransition.getAnimator(LayoutTransition.APPEARING));
121     }
122 
testAnimationWithAnimator()123     public void testAnimationWithAnimator() throws Throwable {
124         MyTransitionListener listener = new MyTransitionListener();
125         mLayoutTransition.addTransitionListener(listener);
126         mLayoutTransition.setAnimateParentHierarchy(false);
127         long duration = 2000;
128         mView.setLayoutTransition(mLayoutTransition);
129         mLayoutTransition.setDuration(duration);
130         float startAlpha = 0.0f;
131         float endAlpha = 0.5f;
132         PropertyValuesHolder pvhAlpha = PropertyValuesHolder.ofFloat("alpha", startAlpha,
133                 endAlpha);
134         ObjectAnimator appearingAnimator =  (ObjectAnimator) ObjectAnimator.ofPropertyValuesHolder(
135                 (Object)null, pvhAlpha);
136         appearingAnimator.setInterpolator(new AccelerateInterpolator());
137 
138         mLayoutTransition.setAnimator(LayoutTransition.APPEARING, appearingAnimator);
139 
140         List<Float> alphaList = new LinkedList<Float>();
141         clickButton();
142         while(listener.mTransition) {
143             float alpha = mActivity.getLastButton().getAlpha();
144             alphaList.add(alpha);
145             Thread.sleep(200);
146         }
147         Iterator<Float> iterator = alphaList.iterator();
148         float lastValue = 0.0f;
149         while(iterator.hasNext()){
150             float alphaValue = iterator.next();
151             assertTrue(alphaValue >= lastValue);
152             assertTrue(alphaValue >= startAlpha);
153             assertTrue(alphaValue <= endAlpha);
154             lastValue = alphaValue;
155         }
156     }
157 
testStartDelay()158     public void testStartDelay() {
159         long delay = 100l;
160         int transitionType = LayoutTransition.APPEARING;
161         mLayoutTransition.setStartDelay(transitionType, delay);
162         assertEquals(delay, mLayoutTransition.getStartDelay(transitionType));
163     }
164 
testSetStagger()165     public void testSetStagger() {
166         long duration = 100;
167         int transitionType = LayoutTransition.CHANGE_APPEARING;
168         mLayoutTransition.setStagger(transitionType, duration);
169         assertEquals(duration, mLayoutTransition.getStagger(transitionType));
170     }
171 
setDefaultTransition()172     private void setDefaultTransition() {
173         long duration = 1000;
174         mView.setLayoutTransition(mLayoutTransition);
175         mLayoutTransition.setDuration(duration);
176         mLayoutTransition.setInterpolator(LayoutTransition.APPEARING,
177                 new AccelerateInterpolator());
178     }
179 
clickButton()180     private void clickButton() throws Throwable {
181         runTestOnUiThread(new Runnable() {
182             public void run() {
183                 mButton.callOnClick();
184             }
185         });
186         getInstrumentation().waitForIdleSync();
187     }
188 
189     class MyTransitionListener implements LayoutTransition.TransitionListener {
190         ViewGroup mContainer;
191         View mView;
192         int mTransitionType;
193         boolean mTransition = false;
endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType)194         public void endTransition(LayoutTransition transition,
195                 ViewGroup container, View view, int transitionType) {
196             this.mContainer = container;
197             this.mView = view;
198             this.mTransitionType = transitionType;
199             mTransition = false;
200         }
201 
startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType)202         public void startTransition(LayoutTransition transition,
203                 ViewGroup container, View view, int transitionType) {
204             this.mContainer = container;
205             this.mView = view;
206             this.mTransitionType = transitionType;
207             mTransition = true;
208         }
209     }
210 
211     class MyLayoutTransition extends LayoutTransition {
212         boolean mAddChild = false;
213         boolean mHideChild = false;
214         boolean mRemoveChild = false;
215         boolean mShowChild = false;
216         boolean mSetAnimator = false;
217         boolean mRemoveListener = false;
218         boolean isChangingLayout = false;
219 
220         @Override
addChild(ViewGroup parent, View child)221         public void addChild(ViewGroup parent, View child) {
222             super.addChild(parent, child);
223             mAddChild = true;
224         }
225 
226         @Override
hideChild(ViewGroup parent, View child)227         public void hideChild(ViewGroup parent, View child) {
228             super.hideChild(parent, child);
229             mHideChild = true;
230         }
231 
232         @Override
isChangingLayout()233         public boolean isChangingLayout() {
234             return super.isChangingLayout();
235         }
236 
237         @Override
isRunning()238         public boolean isRunning() {
239             isChangingLayout =  true;
240             return super.isRunning();
241         }
242 
243         @Override
removeChild(ViewGroup parent, View child)244         public void removeChild(ViewGroup parent, View child) {
245             super.removeChild(parent, child);
246             mRemoveChild = true;
247         }
248 
249         @Override
removeTransitionListener(TransitionListener listener)250         public void removeTransitionListener(TransitionListener listener) {
251             super.removeTransitionListener(listener);
252             mRemoveListener = true;
253         }
254 
255         @Override
setAnimator(int transitionType, Animator animator)256         public void setAnimator(int transitionType, Animator animator) {
257             super.setAnimator(transitionType, animator);
258             mSetAnimator = true;
259         }
260 
261         @Override
showChild(ViewGroup parent, View child)262         public void showChild(ViewGroup parent, View child) {
263             super.showChild(parent, child);
264             mShowChild = true;
265         }
266     }
267 }
268 
269