1fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase/*
2fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase * Copyright (C) 2016 The Android Open Source Project
3fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase *
4fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase * Licensed under the Apache License, Version 2.0 (the "License");
5fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase * you may not use this file except in compliance with the License.
6fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase * You may obtain a copy of the License at
7fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase *
8fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase *      http://www.apache.org/licenses/LICENSE-2.0
9fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase *
10fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase * Unless required by applicable law or agreed to in writing, software
11fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase * distributed under the License is distributed on an "AS IS" BASIS,
12fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase * See the License for the specific language governing permissions and
14fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase * limitations under the License.
15fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase */
16fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase
17fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haasepackage android.support.v4.view;
18fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase
19fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haaseimport android.app.Activity;
20f5ec4487510a0e7226636704860a884f4c1d0ab6Kirill Grouchnikovimport android.support.compat.test.R;
21fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haaseimport android.support.test.InstrumentationRegistry;
22fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haaseimport android.support.v4.BaseInstrumentationTestCase;
23fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haaseimport android.test.suitebuilder.annotation.MediumTest;
24fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haaseimport android.view.View;
25fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase
26fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haaseimport java.util.concurrent.CountDownLatch;
27fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haaseimport java.util.concurrent.TimeUnit;
28fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase
29fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haaseimport org.junit.Before;
30fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haaseimport org.junit.Test;
31fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haaseimport static org.junit.Assert.assertEquals;
32fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haaseimport static org.junit.Assert.assertTrue;
33fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase
34881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov@MediumTest
35fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haasepublic class ViewPropertyAnimatorCompatTest extends BaseInstrumentationTestCase<VpaActivity> {
36fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase
37d1a4e6d0a1ac83ad51563044059cbe75ed7b15c6Aurimas Liutikas    private static final int WAIT_TIMEOUT_MS = 200;
38d1a4e6d0a1ac83ad51563044059cbe75ed7b15c6Aurimas Liutikas
39fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase    private View mView;
40fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase    private int mNumListenerCalls = 0;
41fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase
42fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase    public ViewPropertyAnimatorCompatTest() {
43fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        super(VpaActivity.class);
44fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase    }
45fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase
46fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase    @Before
47881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov    public void setUp() {
48fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        final Activity activity = mActivityTestRule.getActivity();
49fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        mView = activity.findViewById(R.id.view);
50fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase    }
51fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase
52fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase    @Test
53fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase    public void testWithEndAction() throws Throwable {
54fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        final CountDownLatch latch1 = new CountDownLatch(1);
55fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
56fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase            @Override
57fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase            public void run() {
58fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                ViewCompat.animate(mView).alpha(0).setDuration(100).withEndAction(new Runnable() {
59fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                    @Override
60fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                    public void run() {
61fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                        latch1.countDown();
62fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                    }
63fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                });
64fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase            }
65fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        });
66fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        assertTrue(latch1.await(300, TimeUnit.MILLISECONDS));
67fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase
68fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        // This test ensures that the endAction listener will be called exactly once
69fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        mNumListenerCalls = 0;
70fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        final CountDownLatch latch2 = new CountDownLatch(1);
71fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
72fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase            @Override
73fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase            public void run() {
74fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                ViewCompat.animate(mView).alpha(0).setDuration(50).withEndAction(new Runnable() {
75fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                    @Override
76fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                    public void run() {
77fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                        ++mNumListenerCalls;
78fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                        ViewCompat.animate(mView).alpha(1);
79fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                        latch2.countDown();
80fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                    }
81fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                });
82fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase            }
83fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        });
84fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        assertTrue(latch2.await(200, TimeUnit.MILLISECONDS));
85d1a4e6d0a1ac83ad51563044059cbe75ed7b15c6Aurimas Liutikas        waitAndCheckCallCount(1);
86fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase    }
87fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase
88fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase    @Test
89fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase    public void testWithStartAction() throws Throwable {
90fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        final CountDownLatch latch1 = new CountDownLatch(1);
91fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
92fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase            @Override
93fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase            public void run() {
94fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                ViewCompat.animate(mView).alpha(0).setDuration(100).withStartAction(new Runnable() {
95fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                    @Override
96fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                    public void run() {
97fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                        latch1.countDown();
98fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                    }
99fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                });
100fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase            }
101fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        });
102fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        assertTrue(latch1.await(100, TimeUnit.MILLISECONDS));
103fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase
104fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        // This test ensures that the startAction listener will be called exactly once
105fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        mNumListenerCalls = 0;
106fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        final CountDownLatch latch2 = new CountDownLatch(1);
107fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
108fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase            @Override
109fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase            public void run() {
110fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                ViewCompat.animate(mView).alpha(0).setDuration(50).withStartAction(new Runnable() {
111fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                    @Override
112fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                    public void run() {
113fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                        ++mNumListenerCalls;
114fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                        ViewCompat.animate(mView).alpha(1);
115fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                        latch2.countDown();
116fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                    }
117fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                });
118fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase            }
119fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        });
120fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase        assertTrue(latch2.await(200, TimeUnit.MILLISECONDS));
121d1a4e6d0a1ac83ad51563044059cbe75ed7b15c6Aurimas Liutikas        waitAndCheckCallCount(1);
122d1a4e6d0a1ac83ad51563044059cbe75ed7b15c6Aurimas Liutikas    }
123d1a4e6d0a1ac83ad51563044059cbe75ed7b15c6Aurimas Liutikas
124d1a4e6d0a1ac83ad51563044059cbe75ed7b15c6Aurimas Liutikas    void waitAndCheckCallCount(final int count) throws InterruptedException {
125d1a4e6d0a1ac83ad51563044059cbe75ed7b15c6Aurimas Liutikas        int timeLeft = WAIT_TIMEOUT_MS;
126d1a4e6d0a1ac83ad51563044059cbe75ed7b15c6Aurimas Liutikas        while (mNumListenerCalls != count) {
127d1a4e6d0a1ac83ad51563044059cbe75ed7b15c6Aurimas Liutikas            Thread.sleep(20);
128d1a4e6d0a1ac83ad51563044059cbe75ed7b15c6Aurimas Liutikas            timeLeft -= 20;
129d1a4e6d0a1ac83ad51563044059cbe75ed7b15c6Aurimas Liutikas            assertTrue(timeLeft > 0);
130d1a4e6d0a1ac83ad51563044059cbe75ed7b15c6Aurimas Liutikas        }
131fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase    }
132fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase}
133