Skip to content

Commit 32fb0d3

Browse files
joevilchesfacebook-github-bot
authored andcommitted
Back out "Implement accessibilityOrder by building the accessibilityTree through addChildrenForAccessibility" (facebook#52516)
Summary: Pull Request resolved: facebook#52516 Original commit changeset: 767ebc880a2e Original Phabricator Diff: D77258926 Changelog: [Internal] Reviewed By: javache Differential Revision: D78016839
1 parent 23f3bf9 commit 32fb0d3

File tree

9 files changed

+63
-224
lines changed

9 files changed

+63
-224
lines changed

packages/react-native/Libraries/Components/ScrollView/ScrollView.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -673,7 +673,7 @@ type ScrollViewBaseProps = $ReadOnly<{
673673
}>;
674674

675675
export type ScrollViewProps = $ReadOnly<{
676-
...Omit<ViewProps, 'experimental_accessibilityOrder'>,
676+
...ViewProps,
677677
...ScrollViewPropsIOS,
678678
...ScrollViewPropsAndroid,
679679
...ScrollViewBaseProps,

packages/react-native/Libraries/Components/TextInput/TextInput.flow.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1031,7 +1031,7 @@ type TextInputBaseProps = $ReadOnly<{
10311031
}>;
10321032

10331033
export type TextInputProps = $ReadOnly<{
1034-
...Omit<ViewProps, 'style' | 'experimental_accessibilityOrder'>,
1034+
...Omit<ViewProps, 'style'>,
10351035
...TextInputIOSProps,
10361036
...TextInputAndroidProps,
10371037
...TextInputBaseProps,

packages/react-native/ReactAndroid/api/ReactAndroid.api

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3286,6 +3286,7 @@ public abstract class com/facebook/react/uimanager/BaseViewManager : com/faceboo
32863286
public fun setAccessibilityLabel (Landroid/view/View;Ljava/lang/String;)V
32873287
public fun setAccessibilityLabelledBy (Landroid/view/View;Lcom/facebook/react/bridge/Dynamic;)V
32883288
public fun setAccessibilityLiveRegion (Landroid/view/View;Ljava/lang/String;)V
3289+
public fun setAccessibilityOrder (Landroid/view/View;Lcom/facebook/react/bridge/ReadableArray;)V
32893290
public fun setAccessibilityRole (Landroid/view/View;Ljava/lang/String;)V
32903291
public fun setAccessibilityValue (Landroid/view/View;Lcom/facebook/react/bridge/ReadableMap;)V
32913292
public fun setBackgroundColor (Landroid/view/View;I)V
@@ -3776,14 +3777,6 @@ public final class com/facebook/react/uimanager/ReactAccessibilityDelegate$Role
37763777
public static fun values ()[Lcom/facebook/react/uimanager/ReactAccessibilityDelegate$Role;
37773778
}
37783779

3779-
public final class com/facebook/react/uimanager/ReactAxOrderHelper {
3780-
public static final field INSTANCE Lcom/facebook/react/uimanager/ReactAxOrderHelper;
3781-
public final fun buildAxOrderList (Landroid/view/View;Ljava/util/List;[Landroid/view/View;)V
3782-
public static final fun cleanUpAxOrder (Landroid/view/ViewGroup;)V
3783-
public final fun disableFocusForSubtree (Landroid/view/ViewGroup;Ljava/util/List;)V
3784-
public static final fun restoreFocusability (Landroid/view/ViewGroup;)V
3785-
}
3786-
37873780
public abstract interface class com/facebook/react/uimanager/ReactClippingProhibitedView {
37883781
}
37893782

@@ -6554,16 +6547,13 @@ public final class com/facebook/react/views/view/ReactDrawableHelper {
65546547

65556548
public class com/facebook/react/views/view/ReactViewGroup : android/view/ViewGroup, com/facebook/react/touch/ReactHitSlopView, com/facebook/react/touch/ReactInterceptingViewGroup, com/facebook/react/uimanager/ReactClippingViewGroup, com/facebook/react/uimanager/ReactOverflowViewWithInset, com/facebook/react/uimanager/ReactPointerEventsView, com/facebook/react/uimanager/ReactZIndexedViewGroup {
65566549
public fun <init> (Landroid/content/Context;)V
6557-
public fun addChildrenForAccessibility (Ljava/util/ArrayList;)V
6558-
public final fun cleanUpAxOrderListener ()V
65596550
protected fun dispatchDraw (Landroid/graphics/Canvas;)V
65606551
public fun dispatchGenericMotionEvent (Landroid/view/MotionEvent;)Z
65616552
public fun dispatchProvideStructure (Landroid/view/ViewStructure;)V
65626553
protected fun dispatchSetPressed (Z)V
65636554
public fun draw (Landroid/graphics/Canvas;)V
65646555
protected fun drawChild (Landroid/graphics/Canvas;Landroid/view/View;J)Z
65656556
public fun endViewTransition (Landroid/view/View;)V
6566-
public final fun getAxOrderList ()Ljava/util/List;
65676557
protected fun getChildDrawingOrder (II)I
65686558
public fun getClippingRect (Landroid/graphics/Rect;)V
65696559
public fun getHitSlopRect ()Landroid/graphics/Rect;
@@ -6583,7 +6573,6 @@ public class com/facebook/react/views/view/ReactViewGroup : android/view/ViewGro
65836573
public fun onViewAdded (Landroid/view/View;)V
65846574
public fun onViewRemoved (Landroid/view/View;)V
65856575
public fun requestLayout ()V
6586-
public final fun setAxOrderList (Ljava/util/List;)V
65876576
public final fun setBackfaceVisibility (Ljava/lang/String;)V
65886577
public final fun setBackfaceVisibilityDependantOpacity ()V
65896578
public fun setBackgroundColor (I)V
@@ -6620,15 +6609,12 @@ public class com/facebook/react/views/view/ReactViewManager : com/facebook/react
66206609
public fun nextFocusLeft (Lcom/facebook/react/views/view/ReactViewGroup;I)V
66216610
public fun nextFocusRight (Lcom/facebook/react/views/view/ReactViewGroup;I)V
66226611
public fun nextFocusUp (Lcom/facebook/react/views/view/ReactViewGroup;I)V
6623-
public synthetic fun onDropViewInstance (Landroid/view/View;)V
6624-
public fun onDropViewInstance (Lcom/facebook/react/views/view/ReactViewGroup;)V
66256612
public synthetic fun prepareToRecycleView (Lcom/facebook/react/uimanager/ThemedReactContext;Landroid/view/View;)Landroid/view/View;
66266613
protected fun prepareToRecycleView (Lcom/facebook/react/uimanager/ThemedReactContext;Lcom/facebook/react/views/view/ReactViewGroup;)Lcom/facebook/react/views/view/ReactViewGroup;
66276614
public synthetic fun receiveCommand (Landroid/view/View;ILcom/facebook/react/bridge/ReadableArray;)V
66286615
public synthetic fun receiveCommand (Landroid/view/View;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableArray;)V
66296616
public fun receiveCommand (Lcom/facebook/react/views/view/ReactViewGroup;ILcom/facebook/react/bridge/ReadableArray;)V
66306617
public fun receiveCommand (Lcom/facebook/react/views/view/ReactViewGroup;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableArray;)V
6631-
public fun setAccessibilityOrder (Lcom/facebook/react/views/view/ReactViewGroup;Lcom/facebook/react/bridge/ReadableArray;)V
66326618
public fun setAccessible (Lcom/facebook/react/views/view/ReactViewGroup;Z)V
66336619
public fun setBackfaceVisibility (Lcom/facebook/react/views/view/ReactViewGroup;Ljava/lang/String;)V
66346620
public fun setBackgroundImage (Lcom/facebook/react/views/view/ReactViewGroup;Lcom/facebook/react/bridge/ReadableArray;)V

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import com.facebook.react.bridge.ReadableType;
3131
import com.facebook.react.common.MapBuilder;
3232
import com.facebook.react.common.ReactConstants;
33+
import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags;
3334
import com.facebook.react.uimanager.ReactAccessibilityDelegate.AccessibilityRole;
3435
import com.facebook.react.uimanager.ReactAccessibilityDelegate.Role;
3536
import com.facebook.react.uimanager.annotations.ReactProp;
@@ -311,9 +312,61 @@ public void setTestId(@NonNull T view, @Nullable String testId) {
311312
public void setNativeId(@NonNull T view, @Nullable String nativeId) {
312313
view.setTag(R.id.view_tag_native_id, nativeId);
313314

315+
/*
316+
* If we change the nativeId we need to notify the relevant accessibility parent to update the
317+
* focusing order.
318+
*/
319+
if (view.getTag(R.id.accessibility_order_parent) != null) {
320+
ViewGroup accessibilityParent = (ViewGroup) view.getTag(R.id.accessibility_order_parent);
321+
322+
accessibilityParent.setTag(R.id.accessibility_order_dirty, true);
323+
324+
accessibilityParent.notifySubtreeAccessibilityStateChanged(
325+
accessibilityParent, accessibilityParent, AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE);
326+
}
327+
314328
ReactFindViewUtil.notifyViewRendered(view);
315329
}
316330

331+
@ReactProp(name = ViewProps.ACCESSIBILITY_ORDER)
332+
public void setAccessibilityOrder(@NonNull T view, @Nullable ReadableArray nativeIds) {
333+
if (!ReactNativeFeatureFlags.enableAccessibilityOrder()) {
334+
return;
335+
}
336+
337+
view.setTag(R.id.accessibility_order, nativeIds);
338+
view.setTag(R.id.accessibility_order_dirty, true);
339+
340+
if (view instanceof ViewGroup) {
341+
((ViewGroup) view)
342+
.setOnHierarchyChangeListener(
343+
new ViewGroup.OnHierarchyChangeListener() {
344+
@Override
345+
public void onChildViewAdded(View parent, View child) {
346+
view.setTag(R.id.accessibility_order_dirty, true);
347+
348+
// We also want to listen to changes on the hierarchy of nested ViewGroups
349+
if (child instanceof ViewGroup) {
350+
ViewGroup childGroup = (ViewGroup) child;
351+
childGroup.setOnHierarchyChangeListener(this);
352+
for (int i = 0; i < childGroup.getChildCount(); i++) {
353+
onChildViewAdded(childGroup, childGroup.getChildAt(i));
354+
}
355+
}
356+
}
357+
358+
@Override
359+
public void onChildViewRemoved(View parent, View child) {
360+
view.setTag(R.id.accessibility_order_dirty, true);
361+
}
362+
});
363+
364+
((ViewGroup) view)
365+
.notifySubtreeAccessibilityStateChanged(
366+
view, view, AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE);
367+
}
368+
}
369+
317370
@ReactProp(name = ViewProps.ACCESSIBILITY_LABELLED_BY)
318371
public void setAccessibilityLabelledBy(@NonNull T view, @Nullable Dynamic nativeId) {
319372
if (nativeId.isNull()) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManagerDelegate.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,10 @@ public abstract class BaseViewManagerDelegate<
9191
val dynamicFromObject: Dynamic = DynamicFromObject(value)
9292
mViewManager.setAccessibilityLabelledBy(view, dynamicFromObject)
9393
}
94+
ViewProps.ACCESSIBILITY_ORDER ->
95+
mViewManager.setAccessibilityOrder(view, value as ReadableArray?)
9496
ViewProps.OPACITY -> mViewManager.setOpacity(view, (value as Double?)?.toFloat() ?: 1.0f)
97+
9598
ViewProps.OUTLINE_COLOR -> mViewManager.setOutlineColor(view, value as Int?)
9699

97100
ViewProps.OUTLINE_OFFSET ->

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactAxOrderHelper.kt

Lines changed: 0 additions & 103 deletions
This file was deleted.

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.kt

Lines changed: 0 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import android.view.MotionEvent
2222
import android.view.View
2323
import android.view.ViewGroup
2424
import android.view.ViewStructure
25-
import android.view.accessibility.AccessibilityManager
2625
import com.facebook.common.logging.FLog
2726
import com.facebook.react.R
2827
import com.facebook.react.bridge.ReactNoCrashSoftException
@@ -50,7 +49,6 @@ import com.facebook.react.uimanager.PixelUtil.toDIPFromPixel
5049
import com.facebook.react.uimanager.PointerEvents
5150
import com.facebook.react.uimanager.PointerEvents.Companion.canBeTouchTarget
5251
import com.facebook.react.uimanager.PointerEvents.Companion.canChildrenBeTouchTarget
53-
import com.facebook.react.uimanager.ReactAxOrderHelper
5452
import com.facebook.react.uimanager.ReactClippingProhibitedView
5553
import com.facebook.react.uimanager.ReactClippingViewGroup
5654
import com.facebook.react.uimanager.ReactClippingViewGroupHelper.calculateClippingRect
@@ -65,7 +63,6 @@ import com.facebook.react.uimanager.style.BorderStyle
6563
import com.facebook.react.uimanager.style.LogicalEdge
6664
import com.facebook.react.uimanager.style.Overflow
6765
import com.facebook.react.views.view.CanvasUtil.enableZ
68-
import java.util.ArrayList
6966
import kotlin.concurrent.Volatile
7067
import kotlin.math.max
7168

@@ -142,17 +139,12 @@ public open class ReactViewGroup public constructor(context: Context?) :
142139
public override var hitSlopRect: Rect? = null
143140
public override var pointerEvents: PointerEvents = PointerEvents.AUTO
144141

145-
public var axOrderList: MutableList<String>? = null
146-
147142
private var childrenLayoutChangeListener: ChildrenLayoutChangeListener? = null
148143
private var onInterceptTouchEventListener: OnInterceptTouchEventListener? = null
149144
private var needsOffscreenAlphaCompositing = false
150145
private var backfaceOpacity = 0f
151146
private var backfaceVisible = false
152147
private var childrenRemovedWhileTransitioning: MutableSet<Int>? = null
153-
private var accessibilityStateChangeListener:
154-
AccessibilityManager.AccessibilityStateChangeListener? =
155-
null
156148

157149
init {
158150
initView()
@@ -939,70 +931,6 @@ public open class ReactViewGroup public constructor(context: Context?) :
939931
alpha = 0f
940932
}
941933

942-
override fun addChildrenForAccessibility(outChildren: ArrayList<View>) {
943-
val axOrderParentOrderList =
944-
(getTag(R.id.accessibility_order_parent) as ReactViewGroup?)?.axOrderList
945-
val axOrder: MutableList<*>? = axOrderList
946-
if (axOrder != null) {
947-
948-
val am: AccessibilityManager? =
949-
this.getContext().getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager?
950-
if (accessibilityStateChangeListener == null && am != null) {
951-
val newAccessibilityStateChangeListener =
952-
AccessibilityManager.AccessibilityStateChangeListener { enabled ->
953-
if (!enabled) {
954-
ReactAxOrderHelper.restoreFocusability(this)
955-
}
956-
}
957-
958-
am.addAccessibilityStateChangeListener(newAccessibilityStateChangeListener)
959-
accessibilityStateChangeListener = newAccessibilityStateChangeListener
960-
}
961-
962-
val result = arrayOfNulls<View?>(axOrder.size)
963-
964-
for (i in 0..<childCount) {
965-
ReactAxOrderHelper.buildAxOrderList(getChildAt(i), axOrder, result)
966-
}
967-
968-
for (i in result.indices) {
969-
val view = result[i]
970-
if (view != null) {
971-
if (view.isFocusable) {
972-
outChildren.add(view)
973-
} else {
974-
view.addChildrenForAccessibility(outChildren)
975-
}
976-
}
977-
}
978-
} else if (axOrderParentOrderList != null) {
979-
// view is a container so add its children normally
980-
if (!isFocusable) {
981-
super.addChildrenForAccessibility(outChildren)
982-
return
983-
984-
// If this view can coopt, turn the focusability off its children but add them to the tree
985-
} else if (isFocusable && (contentDescription == null || contentDescription == "")) {
986-
super.addChildrenForAccessibility(outChildren)
987-
ReactAxOrderHelper.disableFocusForSubtree(this, axOrderParentOrderList)
988-
// if this view is focusable and has a contentDescription then we don't care about its
989-
// descendants for accessibility
990-
} else if (isFocusable && !(contentDescription == null || contentDescription == "")) {
991-
return
992-
}
993-
} else {
994-
super.addChildrenForAccessibility(outChildren)
995-
}
996-
}
997-
998-
public fun cleanUpAxOrderListener() {
999-
val am = this.context.getSystemService(Context.ACCESSIBILITY_SERVICE) as? AccessibilityManager
1000-
if (am != null) {
1001-
accessibilityStateChangeListener?.let { am.removeAccessibilityStateChangeListener(it) }
1002-
}
1003-
accessibilityStateChangeListener = null
1004-
}
1005-
1006934
private companion object {
1007935
private const val ARRAY_CAPACITY_INCREMENT = 12
1008936
private val defaultLayoutParam = LayoutParams(0, 0)

0 commit comments

Comments
 (0)