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