Skip to content

Commit efb359f

Browse files
hubastardfacebook-github-bot
authored andcommitted
Fix testID support for TextInput, Slider and ScrollView component (#31865)
Summary: With the advent of #29610, we are now able to use the `testID` view prop on Android in black-box testing framework through the view's `resource-id`. But after testing it, I noticed that on the `TextInput`, `Slider` and `ScrollView` components, the `testID` prop was not exposed as the `resource-id` properly. The main issue was that those component was using the `AccessibilityDelegateCompat` instead of the `ReactAccessibilityDelegate`. ## Changelog [Android] [Fixed] - Fix `testID` prop for `TextInput`, `Slider` and `ScrollView` components Pull Request resolved: #31865 Test Plan: ![test-screenshot](https://user-images.githubusercontent.com/69216913/125802180-c0791a8c-a740-4657-a44f-42b1885eee39.png) Reviewed By: mdvacca Differential Revision: D29765333 Pulled By: yungsters fbshipit-source-id: 2b8e362257e3e5fdcd20330280c588dabb44f28a
1 parent 41f45a7 commit efb359f

File tree

4 files changed

+21
-4
lines changed

4 files changed

+21
-4
lines changed

ReactAndroid/src/main/java/com/facebook/react/views/scroll/BUCK

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,6 @@ rn_android_library(
3030
react_native_target("java/com/facebook/react/uimanager:uimanager"),
3131
react_native_target("java/com/facebook/react/uimanager/annotations:annotations"),
3232
react_native_target("java/com/facebook/react/views/view:view"),
33+
react_native_target("res:uimanager"),
3334
],
3435
)

ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@
2020
import android.view.MotionEvent;
2121
import android.view.View;
2222
import android.view.ViewGroup;
23+
import android.view.accessibility.AccessibilityNodeInfo;
2324
import android.widget.OverScroller;
2425
import android.widget.ScrollView;
2526
import androidx.annotation.Nullable;
2627
import androidx.core.view.ViewCompat;
2728
import com.facebook.common.logging.FLog;
2829
import com.facebook.infer.annotation.Assertions;
30+
import com.facebook.react.R;
2931
import com.facebook.react.bridge.ReactContext;
3032
import com.facebook.react.bridge.WritableMap;
3133
import com.facebook.react.bridge.WritableNativeMap;
@@ -117,6 +119,20 @@ public ReactScrollView(ReactContext context, @Nullable FpsListener fpsListener)
117119
setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
118120
}
119121

122+
@Override
123+
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
124+
super.onInitializeAccessibilityNodeInfo(info);
125+
126+
// Expose the testID prop as the resource-id name of the view. Black-box E2E/UI testing
127+
// frameworks, which interact with the UI through the accessibility framework, do not have
128+
// access to view tags. This allows developers/testers to avoid polluting the
129+
// content-description with test identifiers.
130+
final String testId = (String) this.getTag(R.id.react_test_id);
131+
if (testId != null) {
132+
info.setViewIdResourceName(testId);
133+
}
134+
}
135+
120136
@Nullable
121137
private OverScroller getOverScrollerFromParent() {
122138
OverScroller scroller;

ReactAndroid/src/main/java/com/facebook/react/views/slider/ReactSliderManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616
import android.view.ViewGroup;
1717
import android.widget.SeekBar;
1818
import androidx.annotation.Nullable;
19-
import androidx.core.view.AccessibilityDelegateCompat;
2019
import androidx.core.view.ViewCompat;
2120
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat;
2221
import com.facebook.react.bridge.ReactContext;
2322
import com.facebook.react.bridge.ReadableMap;
2423
import com.facebook.react.common.MapBuilder;
2524
import com.facebook.react.uimanager.LayoutShadowNode;
2625
import com.facebook.react.uimanager.PixelUtil;
26+
import com.facebook.react.uimanager.ReactAccessibilityDelegate;
2727
import com.facebook.react.uimanager.SimpleViewManager;
2828
import com.facebook.react.uimanager.ThemedReactContext;
2929
import com.facebook.react.uimanager.UIManagerHelper;
@@ -278,7 +278,7 @@ protected ViewManagerDelegate<ReactSlider> getDelegate() {
278278
return mDelegate;
279279
}
280280

281-
protected static class ReactSliderAccessibilityDelegate extends AccessibilityDelegateCompat {
281+
protected static class ReactSliderAccessibilityDelegate extends ReactAccessibilityDelegate {
282282
private static boolean isSliderAction(int action) {
283283
return (action == AccessibilityActionCompat.ACTION_SCROLL_FORWARD.getId())
284284
|| (action == AccessibilityActionCompat.ACTION_SCROLL_BACKWARD.getId())

ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@
3636
import android.view.inputmethod.InputMethodManager;
3737
import androidx.annotation.Nullable;
3838
import androidx.appcompat.widget.AppCompatEditText;
39-
import androidx.core.view.AccessibilityDelegateCompat;
4039
import androidx.core.view.ViewCompat;
4140
import com.facebook.common.logging.FLog;
4241
import com.facebook.infer.annotation.Assertions;
4342
import com.facebook.react.bridge.ReactContext;
4443
import com.facebook.react.bridge.ReactSoftException;
4544
import com.facebook.react.common.build.ReactBuildConfig;
4645
import com.facebook.react.uimanager.FabricViewStateManager;
46+
import com.facebook.react.uimanager.ReactAccessibilityDelegate;
4747
import com.facebook.react.uimanager.UIManagerModule;
4848
import com.facebook.react.uimanager.events.EventDispatcher;
4949
import com.facebook.react.views.text.CustomLetterSpacingSpan;
@@ -155,7 +155,7 @@ public ReactEditText(Context context) {
155155

156156
ViewCompat.setAccessibilityDelegate(
157157
this,
158-
new AccessibilityDelegateCompat() {
158+
new ReactAccessibilityDelegate() {
159159
@Override
160160
public boolean performAccessibilityAction(View host, int action, Bundle args) {
161161
if (action == AccessibilityNodeInfo.ACTION_CLICK) {

0 commit comments

Comments
 (0)