Skip to content

Commit

Permalink
[ChipGroup][a11y] Fix announced Chip count and index
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 459759081
  • Loading branch information
paulfthomas authored and hunterstich committed Jul 8, 2022
1 parent 10ac255 commit 9b1a74b
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 6 deletions.
17 changes: 11 additions & 6 deletions lib/java/com/google/android/material/chip/ChipGroup.java
Expand Up @@ -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(),
Expand Down Expand Up @@ -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++;
}
}
Expand All @@ -367,16 +367,17 @@ private int getChipCount() {
/**
* Returns the index of the Chip within the Chip children.
*
* <p>Non-Chip children are ignored when computing the index.
* <p>Non-Chip and non-visible children are ignored when computing the index.
*/
int getIndexOfChip(@Nullable View child) {
if (!(child instanceof Chip)) {
return -1;
}
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;
}
Expand All @@ -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);
Expand Down
36 changes: 36 additions & 0 deletions lib/javatests/com/google/android/material/chip/ChipGroupTest.java
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 9b1a74b

Please sign in to comment.