1f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki/*
2f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * Copyright (C) 2016 The Android Open Source Project
3f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki *
4f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * Licensed under the Apache License, Version 2.0 (the "License");
5f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * you may not use this file except in compliance with the License.
6f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * You may obtain a copy of the License at
7f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki *
8f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki *      http://www.apache.org/licenses/LICENSE-2.0
9f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki *
10f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * Unless required by applicable law or agreed to in writing, software
11f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * distributed under the License is distributed on an "AS IS" BASIS,
12f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * See the License for the specific language governing permissions and
14f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * limitations under the License.
15f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki */
16f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.transition;
18f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
19f43e000b40282b9c270afb427a4e181526452f0aYuichi Arakiimport static org.hamcrest.core.Is.is;
20f43e000b40282b9c270afb427a4e181526452f0aYuichi Arakiimport static org.junit.Assert.assertThat;
21f43e000b40282b9c270afb427a4e181526452f0aYuichi Arakiimport static org.junit.Assert.fail;
22f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
23f43e000b40282b9c270afb427a4e181526452f0aYuichi Arakiimport android.graphics.Color;
24f43e000b40282b9c270afb427a4e181526452f0aYuichi Arakiimport android.support.test.annotation.UiThreadTest;
25e6cf359406cd7baaa0659b54c1b7d8ac45db122aAurimas Liutikasimport android.support.test.filters.LargeTest;
26f43e000b40282b9c270afb427a4e181526452f0aYuichi Arakiimport android.support.test.filters.MediumTest;
27f43e000b40282b9c270afb427a4e181526452f0aYuichi Arakiimport android.view.View;
28f43e000b40282b9c270afb427a4e181526452f0aYuichi Arakiimport android.widget.LinearLayout;
29f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
30f43e000b40282b9c270afb427a4e181526452f0aYuichi Arakiimport org.junit.Before;
31f43e000b40282b9c270afb427a4e181526452f0aYuichi Arakiimport org.junit.Test;
32f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
33f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki@MediumTest
34f43e000b40282b9c270afb427a4e181526452f0aYuichi Arakipublic class AutoTransitionTest extends BaseTest {
35f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
36f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    private LinearLayout mRoot;
37f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    private View mView0;
38f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    private View mView1;
39f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
40f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    @UiThreadTest
41f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    @Before
42f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    public void setUp() {
43f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        mRoot = (LinearLayout) rule.getActivity().getRoot();
44f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        mView0 = new View(rule.getActivity());
45f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        mView0.setBackgroundColor(Color.RED);
46f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        mRoot.addView(mView0, new LinearLayout.LayoutParams(100, 100));
47f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        mView1 = new View(rule.getActivity());
48f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        mView1.setBackgroundColor(Color.BLUE);
49f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        mRoot.addView(mView1, new LinearLayout.LayoutParams(100, 100));
50f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    }
51f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
52e6cf359406cd7baaa0659b54c1b7d8ac45db122aAurimas Liutikas    @LargeTest
53f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    @Test
54f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    public void testLayoutBetweenFadeAndChangeBounds() throws Throwable {
55f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        final LayoutCounter counter = new LayoutCounter();
56f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        rule.runOnUiThread(new Runnable() {
57f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            @Override
58f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            public void run() {
59f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki                assertThat(mView1.getY(), is(100.f));
60f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki                assertThat(mView0.getVisibility(), is(View.VISIBLE));
61f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki                mView1.addOnLayoutChangeListener(counter);
62f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            }
63f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        });
64f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        final SyncTransitionListener listener = new SyncTransitionListener(
65f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki                SyncTransitionListener.EVENT_END);
66f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        final Transition transition = new AutoTransition();
67f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        transition.addListener(listener);
68f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        rule.runOnUiThread(new Runnable() {
69f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            @Override
70f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            public void run() {
71f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki                TransitionManager.beginDelayedTransition(mRoot, transition);
72f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki                // This makes view0 fade out and causes view1 to move upwards.
73f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki                mView0.setVisibility(View.GONE);
74f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            }
75f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        });
76f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        assertThat("Timed out waiting for the TransitionListener",
77f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki                listener.await(), is(true));
78f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        assertThat(mView1.getY(), is(0.f));
79f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        assertThat(mView0.getVisibility(), is(View.GONE));
80f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        counter.reset();
81f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        listener.reset();
82f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        rule.runOnUiThread(new Runnable() {
83f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            @Override
84f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            public void run() {
85f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki                TransitionManager.beginDelayedTransition(mRoot, transition);
86f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki                // Revert
87f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki                mView0.setVisibility(View.VISIBLE);
88f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            }
89f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        });
90f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        assertThat("Timed out waiting for the TransitionListener",
91f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki                listener.await(), is(true));
92f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        assertThat(mView1.getY(), is(100.f));
93f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        assertThat(mView0.getVisibility(), is(View.VISIBLE));
94f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    }
95f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
96f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    private static class LayoutCounter implements View.OnLayoutChangeListener {
97f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
98f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        private int mCalledCount;
99f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
100f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        @Override
101f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        public void onLayoutChange(View v, int left, int top, int right, int bottom,
102f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki                int oldLeft, int oldTop, int oldRight, int oldBottom) {
103f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            mCalledCount++;
104f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            // There should not be more than one layout request to view1.
105f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            if (mCalledCount > 1) {
106f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki                fail("View layout happened too many times");
107f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            }
108f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        }
109f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
110f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        void reset() {
111f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            mCalledCount = 0;
112f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        }
113f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
114f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    }
115f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
116f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki}
117