[MaterialDatePicker][a11y] Improve TalkBack focus order when selecting a day

Make RecyclerView non-scrollable to allow focusing away from it instead of paginating to previous/next month.

PiperOrigin-RevId: 486936286
This commit is contained in:
pfthomas 2022-11-08 14:40:54 +00:00 committed by raajkumars
parent 45a569f858
commit dff70c062d
2 changed files with 27 additions and 0 deletions

View File

@ -245,9 +245,23 @@ public final class MaterialCalendar<S> extends PickerFragment<S> {
new PagerSnapHelper().attachToRecyclerView(recyclerView);
}
recyclerView.scrollToPosition(monthsPagerAdapter.getPosition(current));
setUpForAccessibility();
return root;
}
private void setUpForAccessibility() {
ViewCompat.setAccessibilityDelegate(
recyclerView,
new AccessibilityDelegateCompat() {
@Override
public void onInitializeAccessibilityNodeInfo(
View view, @NonNull AccessibilityNodeInfoCompat accessibilityNodeInfoCompat) {
super.onInitializeAccessibilityNodeInfo(view, accessibilityNodeInfoCompat);
accessibilityNodeInfoCompat.setScrollable(false);
}
});
}
@NonNull
private ItemDecoration createItemDecoration() {
return new ItemDecoration() {

View File

@ -18,11 +18,15 @@ package com.google.android.material.datepicker;
import static com.google.android.material.datepicker.MaterialDatePickerTestUtils.findFirstVisibleItem;
import static org.hamcrest.Matchers.lessThan;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import androidx.fragment.app.FragmentManager;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import androidx.arch.core.executor.testing.InstantTaskExecutorRule;
import androidx.core.view.ViewCompat;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
import androidx.test.espresso.IdlingRegistry;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
@ -128,4 +132,13 @@ public class MaterialDatePickerPagesTest {
MaterialDatePickerTestUtils.clickSelectorToggle();
assertEquals(findFirstVisibleItem(dialogFragment), OPEN_AT.monthsLater(1));
}
@Test
public void accessibility_daySelection_notScrollable() {
View view = dialogFragment.getView().findViewById(R.id.mtrl_calendar_months);
AccessibilityNodeInfoCompat nodeInfo = AccessibilityNodeInfoCompat.obtain();
ViewCompat.onInitializeAccessibilityNodeInfo(view, nodeInfo);
assertFalse(nodeInfo.isScrollable());
}
}