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