diff --git a/lib/java/com/google/android/material/chip/ChipGroup.java b/lib/java/com/google/android/material/chip/ChipGroup.java index fbe54578270..4b18cac0db8 100644 --- a/lib/java/com/google/android/material/chip/ChipGroup.java +++ b/lib/java/com/google/android/material/chip/ChipGroup.java @@ -174,7 +174,7 @@ public void onInitializeAccessibilityNodeInfo(@NonNull AccessibilityNodeInfo inf super.onInitializeAccessibilityNodeInfo(info); AccessibilityNodeInfoCompat infoCompat = AccessibilityNodeInfoCompat.wrap(info); // -1 for an unknown number of columns in a reflowing layout - int columnCount = isSingleLine() ? getChipCount() : -1; + int columnCount = isSingleLine() ? getVisibleChipCount() : -1; infoCompat.setCollectionInfo( CollectionInfoCompat.obtain( /* rowCount= */ getRowCount(), @@ -354,10 +354,10 @@ public void setOnCheckedStateChangeListener(@Nullable OnCheckedStateChangeListen onCheckedStateChangeListener = listener; } - private int getChipCount() { + private int getVisibleChipCount() { int count = 0; for (int i = 0; i < getChildCount(); i++) { - if (this.getChildAt(i) instanceof Chip) { + if (getChildAt(i) instanceof Chip && isChildVisible(i)) { count++; } } @@ -367,7 +367,7 @@ private int getChipCount() { /** * Returns the index of the Chip within the Chip children. * - *

Non-Chip children are ignored when computing the index. + *

Non-Chip and non-visible children are ignored when computing the index. */ int getIndexOfChip(@Nullable View child) { if (!(child instanceof Chip)) { @@ -375,8 +375,9 @@ int getIndexOfChip(@Nullable View child) { } int index = 0; for (int i = 0; i < getChildCount(); i++) { - if (this.getChildAt(i) instanceof Chip) { - Chip chip = (Chip) getChildAt(i); + View current = getChildAt(i); + if (current instanceof Chip && isChildVisible(i)) { + Chip chip = (Chip) current; if (chip == child) { return index; } @@ -386,6 +387,10 @@ int getIndexOfChip(@Nullable View child) { return -1; } + private boolean isChildVisible(int i) { + return getChildAt(i).getVisibility() == VISIBLE; + } + /** Sets the horizontal and vertical spacing between visible chips in this group. */ public void setChipSpacing(@Dimension int chipSpacing) { setChipSpacingHorizontal(chipSpacing); diff --git a/lib/javatests/com/google/android/material/chip/ChipGroupTest.java b/lib/javatests/com/google/android/material/chip/ChipGroupTest.java index 76b272af1a6..43f01882dca 100644 --- a/lib/javatests/com/google/android/material/chip/ChipGroupTest.java +++ b/lib/javatests/com/google/android/material/chip/ChipGroupTest.java @@ -17,6 +17,8 @@ import com.google.android.material.test.R; +import static android.view.View.GONE; +import static android.view.View.INVISIBLE; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; @@ -261,6 +263,40 @@ public void isSingleLine_initializesAccessibilityNodeInfo() { assertEquals(1, itemInfo.getColumnIndex()); assertEquals(0, itemInfo.getRowIndex()); assertTrue(itemInfo.isSelected()); + assertEquals(1, chipgroup.getIndexOfChip(secondChild)); + } + + @Test + @Config(minSdk = 23, maxSdk = 28) + public void isSingleLine_initializesAccessibilityNodeInfo_invisibleChip() { + chipgroup.setSingleLine(true); + AccessibilityNodeInfoCompat groupInfoCompat = AccessibilityNodeInfoCompat.obtain(); + // onLayout must be triggered for rowCount + chipgroup.layout(0, 0, 100, 100); + + ViewCompat.onInitializeAccessibilityNodeInfo(chipgroup, groupInfoCompat); + + CollectionInfoCompat collectionInfo = groupInfoCompat.getCollectionInfo(); + assertEquals(chipgroup.getChildCount(), collectionInfo.getColumnCount()); + assertEquals(1, collectionInfo.getRowCount()); + + Chip firstChild = (Chip) chipgroup.getChildAt(0); + firstChild.setVisibility(INVISIBLE); + Chip secondChild = (Chip) chipgroup.getChildAt(1); + secondChild.setVisibility(GONE); + Chip thirdChild = (Chip) chipgroup.getChildAt(2); + AccessibilityNodeInfoCompat chipInfoCompat = AccessibilityNodeInfoCompat.obtain(); + ViewCompat.onInitializeAccessibilityNodeInfo(thirdChild, chipInfoCompat); + + CollectionItemInfoCompat itemInfo = chipInfoCompat.getCollectionItemInfo(); + assertEquals(0, itemInfo.getColumnIndex()); + assertEquals(0, itemInfo.getRowIndex()); + assertEquals(-1, chipgroup.getIndexOfChip(firstChild)); + assertEquals(-1, chipgroup.getIndexOfChip(secondChild)); + assertEquals(0, chipgroup.getIndexOfChip(thirdChild)); + + ViewCompat.onInitializeAccessibilityNodeInfo(chipgroup, groupInfoCompat); + assertEquals(1, groupInfoCompat.getCollectionInfo().getColumnCount()); } @Test