Skip to content

Commit 9b1a74b

Browse files
paulfthomashunterstich
authored andcommitted
[ChipGroup][a11y] Fix announced Chip count and index
PiperOrigin-RevId: 459759081
1 parent 10ac255 commit 9b1a74b

File tree

2 files changed

+47
-6
lines changed

2 files changed

+47
-6
lines changed

lib/java/com/google/android/material/chip/ChipGroup.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ public void onInitializeAccessibilityNodeInfo(@NonNull AccessibilityNodeInfo inf
174174
super.onInitializeAccessibilityNodeInfo(info);
175175
AccessibilityNodeInfoCompat infoCompat = AccessibilityNodeInfoCompat.wrap(info);
176176
// -1 for an unknown number of columns in a reflowing layout
177-
int columnCount = isSingleLine() ? getChipCount() : -1;
177+
int columnCount = isSingleLine() ? getVisibleChipCount() : -1;
178178
infoCompat.setCollectionInfo(
179179
CollectionInfoCompat.obtain(
180180
/* rowCount= */ getRowCount(),
@@ -354,10 +354,10 @@ public void setOnCheckedStateChangeListener(@Nullable OnCheckedStateChangeListen
354354
onCheckedStateChangeListener = listener;
355355
}
356356

357-
private int getChipCount() {
357+
private int getVisibleChipCount() {
358358
int count = 0;
359359
for (int i = 0; i < getChildCount(); i++) {
360-
if (this.getChildAt(i) instanceof Chip) {
360+
if (getChildAt(i) instanceof Chip && isChildVisible(i)) {
361361
count++;
362362
}
363363
}
@@ -367,16 +367,17 @@ private int getChipCount() {
367367
/**
368368
* Returns the index of the Chip within the Chip children.
369369
*
370-
* <p>Non-Chip children are ignored when computing the index.
370+
* <p>Non-Chip and non-visible children are ignored when computing the index.
371371
*/
372372
int getIndexOfChip(@Nullable View child) {
373373
if (!(child instanceof Chip)) {
374374
return -1;
375375
}
376376
int index = 0;
377377
for (int i = 0; i < getChildCount(); i++) {
378-
if (this.getChildAt(i) instanceof Chip) {
379-
Chip chip = (Chip) getChildAt(i);
378+
View current = getChildAt(i);
379+
if (current instanceof Chip && isChildVisible(i)) {
380+
Chip chip = (Chip) current;
380381
if (chip == child) {
381382
return index;
382383
}
@@ -386,6 +387,10 @@ int getIndexOfChip(@Nullable View child) {
386387
return -1;
387388
}
388389

390+
private boolean isChildVisible(int i) {
391+
return getChildAt(i).getVisibility() == VISIBLE;
392+
}
393+
389394
/** Sets the horizontal and vertical spacing between visible chips in this group. */
390395
public void setChipSpacing(@Dimension int chipSpacing) {
391396
setChipSpacingHorizontal(chipSpacing);

lib/javatests/com/google/android/material/chip/ChipGroupTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
import com.google.android.material.test.R;
1919

20+
import static android.view.View.GONE;
21+
import static android.view.View.INVISIBLE;
2022
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
2123
import static com.google.common.truth.Truth.assertThat;
2224
import static org.junit.Assert.assertEquals;
@@ -261,6 +263,40 @@ public void isSingleLine_initializesAccessibilityNodeInfo() {
261263
assertEquals(1, itemInfo.getColumnIndex());
262264
assertEquals(0, itemInfo.getRowIndex());
263265
assertTrue(itemInfo.isSelected());
266+
assertEquals(1, chipgroup.getIndexOfChip(secondChild));
267+
}
268+
269+
@Test
270+
@Config(minSdk = 23, maxSdk = 28)
271+
public void isSingleLine_initializesAccessibilityNodeInfo_invisibleChip() {
272+
chipgroup.setSingleLine(true);
273+
AccessibilityNodeInfoCompat groupInfoCompat = AccessibilityNodeInfoCompat.obtain();
274+
// onLayout must be triggered for rowCount
275+
chipgroup.layout(0, 0, 100, 100);
276+
277+
ViewCompat.onInitializeAccessibilityNodeInfo(chipgroup, groupInfoCompat);
278+
279+
CollectionInfoCompat collectionInfo = groupInfoCompat.getCollectionInfo();
280+
assertEquals(chipgroup.getChildCount(), collectionInfo.getColumnCount());
281+
assertEquals(1, collectionInfo.getRowCount());
282+
283+
Chip firstChild = (Chip) chipgroup.getChildAt(0);
284+
firstChild.setVisibility(INVISIBLE);
285+
Chip secondChild = (Chip) chipgroup.getChildAt(1);
286+
secondChild.setVisibility(GONE);
287+
Chip thirdChild = (Chip) chipgroup.getChildAt(2);
288+
AccessibilityNodeInfoCompat chipInfoCompat = AccessibilityNodeInfoCompat.obtain();
289+
ViewCompat.onInitializeAccessibilityNodeInfo(thirdChild, chipInfoCompat);
290+
291+
CollectionItemInfoCompat itemInfo = chipInfoCompat.getCollectionItemInfo();
292+
assertEquals(0, itemInfo.getColumnIndex());
293+
assertEquals(0, itemInfo.getRowIndex());
294+
assertEquals(-1, chipgroup.getIndexOfChip(firstChild));
295+
assertEquals(-1, chipgroup.getIndexOfChip(secondChild));
296+
assertEquals(0, chipgroup.getIndexOfChip(thirdChild));
297+
298+
ViewCompat.onInitializeAccessibilityNodeInfo(chipgroup, groupInfoCompat);
299+
assertEquals(1, groupInfoCompat.getCollectionInfo().getColumnCount());
264300
}
265301

266302
@Test

0 commit comments

Comments
 (0)