package androidx.recyclerview.widget; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.view.AccessibilityDelegateCompat; import androidx.core.view.ViewCompat; import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; import androidx.core.view.accessibility.AccessibilityNodeProviderCompat; import java.util.Map; import java.util.WeakHashMap; public class RecyclerViewAccessibilityDelegate extends AccessibilityDelegateCompat { private final ItemDelegate mItemDelegate; public final RecyclerView mRecyclerView; public static class ItemDelegate extends AccessibilityDelegateCompat { private Map mOriginalItemDelegates = new WeakHashMap(); public final RecyclerViewAccessibilityDelegate mRecyclerViewDelegate; public ItemDelegate(@NonNull RecyclerViewAccessibilityDelegate recyclerViewAccessibilityDelegate) { this.mRecyclerViewDelegate = recyclerViewAccessibilityDelegate; } @Override // androidx.core.view.AccessibilityDelegateCompat public boolean dispatchPopulateAccessibilityEvent(@NonNull View view, @NonNull AccessibilityEvent accessibilityEvent) { AccessibilityDelegateCompat accessibilityDelegateCompat = this.mOriginalItemDelegates.get(view); return accessibilityDelegateCompat != null ? accessibilityDelegateCompat.dispatchPopulateAccessibilityEvent(view, accessibilityEvent) : super.dispatchPopulateAccessibilityEvent(view, accessibilityEvent); } @Override // androidx.core.view.AccessibilityDelegateCompat @Nullable public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(@NonNull View view) { AccessibilityDelegateCompat accessibilityDelegateCompat = this.mOriginalItemDelegates.get(view); return accessibilityDelegateCompat != null ? accessibilityDelegateCompat.getAccessibilityNodeProvider(view) : super.getAccessibilityNodeProvider(view); } public AccessibilityDelegateCompat getAndRemoveOriginalDelegateForItem(View view) { return this.mOriginalItemDelegates.remove(view); } @Override // androidx.core.view.AccessibilityDelegateCompat public void onInitializeAccessibilityEvent(@NonNull View view, @NonNull AccessibilityEvent accessibilityEvent) { AccessibilityDelegateCompat accessibilityDelegateCompat = this.mOriginalItemDelegates.get(view); if (accessibilityDelegateCompat != null) { accessibilityDelegateCompat.onInitializeAccessibilityEvent(view, accessibilityEvent); } else { super.onInitializeAccessibilityEvent(view, accessibilityEvent); } } @Override // androidx.core.view.AccessibilityDelegateCompat public void onInitializeAccessibilityNodeInfo(View view, AccessibilityNodeInfoCompat accessibilityNodeInfoCompat) { if (this.mRecyclerViewDelegate.shouldIgnore() || this.mRecyclerViewDelegate.mRecyclerView.getLayoutManager() == null) { super.onInitializeAccessibilityNodeInfo(view, accessibilityNodeInfoCompat); return; } this.mRecyclerViewDelegate.mRecyclerView.getLayoutManager().onInitializeAccessibilityNodeInfoForItem(view, accessibilityNodeInfoCompat); AccessibilityDelegateCompat accessibilityDelegateCompat = this.mOriginalItemDelegates.get(view); if (accessibilityDelegateCompat != null) { accessibilityDelegateCompat.onInitializeAccessibilityNodeInfo(view, accessibilityNodeInfoCompat); } else { super.onInitializeAccessibilityNodeInfo(view, accessibilityNodeInfoCompat); } } @Override // androidx.core.view.AccessibilityDelegateCompat public void onPopulateAccessibilityEvent(@NonNull View view, @NonNull AccessibilityEvent accessibilityEvent) { AccessibilityDelegateCompat accessibilityDelegateCompat = this.mOriginalItemDelegates.get(view); if (accessibilityDelegateCompat != null) { accessibilityDelegateCompat.onPopulateAccessibilityEvent(view, accessibilityEvent); } else { super.onPopulateAccessibilityEvent(view, accessibilityEvent); } } @Override // androidx.core.view.AccessibilityDelegateCompat public boolean onRequestSendAccessibilityEvent(@NonNull ViewGroup viewGroup, @NonNull View view, @NonNull AccessibilityEvent accessibilityEvent) { AccessibilityDelegateCompat accessibilityDelegateCompat = this.mOriginalItemDelegates.get(viewGroup); return accessibilityDelegateCompat != null ? accessibilityDelegateCompat.onRequestSendAccessibilityEvent(viewGroup, view, accessibilityEvent) : super.onRequestSendAccessibilityEvent(viewGroup, view, accessibilityEvent); } @Override // androidx.core.view.AccessibilityDelegateCompat public boolean performAccessibilityAction(View view, int i, Bundle bundle) { if (this.mRecyclerViewDelegate.shouldIgnore() || this.mRecyclerViewDelegate.mRecyclerView.getLayoutManager() == null) { return super.performAccessibilityAction(view, i, bundle); } AccessibilityDelegateCompat accessibilityDelegateCompat = this.mOriginalItemDelegates.get(view); if (accessibilityDelegateCompat != null) { if (accessibilityDelegateCompat.performAccessibilityAction(view, i, bundle)) { return true; } } else if (super.performAccessibilityAction(view, i, bundle)) { return true; } return this.mRecyclerViewDelegate.mRecyclerView.getLayoutManager().performAccessibilityActionForItem(view, i, bundle); } public void saveOriginalDelegate(View view) { AccessibilityDelegateCompat accessibilityDelegate = ViewCompat.getAccessibilityDelegate(view); if (accessibilityDelegate != null && accessibilityDelegate != this) { this.mOriginalItemDelegates.put(view, accessibilityDelegate); } } @Override // androidx.core.view.AccessibilityDelegateCompat public void sendAccessibilityEvent(@NonNull View view, int i) { AccessibilityDelegateCompat accessibilityDelegateCompat = this.mOriginalItemDelegates.get(view); if (accessibilityDelegateCompat != null) { accessibilityDelegateCompat.sendAccessibilityEvent(view, i); } else { super.sendAccessibilityEvent(view, i); } } @Override // androidx.core.view.AccessibilityDelegateCompat public void sendAccessibilityEventUnchecked(@NonNull View view, @NonNull AccessibilityEvent accessibilityEvent) { AccessibilityDelegateCompat accessibilityDelegateCompat = this.mOriginalItemDelegates.get(view); if (accessibilityDelegateCompat != null) { accessibilityDelegateCompat.sendAccessibilityEventUnchecked(view, accessibilityEvent); } else { super.sendAccessibilityEventUnchecked(view, accessibilityEvent); } } } public RecyclerViewAccessibilityDelegate(@NonNull RecyclerView recyclerView) { this.mRecyclerView = recyclerView; AccessibilityDelegateCompat itemDelegate = getItemDelegate(); if (itemDelegate == null || !(itemDelegate instanceof ItemDelegate)) { this.mItemDelegate = new ItemDelegate(this); } else { this.mItemDelegate = (ItemDelegate) itemDelegate; } } @NonNull public AccessibilityDelegateCompat getItemDelegate() { return this.mItemDelegate; } @Override // androidx.core.view.AccessibilityDelegateCompat public void onInitializeAccessibilityEvent(View view, AccessibilityEvent accessibilityEvent) { super.onInitializeAccessibilityEvent(view, accessibilityEvent); if ((view instanceof RecyclerView) && !shouldIgnore()) { RecyclerView recyclerView = (RecyclerView) view; if (recyclerView.getLayoutManager() != null) { recyclerView.getLayoutManager().onInitializeAccessibilityEvent(accessibilityEvent); } } } @Override // androidx.core.view.AccessibilityDelegateCompat public void onInitializeAccessibilityNodeInfo(View view, AccessibilityNodeInfoCompat accessibilityNodeInfoCompat) { super.onInitializeAccessibilityNodeInfo(view, accessibilityNodeInfoCompat); if (!shouldIgnore() && this.mRecyclerView.getLayoutManager() != null) { this.mRecyclerView.getLayoutManager().onInitializeAccessibilityNodeInfo(accessibilityNodeInfoCompat); } } @Override // androidx.core.view.AccessibilityDelegateCompat public boolean performAccessibilityAction(View view, int i, Bundle bundle) { if (super.performAccessibilityAction(view, i, bundle)) { return true; } if (shouldIgnore() || this.mRecyclerView.getLayoutManager() == null) { return false; } return this.mRecyclerView.getLayoutManager().performAccessibilityAction(i, bundle); } public boolean shouldIgnore() { return this.mRecyclerView.hasPendingAdapterUpdates(); } }