Stop measure/layout on GONE views in CoordinatorLayout
Test: included and passes on 10-24
BUG: 32713682
Change-Id: Ie785fe3f64420850642664a0d7451e1625721127
diff --git a/design/src/android/support/design/widget/CoordinatorLayout.java b/design/src/android/support/design/widget/CoordinatorLayout.java
index 9566934..eabe8d7 100644
--- a/design/src/android/support/design/widget/CoordinatorLayout.java
+++ b/design/src/android/support/design/widget/CoordinatorLayout.java
@@ -731,6 +731,11 @@
final int childCount = mDependencySortedChildren.size();
for (int i = 0; i < childCount; i++) {
final View child = mDependencySortedChildren.get(i);
+ if (child.getVisibility() == GONE) {
+ // If the child is GONE, skip...
+ continue;
+ }
+
final LayoutParams lp = (LayoutParams) child.getLayoutParams();
int keylineWidthUsed = 0;
@@ -843,6 +848,11 @@
final int childCount = mDependencySortedChildren.size();
for (int i = 0; i < childCount; i++) {
final View child = mDependencySortedChildren.get(i);
+ if (child.getVisibility() == GONE) {
+ // If the child is GONE, skip...
+ continue;
+ }
+
final LayoutParams lp = (LayoutParams) child.getLayoutParams();
final Behavior behavior = lp.getBehavior();
diff --git a/design/tests/src/android/support/design/widget/CoordinatorLayoutTest.java b/design/tests/src/android/support/design/widget/CoordinatorLayoutTest.java
index 9fff6a2..e3d0b11 100644
--- a/design/tests/src/android/support/design/widget/CoordinatorLayoutTest.java
+++ b/design/tests/src/android/support/design/widget/CoordinatorLayoutTest.java
@@ -19,6 +19,7 @@
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.same;
import static org.mockito.Mockito.atLeastOnce;
@@ -392,4 +393,42 @@
// Wait for a layout.
mInstrumentation.waitForIdleSync();
}
+
+ @Test
+ public void testGoneNotMeasuredLaidOut() throws Throwable {
+ final CoordinatorLayoutActivity activity = mActivityTestRule.getActivity();
+ final CoordinatorLayout col = activity.mCoordinatorLayout;
+
+ // Now create a GONE view and add it to the CoordinatorLayout
+ final View imageView = new View(activity);
+ imageView.setVisibility(View.GONE);
+ mActivityTestRule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ col.addView(imageView, 200, 200);
+ }
+ });
+ // Wait for a layout and measure pass
+ mInstrumentation.waitForIdleSync();
+
+ // And assert that it has not been laid out
+ assertFalse(imageView.getMeasuredWidth() > 0);
+ assertFalse(imageView.getMeasuredHeight() > 0);
+ assertFalse(ViewCompat.isLaidOut(imageView));
+
+ // Now set the view to INVISIBLE
+ mActivityTestRule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ imageView.setVisibility(View.INVISIBLE);
+ }
+ });
+ // Wait for a layout and measure pass
+ mInstrumentation.waitForIdleSync();
+
+ // And assert that it has been laid out
+ assertTrue(imageView.getMeasuredWidth() > 0);
+ assertTrue(imageView.getMeasuredHeight() > 0);
+ assertTrue(ViewCompat.isLaidOut(imageView));
+ }
}