177 lines
9.4 KiB
Java
177 lines
9.4 KiB
Java
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<View, AccessibilityDelegateCompat> 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();
|
|
}
|
|
}
|