1f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richardpackage com.xtremelabs.robolectric.shadows;
2f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
3f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richardimport android.view.ViewTreeObserver;
4f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richardimport com.xtremelabs.robolectric.Robolectric;
5f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richardimport com.xtremelabs.robolectric.WithTestDefaultsRunner;
6f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richardimport org.junit.Before;
7f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richardimport org.junit.Test;
8f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richardimport org.junit.runner.RunWith;
9f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
10f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richardimport java.util.List;
11f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
12f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richardimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
13f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richardimport static org.junit.Assert.assertFalse;
14f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richardimport static org.junit.Assert.assertTrue;
15f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
16f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard@RunWith(WithTestDefaultsRunner.class)
17f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richardpublic class ViewTreeObserverTest {
18f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
19f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    private ViewTreeObserver viewTreeObserver;
20f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    private TestOnGlobalLayoutListener listener1;
21f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    private TestOnGlobalLayoutListener listener2;
22f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
23f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    @Before
24f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    public void setUp() throws Exception {
25f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        viewTreeObserver = Robolectric.Reflection.newInstanceOf(ViewTreeObserver.class);
26f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        listener1 = new TestOnGlobalLayoutListener();
27f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        listener2 = new TestOnGlobalLayoutListener();
28f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    }
29f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
30f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    @Test
31f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    public void shouldRecordMultipleOnGlobalLayoutListenersAndFireThemWhenAsked() throws Exception {
32f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        viewTreeObserver.addOnGlobalLayoutListener(listener1);
33f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        viewTreeObserver.addOnGlobalLayoutListener(listener2);
34f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
35f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        shadowOf(viewTreeObserver).fireOnGlobalLayoutListeners();
36f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        assertTrue(listener1.onGlobalLayoutWasCalled);
37f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        assertTrue(listener2.onGlobalLayoutWasCalled);
38f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
39f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        listener1.reset();
40f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        listener2.reset();
41f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        viewTreeObserver.removeGlobalOnLayoutListener(listener1);
42f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        shadowOf(viewTreeObserver).fireOnGlobalLayoutListeners();
43f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
44f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        assertFalse(listener1.onGlobalLayoutWasCalled);
45f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        assertTrue(listener2.onGlobalLayoutWasCalled);
46f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
47f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        listener1.reset();
48f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        listener2.reset();
49f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        viewTreeObserver.removeGlobalOnLayoutListener(listener2);
50f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        shadowOf(viewTreeObserver).fireOnGlobalLayoutListeners();
51f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
52f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        assertFalse(listener1.onGlobalLayoutWasCalled);
53f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        assertFalse(listener2.onGlobalLayoutWasCalled);
54f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    }
55f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
56f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    @Test
57f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    public void getGlobalLayoutListeners_shouldReturnTheListeners() throws Exception {
58f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        viewTreeObserver.addOnGlobalLayoutListener(listener1);
59f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        viewTreeObserver.addOnGlobalLayoutListener(listener2);
60f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
61f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        List<ViewTreeObserver.OnGlobalLayoutListener> listeners = shadowOf(viewTreeObserver).getOnGlobalLayoutListeners();
62f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        assertTrue(listeners.size() == 2);
63f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        assertTrue(listeners.contains(listener1));
64f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        assertTrue(listeners.contains(listener2));
65f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    }
66f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
67f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    private static class TestOnGlobalLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener {
68f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        boolean onGlobalLayoutWasCalled;
69f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
70f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        @Override
71f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        public void onGlobalLayout() {
72f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard            onGlobalLayoutWasCalled = true;
73f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        }
74f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
75f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        public void reset() {
76f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard            onGlobalLayoutWasCalled = false;
77f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        }
78f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    }
79f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard}
80