Skip to content

Commit 6fbe284

Browse files
fabriziocuccimeta-codesync[bot]
authored andcommitted
Uncoditionally set isEnabled state based on the accessibility state (#54508)
Summary: Pull Request resolved: #54508 Changelog: [Android][Fixed] - View.setEnabled() now properly reflects accessibilityState.disabled ## Summary Fixed a bug in `BaseViewManager.java` where React Native views with `accessibilityState={{disabled: true}}` were not properly setting the native `enabled` state on Android. ## Problem Previously, the `setViewState()` method in `BaseViewManager.java` only set `view.setEnabled(true)` when `disabled=false`, but never set `view.setEnabled(false)` when `disabled=true`. This caused Android views to remain in their default `enabled=true` state even when explicitly disabled via `accessibilityState`. Reviewed By: javache Differential Revision: D86770173 fbshipit-source-id: ccffaea0d93648b4098b3c16d6807cbe76966ff9
1 parent 1c83c00 commit 6fbe284

21 files changed

Lines changed: 166 additions & 40 deletions

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<a9af5f83c6e958cf170cd77f69e85ef0>>
7+
* @generated SignedSource<<19656df8ed7f6c6cc897b1110f57c78e>>
88
*/
99

1010
/**
@@ -438,6 +438,12 @@ public object ReactNativeFeatureFlags {
438438
@JvmStatic
439439
public fun shouldPressibilityUseW3CPointerEventsForHover(): Boolean = accessor.shouldPressibilityUseW3CPointerEventsForHover()
440440

441+
/**
442+
* Fix BaseViewManager to properly set view.setEnabled() based on accessibilityState.disabled.
443+
*/
444+
@JvmStatic
445+
public fun shouldSetEnabledBasedOnAccessibilityState(): Boolean = accessor.shouldSetEnabledBasedOnAccessibilityState()
446+
441447
/**
442448
* Do not emit touchcancel from Android ScrollView, instead native topScroll event will trigger responder transfer and terminate in RN renderer.
443449
*/

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<3b95ad320a62bf77d5090436f457d87a>>
7+
* @generated SignedSource<<9b6129ab0adfa4d0f92752f52f6d91a3>>
88
*/
99

1010
/**
@@ -88,6 +88,7 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
8888
private var preparedTextCacheSizeCache: Double? = null
8989
private var preventShadowTreeCommitExhaustionCache: Boolean? = null
9090
private var shouldPressibilityUseW3CPointerEventsForHoverCache: Boolean? = null
91+
private var shouldSetEnabledBasedOnAccessibilityStateCache: Boolean? = null
9192
private var shouldTriggerResponderTransferOnScrollAndroidCache: Boolean? = null
9293
private var skipActivityIdentityAssertionOnHostPauseCache: Boolean? = null
9394
private var traceTurboModulePromiseRejectionsOnAndroidCache: Boolean? = null
@@ -719,6 +720,15 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
719720
return cached
720721
}
721722

723+
override fun shouldSetEnabledBasedOnAccessibilityState(): Boolean {
724+
var cached = shouldSetEnabledBasedOnAccessibilityStateCache
725+
if (cached == null) {
726+
cached = ReactNativeFeatureFlagsCxxInterop.shouldSetEnabledBasedOnAccessibilityState()
727+
shouldSetEnabledBasedOnAccessibilityStateCache = cached
728+
}
729+
return cached
730+
}
731+
722732
override fun shouldTriggerResponderTransferOnScrollAndroid(): Boolean {
723733
var cached = shouldTriggerResponderTransferOnScrollAndroidCache
724734
if (cached == null) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<ba3df1f078a7f5f10dced908ef1d170a>>
7+
* @generated SignedSource<<573d80277c150ff74d51d23f2e1876fc>>
88
*/
99

1010
/**
@@ -164,6 +164,8 @@ public object ReactNativeFeatureFlagsCxxInterop {
164164

165165
@DoNotStrip @JvmStatic public external fun shouldPressibilityUseW3CPointerEventsForHover(): Boolean
166166

167+
@DoNotStrip @JvmStatic public external fun shouldSetEnabledBasedOnAccessibilityState(): Boolean
168+
167169
@DoNotStrip @JvmStatic public external fun shouldTriggerResponderTransferOnScrollAndroid(): Boolean
168170

169171
@DoNotStrip @JvmStatic public external fun skipActivityIdentityAssertionOnHostPause(): Boolean

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<e5c3f111e00075dac0a6e594ce622ca7>>
7+
* @generated SignedSource<<e3b2da8981d8ee398f753cb76e68c976>>
88
*/
99

1010
/**
@@ -159,6 +159,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi
159159

160160
override fun shouldPressibilityUseW3CPointerEventsForHover(): Boolean = false
161161

162+
override fun shouldSetEnabledBasedOnAccessibilityState(): Boolean = false
163+
162164
override fun shouldTriggerResponderTransferOnScrollAndroid(): Boolean = false
163165

164166
override fun skipActivityIdentityAssertionOnHostPause(): Boolean = false

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<f484a05ce73cdf166d785560dca0536b>>
7+
* @generated SignedSource<<092b55220901732f9f21d4ccf74206e5>>
88
*/
99

1010
/**
@@ -92,6 +92,7 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
9292
private var preparedTextCacheSizeCache: Double? = null
9393
private var preventShadowTreeCommitExhaustionCache: Boolean? = null
9494
private var shouldPressibilityUseW3CPointerEventsForHoverCache: Boolean? = null
95+
private var shouldSetEnabledBasedOnAccessibilityStateCache: Boolean? = null
9596
private var shouldTriggerResponderTransferOnScrollAndroidCache: Boolean? = null
9697
private var skipActivityIdentityAssertionOnHostPauseCache: Boolean? = null
9798
private var traceTurboModulePromiseRejectionsOnAndroidCache: Boolean? = null
@@ -791,6 +792,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
791792
return cached
792793
}
793794

795+
override fun shouldSetEnabledBasedOnAccessibilityState(): Boolean {
796+
var cached = shouldSetEnabledBasedOnAccessibilityStateCache
797+
if (cached == null) {
798+
cached = currentProvider.shouldSetEnabledBasedOnAccessibilityState()
799+
accessedFeatureFlags.add("shouldSetEnabledBasedOnAccessibilityState")
800+
shouldSetEnabledBasedOnAccessibilityStateCache = cached
801+
}
802+
return cached
803+
}
804+
794805
override fun shouldTriggerResponderTransferOnScrollAndroid(): Boolean {
795806
var cached = shouldTriggerResponderTransferOnScrollAndroidCache
796807
if (cached == null) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<a2bdf7bbb1c18dbcdd4ea424362d3e9d>>
7+
* @generated SignedSource<<f9edd04c2228dfbbe5a1dc36ceb48688>>
88
*/
99

1010
/**
@@ -159,6 +159,8 @@ public interface ReactNativeFeatureFlagsProvider {
159159

160160
@DoNotStrip public fun shouldPressibilityUseW3CPointerEventsForHover(): Boolean
161161

162+
@DoNotStrip public fun shouldSetEnabledBasedOnAccessibilityState(): Boolean
163+
162164
@DoNotStrip public fun shouldTriggerResponderTransferOnScrollAndroid(): Boolean
163165

164166
@DoNotStrip public fun skipActivityIdentityAssertionOnHostPause(): Boolean

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

Lines changed: 11 additions & 2 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;
@@ -385,8 +386,16 @@ public void setViewState(@NonNull T view, @Nullable ReadableMap accessibilitySta
385386
view.setSelected(false);
386387
}
387388
view.setTag(R.id.accessibility_state, accessibilityState);
388-
if (accessibilityState.hasKey("disabled") && !accessibilityState.getBoolean("disabled")) {
389-
view.setEnabled(true);
389+
if (accessibilityState.hasKey("disabled")) {
390+
if (ReactNativeFeatureFlags.shouldSetEnabledBasedOnAccessibilityState()) {
391+
// New behavior: properly set enabled state for both true and false
392+
view.setEnabled(!accessibilityState.getBoolean("disabled"));
393+
} else {
394+
// Old behavior: only set enabled(true) when disabled=false
395+
if (!accessibilityState.getBoolean("disabled")) {
396+
view.setEnabled(true);
397+
}
398+
}
390399
}
391400

392401
// For states which don't have corresponding methods in

packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<4c9dda599d2c1467fb1602f71c7c7a54>>
7+
* @generated SignedSource<<33a06b98052c7ea82006d28b04328fa7>>
88
*/
99

1010
/**
@@ -447,6 +447,12 @@ class ReactNativeFeatureFlagsJavaProvider
447447
return method(javaProvider_);
448448
}
449449

450+
bool shouldSetEnabledBasedOnAccessibilityState() override {
451+
static const auto method =
452+
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("shouldSetEnabledBasedOnAccessibilityState");
453+
return method(javaProvider_);
454+
}
455+
450456
bool shouldTriggerResponderTransferOnScrollAndroid() override {
451457
static const auto method =
452458
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("shouldTriggerResponderTransferOnScrollAndroid");
@@ -899,6 +905,11 @@ bool JReactNativeFeatureFlagsCxxInterop::shouldPressibilityUseW3CPointerEventsFo
899905
return ReactNativeFeatureFlags::shouldPressibilityUseW3CPointerEventsForHover();
900906
}
901907

908+
bool JReactNativeFeatureFlagsCxxInterop::shouldSetEnabledBasedOnAccessibilityState(
909+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
910+
return ReactNativeFeatureFlags::shouldSetEnabledBasedOnAccessibilityState();
911+
}
912+
902913
bool JReactNativeFeatureFlagsCxxInterop::shouldTriggerResponderTransferOnScrollAndroid(
903914
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
904915
return ReactNativeFeatureFlags::shouldTriggerResponderTransferOnScrollAndroid();
@@ -1224,6 +1235,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() {
12241235
makeNativeMethod(
12251236
"shouldPressibilityUseW3CPointerEventsForHover",
12261237
JReactNativeFeatureFlagsCxxInterop::shouldPressibilityUseW3CPointerEventsForHover),
1238+
makeNativeMethod(
1239+
"shouldSetEnabledBasedOnAccessibilityState",
1240+
JReactNativeFeatureFlagsCxxInterop::shouldSetEnabledBasedOnAccessibilityState),
12271241
makeNativeMethod(
12281242
"shouldTriggerResponderTransferOnScrollAndroid",
12291243
JReactNativeFeatureFlagsCxxInterop::shouldTriggerResponderTransferOnScrollAndroid),

packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<7a72ab75c6e155769bf583cc8cac6a66>>
7+
* @generated SignedSource<<838a569cfd4e917233fdbfb5b090907b>>
88
*/
99

1010
/**
@@ -234,6 +234,9 @@ class JReactNativeFeatureFlagsCxxInterop
234234
static bool shouldPressibilityUseW3CPointerEventsForHover(
235235
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
236236

237+
static bool shouldSetEnabledBasedOnAccessibilityState(
238+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
239+
237240
static bool shouldTriggerResponderTransferOnScrollAndroid(
238241
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
239242

packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<c4020a265f61714560e6742482cc05ab>>
7+
* @generated SignedSource<<3c93056dbbf315ef24520f770ccb1b6f>>
88
*/
99

1010
/**
@@ -298,6 +298,10 @@ bool ReactNativeFeatureFlags::shouldPressibilityUseW3CPointerEventsForHover() {
298298
return getAccessor().shouldPressibilityUseW3CPointerEventsForHover();
299299
}
300300

301+
bool ReactNativeFeatureFlags::shouldSetEnabledBasedOnAccessibilityState() {
302+
return getAccessor().shouldSetEnabledBasedOnAccessibilityState();
303+
}
304+
301305
bool ReactNativeFeatureFlags::shouldTriggerResponderTransferOnScrollAndroid() {
302306
return getAccessor().shouldTriggerResponderTransferOnScrollAndroid();
303307
}

0 commit comments

Comments
 (0)