mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Revert D34518929: TalkBack support for ScrollView accessibility announcements (list and grid)
Differential Revision: D34518929 (https://github.com/facebook/react-native/commit/dd6325bafe1a539d348f3710e717a6344576b859) Original commit changeset: 410a05263a56 Original Phabricator Diff: D34518929 (https://github.com/facebook/react-native/commit/dd6325bafe1a539d348f3710e717a6344576b859) fbshipit-source-id: 114d0910970c5f5caefb98c378722faba283f2a1
This commit is contained in:
committed by
Facebook GitHub Bot
parent
cf55fd587e
commit
a12959546a
@@ -175,20 +175,6 @@ public abstract class BaseViewManager<T extends View, C extends LayoutShadowNode
|
||||
view.setTag(R.id.accessibility_role, AccessibilityRole.fromValue(accessibilityRole));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ReactProp(name = ViewProps.ACCESSIBILITY_COLLECTION)
|
||||
public void setAccessibilityCollection(
|
||||
@NonNull T view, @Nullable ReadableMap accessibilityCollection) {
|
||||
view.setTag(R.id.accessibility_collection, accessibilityCollection);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ReactProp(name = ViewProps.ACCESSIBILITY_COLLECTION_ITEM)
|
||||
public void setAccessibilityCollectionItem(
|
||||
@NonNull T view, @Nullable ReadableMap accessibilityCollectionItem) {
|
||||
view.setTag(R.id.accessibility_collection_item, accessibilityCollectionItem);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ReactProp(name = ViewProps.ACCESSIBILITY_STATE)
|
||||
public void setViewState(@NonNull T view, @Nullable ReadableMap accessibilityState) {
|
||||
|
||||
@@ -31,14 +31,6 @@ public abstract class BaseViewManagerAdapter<T extends View>
|
||||
@Override
|
||||
public void setAccessibilityRole(@NonNull T view, @Nullable String accessibilityRole) {}
|
||||
|
||||
@Override
|
||||
public void setAccessibilityCollection(
|
||||
@NonNull T view, @Nullable ReadableMap accessibilityCollection) {}
|
||||
|
||||
@Override
|
||||
public void setAccessibilityCollectionItem(
|
||||
@NonNull T view, @Nullable ReadableMap accessibilityCollectionItem) {}
|
||||
|
||||
@Override
|
||||
public void setViewState(@NonNull T view, @Nullable ReadableMap accessibilityState) {}
|
||||
|
||||
|
||||
@@ -48,12 +48,6 @@ public abstract class BaseViewManagerDelegate<T extends View, U extends BaseView
|
||||
case ViewProps.ACCESSIBILITY_STATE:
|
||||
mViewManager.setViewState(view, (ReadableMap) value);
|
||||
break;
|
||||
case ViewProps.ACCESSIBILITY_COLLECTION:
|
||||
mViewManager.setAccessibilityCollection(view, (ReadableMap) value);
|
||||
break;
|
||||
case ViewProps.ACCESSIBILITY_COLLECTION_ITEM:
|
||||
mViewManager.setAccessibilityCollectionItem(view, (ReadableMap) value);
|
||||
break;
|
||||
case ViewProps.BACKGROUND_COLOR:
|
||||
mViewManager.setBackgroundColor(
|
||||
view, value == null ? 0 : ColorPropConverter.getColor(value, view.getContext()));
|
||||
|
||||
@@ -28,10 +28,6 @@ public interface BaseViewManagerInterface<T extends View> {
|
||||
|
||||
void setAccessibilityRole(T view, @Nullable String accessibilityRole);
|
||||
|
||||
void setAccessibilityCollection(T view, @Nullable ReadableMap accessibilityCollection);
|
||||
|
||||
void setAccessibilityCollectionItem(T view, @Nullable ReadableMap accessibilityCollectionItem);
|
||||
|
||||
void setViewState(T view, @Nullable ReadableMap accessibilityState);
|
||||
|
||||
void setBackgroundColor(T view, int backgroundColor);
|
||||
|
||||
-20
@@ -122,7 +122,6 @@ public class ReactAccessibilityDelegate extends ExploreByTouchHelper {
|
||||
TABLIST,
|
||||
TIMER,
|
||||
LIST,
|
||||
GRID,
|
||||
TOOLBAR;
|
||||
|
||||
public static String getValue(AccessibilityRole role) {
|
||||
@@ -153,8 +152,6 @@ public class ReactAccessibilityDelegate extends ExploreByTouchHelper {
|
||||
return "android.widget.Switch";
|
||||
case LIST:
|
||||
return "android.widget.AbsListView";
|
||||
case GRID:
|
||||
return "android.widget.GridView";
|
||||
case NONE:
|
||||
case LINK:
|
||||
case SUMMARY:
|
||||
@@ -245,22 +242,6 @@ public class ReactAccessibilityDelegate extends ExploreByTouchHelper {
|
||||
}
|
||||
final ReadableArray accessibilityActions =
|
||||
(ReadableArray) host.getTag(R.id.accessibility_actions);
|
||||
|
||||
final ReadableMap accessibilityCollectionItem =
|
||||
(ReadableMap) host.getTag(R.id.accessibility_collection_item);
|
||||
if (accessibilityCollectionItem != null) {
|
||||
int rowIndex = accessibilityCollectionItem.getInt("rowIndex");
|
||||
int columnIndex = accessibilityCollectionItem.getInt("columnIndex");
|
||||
int rowSpan = accessibilityCollectionItem.getInt("rowSpan");
|
||||
int columnSpan = accessibilityCollectionItem.getInt("columnSpan");
|
||||
boolean heading = accessibilityCollectionItem.getBoolean("heading");
|
||||
|
||||
AccessibilityNodeInfoCompat.CollectionItemInfoCompat collectionItemCompat =
|
||||
AccessibilityNodeInfoCompat.CollectionItemInfoCompat.obtain(
|
||||
rowIndex, rowSpan, columnIndex, columnSpan, heading);
|
||||
info.setCollectionItemInfo(collectionItemCompat);
|
||||
}
|
||||
|
||||
if (accessibilityActions != null) {
|
||||
for (int i = 0; i < accessibilityActions.size(); i++) {
|
||||
final ReadableMap action = accessibilityActions.getMap(i);
|
||||
@@ -485,7 +466,6 @@ public class ReactAccessibilityDelegate extends ExploreByTouchHelper {
|
||||
|| view.getTag(R.id.accessibility_state) != null
|
||||
|| view.getTag(R.id.accessibility_actions) != null
|
||||
|| view.getTag(R.id.react_test_id) != null
|
||||
|| view.getTag(R.id.accessibility_collection_item) != null
|
||||
|| view.getTag(R.id.accessibility_links) != null)) {
|
||||
ViewCompat.setAccessibilityDelegate(
|
||||
view,
|
||||
|
||||
@@ -146,8 +146,6 @@ public class ViewProps {
|
||||
public static final String Z_INDEX = "zIndex";
|
||||
public static final String RENDER_TO_HARDWARE_TEXTURE = "renderToHardwareTextureAndroid";
|
||||
public static final String ACCESSIBILITY_LABEL = "accessibilityLabel";
|
||||
public static final String ACCESSIBILITY_COLLECTION = "accessibilityCollection";
|
||||
public static final String ACCESSIBILITY_COLLECTION_ITEM = "accessibilityCollectionItem";
|
||||
public static final String ACCESSIBILITY_HINT = "accessibilityHint";
|
||||
public static final String ACCESSIBILITY_LIVE_REGION = "accessibilityLiveRegion";
|
||||
public static final String ACCESSIBILITY_ROLE = "accessibilityRole";
|
||||
|
||||
+20
-6
@@ -25,10 +25,13 @@ import android.view.KeyEvent;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.accessibility.AccessibilityEvent;
|
||||
import android.widget.HorizontalScrollView;
|
||||
import android.widget.OverScroller;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.view.AccessibilityDelegateCompat;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
|
||||
import com.facebook.common.logging.FLog;
|
||||
import com.facebook.infer.annotation.Assertions;
|
||||
import com.facebook.react.common.ReactConstants;
|
||||
@@ -119,7 +122,22 @@ public class ReactHorizontalScrollView extends HorizontalScrollView
|
||||
mReactBackgroundManager = new ReactViewBackgroundManager(this);
|
||||
mFpsListener = fpsListener;
|
||||
|
||||
ViewCompat.setAccessibilityDelegate(this, new ReactScrollViewAccessibilityDelegate());
|
||||
ViewCompat.setAccessibilityDelegate(
|
||||
this,
|
||||
new AccessibilityDelegateCompat() {
|
||||
@Override
|
||||
public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
|
||||
super.onInitializeAccessibilityEvent(host, event);
|
||||
event.setScrollable(mScrollEnabled);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInitializeAccessibilityNodeInfo(
|
||||
View host, AccessibilityNodeInfoCompat info) {
|
||||
super.onInitializeAccessibilityNodeInfo(host, info);
|
||||
info.setScrollable(mScrollEnabled);
|
||||
}
|
||||
});
|
||||
|
||||
mScroller = getOverScrollerFromParent();
|
||||
mReactScrollViewScrollState =
|
||||
@@ -129,10 +147,6 @@ public class ReactHorizontalScrollView extends HorizontalScrollView
|
||||
: ViewCompat.LAYOUT_DIRECTION_LTR);
|
||||
}
|
||||
|
||||
public boolean getScrollEnabled() {
|
||||
return mScrollEnabled;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private OverScroller getOverScrollerFromParent() {
|
||||
OverScroller scroller;
|
||||
@@ -394,7 +408,7 @@ public class ReactHorizontalScrollView extends HorizontalScrollView
|
||||
}
|
||||
|
||||
/** Returns whether the given descendent is partially scrolled in view */
|
||||
public boolean isPartiallyScrolledInView(View descendent) {
|
||||
private boolean isPartiallyScrolledInView(View descendent) {
|
||||
int scrollDelta = getScrollDelta(descendent);
|
||||
descendent.getDrawingRect(mTempRect);
|
||||
return scrollDelta != 0 && Math.abs(scrollDelta) < mTempRect.width();
|
||||
|
||||
@@ -75,7 +75,6 @@ public class ReactScrollView extends ScrollView
|
||||
private final @Nullable OverScroller mScroller;
|
||||
private final VelocityHelper mVelocityHelper = new VelocityHelper();
|
||||
private final Rect mRect = new Rect(); // for reuse to avoid allocation
|
||||
private final Rect mTempRect = new Rect();
|
||||
private final Rect mOverflowInset = new Rect();
|
||||
|
||||
private boolean mActivelyScrolling;
|
||||
@@ -121,8 +120,6 @@ public class ReactScrollView extends ScrollView
|
||||
mScroller = getOverScrollerFromParent();
|
||||
setOnHierarchyChangeListener(this);
|
||||
setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
|
||||
|
||||
ViewCompat.setAccessibilityDelegate(this, new ReactScrollViewAccessibilityDelegate());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -194,10 +191,6 @@ public class ReactScrollView extends ScrollView
|
||||
mScrollEnabled = scrollEnabled;
|
||||
}
|
||||
|
||||
public boolean getScrollEnabled() {
|
||||
return mScrollEnabled;
|
||||
}
|
||||
|
||||
public void setPagingEnabled(boolean pagingEnabled) {
|
||||
mPagingEnabled = pagingEnabled;
|
||||
}
|
||||
@@ -306,19 +299,6 @@ public class ReactScrollView extends ScrollView
|
||||
super.requestChildFocus(child, focused);
|
||||
}
|
||||
|
||||
private int getScrollDelta(View descendent) {
|
||||
descendent.getDrawingRect(mTempRect);
|
||||
offsetDescendantRectToMyCoords(descendent, mTempRect);
|
||||
return computeScrollDeltaToGetChildRectOnScreen(mTempRect);
|
||||
}
|
||||
|
||||
/** Returns whether the given descendent is partially scrolled in view */
|
||||
public boolean isPartiallyScrolledInView(View descendent) {
|
||||
int scrollDelta = getScrollDelta(descendent);
|
||||
descendent.getDrawingRect(mTempRect);
|
||||
return scrollDelta != 0 && Math.abs(scrollDelta) < mTempRect.width();
|
||||
}
|
||||
|
||||
private void scrollToChild(View child) {
|
||||
Rect tempRect = new Rect();
|
||||
child.getDrawingRect(tempRect);
|
||||
|
||||
-154
@@ -1,154 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
package com.facebook.react.views.scroll;
|
||||
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.accessibility.AccessibilityEvent;
|
||||
import androidx.core.view.AccessibilityDelegateCompat;
|
||||
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
|
||||
import com.facebook.react.R;
|
||||
import com.facebook.react.bridge.AssertionException;
|
||||
import com.facebook.react.bridge.ReactSoftExceptionLogger;
|
||||
import com.facebook.react.bridge.ReadableMap;
|
||||
import com.facebook.react.uimanager.ReactAccessibilityDelegate;
|
||||
|
||||
public class ReactScrollViewAccessibilityDelegate extends AccessibilityDelegateCompat {
|
||||
private final String TAG = ReactScrollViewAccessibilityDelegate.class.getSimpleName();
|
||||
|
||||
@Override
|
||||
public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
|
||||
super.onInitializeAccessibilityEvent(host, event);
|
||||
if (host instanceof ReactScrollView || host instanceof ReactHorizontalScrollView) {
|
||||
onInitializeAccessibilityEventInternal(host, event);
|
||||
} else {
|
||||
ReactSoftExceptionLogger.logSoftException(
|
||||
TAG,
|
||||
new AssertionException(
|
||||
"ReactScrollViewAccessibilityDelegate should only be used with ReactScrollView or ReactHorizontalScrollView, not with class: "
|
||||
+ host.getClass().getSimpleName()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
|
||||
super.onInitializeAccessibilityNodeInfo(host, info);
|
||||
if (host instanceof ReactScrollView || host instanceof ReactHorizontalScrollView) {
|
||||
onInitializeAccessibilityNodeInfoInternal(host, info);
|
||||
} else {
|
||||
ReactSoftExceptionLogger.logSoftException(
|
||||
TAG,
|
||||
new AssertionException(
|
||||
"ReactScrollViewAccessibilityDelegate should only be used with ReactScrollView or ReactHorizontalScrollView, not with class: "
|
||||
+ host.getClass().getSimpleName()));
|
||||
}
|
||||
};
|
||||
|
||||
private void onInitializeAccessibilityEventInternal(View view, AccessibilityEvent event) {
|
||||
final ReadableMap accessibilityCollection =
|
||||
(ReadableMap) view.getTag(R.id.accessibility_collection);
|
||||
|
||||
if (accessibilityCollection != null) {
|
||||
event.setItemCount(accessibilityCollection.getInt("itemCount"));
|
||||
View contentView;
|
||||
if (view instanceof ViewGroup) {
|
||||
ViewGroup viewGroup = (ViewGroup) view;
|
||||
contentView = viewGroup.getChildAt(0);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
Integer firstVisibleIndex = null;
|
||||
Integer lastVisibleIndex = null;
|
||||
|
||||
if (!(contentView instanceof ViewGroup)) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (int index = 0; index < ((ViewGroup) contentView).getChildCount(); index++) {
|
||||
View nextChild = ((ViewGroup) contentView).getChildAt(index);
|
||||
boolean isVisible;
|
||||
if (view instanceof ReactScrollView) {
|
||||
ReactScrollView scrollView = (ReactScrollView) view;
|
||||
isVisible = scrollView.isPartiallyScrolledInView(nextChild);
|
||||
} else if (view instanceof ReactHorizontalScrollView) {
|
||||
ReactHorizontalScrollView scrollView = (ReactHorizontalScrollView) view;
|
||||
isVisible = scrollView.isPartiallyScrolledInView(nextChild);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
ReadableMap accessibilityCollectionItem =
|
||||
(ReadableMap) nextChild.getTag(R.id.accessibility_collection_item);
|
||||
|
||||
if (!(nextChild instanceof ViewGroup)) {
|
||||
return;
|
||||
}
|
||||
|
||||
int childCount = ((ViewGroup) nextChild).getChildCount();
|
||||
|
||||
// If this child's accessibilityCollectionItem is null, we'll check one more
|
||||
// nested child.
|
||||
// Happens when getItemLayout is not passed in FlatList which adds an additional
|
||||
// View in the hierarchy.
|
||||
if (childCount > 0 && accessibilityCollectionItem == null) {
|
||||
View nestedNextChild = ((ViewGroup) nextChild).getChildAt(0);
|
||||
if (nestedNextChild != null) {
|
||||
ReadableMap nestedChildAccessibility =
|
||||
(ReadableMap) nestedNextChild.getTag(R.id.accessibility_collection_item);
|
||||
if (nestedChildAccessibility != null) {
|
||||
accessibilityCollectionItem = nestedChildAccessibility;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isVisible == true && accessibilityCollectionItem != null) {
|
||||
if (firstVisibleIndex == null) {
|
||||
firstVisibleIndex = accessibilityCollectionItem.getInt("itemIndex");
|
||||
}
|
||||
lastVisibleIndex = accessibilityCollectionItem.getInt("itemIndex");
|
||||
}
|
||||
|
||||
if (firstVisibleIndex != null && lastVisibleIndex != null) {
|
||||
event.setFromIndex(firstVisibleIndex);
|
||||
event.setToIndex(lastVisibleIndex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void onInitializeAccessibilityNodeInfoInternal(
|
||||
View view, AccessibilityNodeInfoCompat info) {
|
||||
final ReactAccessibilityDelegate.AccessibilityRole accessibilityRole =
|
||||
(ReactAccessibilityDelegate.AccessibilityRole) view.getTag(R.id.accessibility_role);
|
||||
|
||||
if (accessibilityRole != null) {
|
||||
ReactAccessibilityDelegate.setRole(info, accessibilityRole, view.getContext());
|
||||
}
|
||||
|
||||
final ReadableMap accessibilityCollection =
|
||||
(ReadableMap) view.getTag(R.id.accessibility_collection);
|
||||
|
||||
if (accessibilityCollection != null) {
|
||||
int rowCount = accessibilityCollection.getInt("rowCount");
|
||||
int columnCount = accessibilityCollection.getInt("columnCount");
|
||||
boolean hierarchical = accessibilityCollection.getBoolean("hierarchical");
|
||||
|
||||
AccessibilityNodeInfoCompat.CollectionInfoCompat collectionInfoCompat =
|
||||
AccessibilityNodeInfoCompat.CollectionInfoCompat.obtain(
|
||||
rowCount, columnCount, hierarchical);
|
||||
info.setCollectionInfo(collectionInfoCompat);
|
||||
}
|
||||
|
||||
if (view instanceof ReactScrollView) {
|
||||
ReactScrollView scrollView = (ReactScrollView) view;
|
||||
info.setScrollable(scrollView.getScrollEnabled());
|
||||
} else if (view instanceof ReactHorizontalScrollView) {
|
||||
ReactHorizontalScrollView scrollView = (ReactHorizontalScrollView) view;
|
||||
info.setScrollable(scrollView.getScrollEnabled());
|
||||
}
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user