Text Component does not announce disabled and disables click functionality when disabled - #33076

Closed
fabOnReact wants to merge 4 commits into
react:mainfrom
fabOnReact:text-input-announce-disabled
Closed

Text Component does not announce disabled and disables click functionality when disabled#33076
fabOnReact wants to merge 4 commits into
react:mainfrom
fabOnReact:text-input-announce-disabled

Conversation

@fabOnReact

@fabOnReactfabOnReact commented Feb 9, 2022

Copy link
Copy Markdown
Contributor

Summary

This issue fixes#30937fixes#30947fixes#30840 (Test Case 7.1, Test Case 7.3, Test Case 7.5) .
The issue is caused by:

  1. The missing javascript logic on the accessibilityState in the Text component fabOnReact@6ab7ab3 (as previously implemented in Button).
  2. The missing setter for prop accessible in ReactTextAnchorViewManagerfabOnReact@17095c6 (More information in previous PR [Accessibility] Fix Image does not announce "disabled" #31252)

Related PR #33070 PR callstack/react-native-slider#354

Changelog

[Android] [Fixed] - Text Component does not announce disabled and disables click functionality when disabled

Test Plan

1. Text has disabled and accessibilityState={{disabled: false}} (link)
2. Text has disabled (link)
3. Text has accessibilityState={{disabled: true}} (link)
4. Text has accessibilityState={{disabled:false}} (link)
5. Text has disabled={false} and accessibilityState={{disabled:true}} (link)
6. Text has accessibilityState={{disabled:true}} and method setAccessible in ReactTextAnchorViewManager (tested on commit b4cd8) (link)
7. Test Cases on the main branch
7.1. Text has disabled and accessibilityState={{disabled: false}} (link)
7.3 Text has accessibilityState={{disabled: true}} (link)
7.5 Text has disabled={false} and accessibilityState={{disabled:true}} (link)
7.6 Text has onPress callback and accessibilityState={{disabled: true}} (link)
7.7 Text has accessibilityState={{disabled:true}} and no method setAccessible in ReactTextAnchorViewManager (tested on commit c4f98dd) (link)

Adding the prop `accessible` to `ReactTextAnchorViewManager` fixes the problem for this component.
The same solution from my previous pr react#30935 (comment).
See test case at fabOnReact/react-native-notes#1 (comment)
Adding the prop `accessible` to `ReactTextAnchorViewManager` fixes the problem for this component.
The same solution from my previous pr react#30935 (comment).
See test case at fabOnReact/react-native-notes#1 (comment)666647e
@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Feb 9, 2022
@react-native-botreact-native-bot added Bug Platform: Android Android applications. labels Feb 9, 2022
@analysis-bot

Copy link
Copy Markdown
PlatformEngineArchSize (bytes)Diff
ios-universaln/a--

Base commit: 97064ae
Branch: main

@analysis-bot

Copy link
Copy Markdown
PlatformEngineArchSize (bytes)Diff
androidhermesarm64-v8a8,120,598-401
androidhermesarmeabi-v7a7,721,963-539
androidhermesx868,491,382-364
androidhermesx86_648,443,204-333
androidjscarm64-v8a9,787,227-638
androidjscarmeabi-v7a8,773,462-782
androidjscx869,754,605-590
androidjscx86_6410,350,527-564

Base commit: 97064ae
Branch: main

@fabOnReact
fabOnReact marked this pull request as ready for review February 11, 2022 06:30
@facebook-github-botfacebook-github-bot added the Shared with Meta Applied via automation to indicate that an Issue or Pull Request has been shared with the team. label Feb 11, 2022

@blavallablavalla left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code and test cases look good to me.

I'm curious why the change in ReactTextAnchorViewManager was needed. What would happen without this change? It doesn't seem like it should've made a difference, since the "disabled" attribute in Android shouldn't affect focusability of an element, although it does seem weird that it was missing, so maybe it was just fixing another bug.

@fabOnReact

fabOnReact commented Feb 14, 2022

Copy link
Copy Markdown
ContributorAuthor

Thanks @blavalla

What would happen without this change?

The Text component would not announce disabled.

DOES NOT ANNOUNCE DISABLED

notAnnounceDisabled.mp4

ANNOUNCES DISABLED

announcesDisabled.mp4

The change was already introduced in the Image Component with my PR #31252.

I added two additional tests cases to the Pull Request Summary (test case 6 and test case 7.7).

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@ShikaSD has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@react-native-bot

Copy link
Copy Markdown
Collaborator

This pull request was successfully merged by @fabriziobertoglio1987 in 7b2d817.

When will my fix make it into a release? | Upcoming Releases

@react-native-botreact-native-bot added the Merged This PR has been merged. label Feb 15, 2022
facebook-github-bot pushed a commit that referenced this pull request Jun 9, 2022
…cus to true
Summary:
[A recent fix](#33076) to Android to set focusable to true when accessible is true, and this caused several components not to work correctly.
This JS change essentially reverts the default back to Text not being focusable unless it is explicitly set. Android's "auto" behavior is better than setting `accessible=true`, and it's also the behavior React Native has had since accessibility on Android was implemented.
# Wall of Text Explanation
Explanation From Brett's comment [here](https://www.internalfb.com/diff/D35908559?dst_version_fbid=700876567897063&transaction_fbid=477905564133412)
blavalla
Generally speaking, "accessible" in react native maps to "focusable" in Android views, and the default value for "focusabe" for a TextView (and actually all views) is "auto" not "false". The difference here is that "false" is telling the system to explicitly disallow focus on this element, where as "auto" is telling the system that it's up to whatever service is trying to focus to determine if it should or not.
In the case of text, Talkback generally does default to focusing on Text when it's set to "auto", though it also does try to combine this text together with other not-explicitly focusable siblings and roll the focus up to some common ancestor element.
In the case of TetraButton here, I would expect the default behavior would be that the text is "auto" focusable, so Talkback would combine the text here with the parent <TetraPressable> (which is explicitly focusable via accessible="true").
...
[This diff](#33076) was to fix the issue with "disabled" not properly announcing on text views, which was commonly occuring due to the description-combining feature described above. Basically, when Talkback decides to combine not-explicitly-focusable elements together, it ignores properties like "disabled", "selected", etc. so when combined only the text is transferred.
The "fix" here was to make sure that if disabled was set, that an element was always explicitly focusable so that it wouldn't be eligible to be combined with others. I think that as a general concept makes sense, but the fix actually surfaced an issue that is likely a much older bug.
This line in <Text>
```
accessible={accessible !== false}
```
Is basically always setting accessible="true" unless it's explicitly set to false, and has been in there for years. It was likely added to force text to be accessible by default for iOS. But until [this diff](#33076) this line was basically a no-op for Android, since setting accessible="true" on text would do nothing at all.
[This diff](#33076) changed this so that setting accessible="true" worked how you'd expect, by making the view explicitly focusable, which was necessary for the disabled behavior to work properly. But that means that now by default all text views are explicitly focusable on both iOS and Android, and this there is likely many components that were built that don't expect this to be the case.
It doesn't seem like the right fix here is to revert this behavior to its previous state, as it wasn't working how anyone would expect it to if they looked at the code, and it seems like we were relying on some fairly undocumented behavior of Talkback to get it to work how we wanted. If we truly only wanted accessible="true" to be set on all TextViews for iOS, we should be explicit about it and do a platform check before setting that property. If we didn't want this to be iOS-specific, then everything is now actually working as originally intended.
For reference, this is the diff that introduced the default-accessible text - https://www.internalfb.com/diff/D1561326, and the description makes it clear that this was only tested on iOS, and the behavior was explicitly trying to map to iOS norms such as not allowing nested accessible elements.
Changelog:
[Android][Fixed] Make Text not focusable by default
Reviewed By: ryancat
Differential Revision: D36991394
fbshipit-source-id: c45d2ada72bb2d6ffeee6947d676a07fb8899449
Saadnajmi pushed a commit to Saadnajmi/react-native-macos that referenced this pull request Jan 15, 2023
…ality when disabled (react#33076)
Summary:
This issue fixesreact#30937fixesreact#30947fixesreact#30840 ([Test Case 7.1][7.1], [Test Case 7.3][7.3], [Test Case 7.5][7.5]) .
The issue is caused by:
1) The missing javascript logic on the `accessibilityState` in the Text component fabOnReact@6ab7ab3 (as previously implemented in [Button][20]).
2) The missing setter for prop `accessible` in `ReactTextAnchorViewManager` fabOnReact@17095c6 (More information in previous PR react#31252)
Related PR react#33070 PR callstack/react-native-slider#354
[20]: https://github.com/facebook/react-native/pull/31001/files#diff-4f225d043edf4cf5b8288285b6a957e2187fc0242f240bde396e41c4c25e4124R281-R289
[Android] [Fixed] - Text Component does not announce disabled and disables click functionality when disabled
Pull Request resolved: react#33076
Test Plan:
[1]. Text has `disabled` and `accessibilityState={{disabled: false}}` ([link][1])
[2]. Text has `disabled` ([link][2])
[3]. Text has `accessibilityState={{disabled: true}}` ([link][3])
[4]. Text has `accessibilityState={{disabled:false}}` ([link][4])
[5]. Text has `disabled={false}` and `accessibilityState={{disabled:true}}` ([link][5])
[6]. Text has `accessibilityState={{disabled:true}}` and method `setAccessible` in `ReactTextAnchorViewManager` (tested on commit [b4cd8][10]) ([link][6])
7. Test Cases on the main branch
[7.1]. Text has `disabled` and `accessibilityState={{disabled: false}}` ([link][7.1])
[7.3] Text has `accessibilityState={{disabled: true}}` ([link][7.3])
[7.5] Text has `disabled={false}` and `accessibilityState={{disabled:true}}` ([link][7.5])
[7.6] Text has `onPress callback` and `accessibilityState={{disabled: true}}` ([link][7.6])
[7.7] Text has `accessibilityState={{disabled:true}}` and no method `setAccessible` in `ReactTextAnchorViewManager` (tested on commit [c4f98dd][11]) ([link][7.7])
[1]: fabOnReact/react-native-notes#1 (comment)
[2]: fabOnReact/react-native-notes#1 (comment)
[3]: fabOnReact/react-native-notes#1 (comment)
[4]: fabOnReact/react-native-notes#1 (comment)
[5]: fabOnReact/react-native-notes#1 (comment)
[6]: fabOnReact/react-native-notes#1 (comment)
[7.1]: fabOnReact/react-native-notes#1 (comment)
[7.3]: fabOnReact/react-native-notes#1 (comment)
[7.5]: fabOnReact/react-native-notes#1 (comment)
[7.6]: fabOnReact/react-native-notes#1 (comment)
[7.7]: fabOnReact/react-native-notes#1 (comment)
[10]: react@17095c6
[11]: react@6ab7ab3
Reviewed By: blavalla
Differential Revision: D34211793
Pulled By: ShikaSD
fbshipit-source-id: e153fb48c194f5884e30beb9172e66aca7ce1a41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AccessibilityBugCLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.MergedThis PR has been merged.Platform: AndroidAndroid applications.Shared with MetaApplied via automation to indicate that an Issue or Pull Request has been shared with the team.

Projects

None yet

5 participants

@fabOnReact@analysis-bot@facebook-github-bot@react-native-bot@blavalla
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Text Component does not announce disabled and disables click functionality when disabled - #33076

Closed
fabOnReact wants to merge 4 commits into
react:mainfrom
fabOnReact:text-input-announce-disabled
Closed

Text Component does not announce disabled and disables click functionality when disabled#33076
fabOnReact wants to merge 4 commits into
react:mainfrom
fabOnReact:text-input-announce-disabled

Conversation

@fabOnReact

@fabOnReactfabOnReact commented Feb 9, 2022

Copy link
Copy Markdown
Contributor

Summary

This issue fixes#30937fixes#30947fixes#30840 (Test Case 7.1, Test Case 7.3, Test Case 7.5) .
The issue is caused by:

  1. The missing javascript logic on the accessibilityState in the Text component fabOnReact@6ab7ab3 (as previously implemented in Button).
  2. The missing setter for prop accessible in ReactTextAnchorViewManagerfabOnReact@17095c6 (More information in previous PR [Accessibility] Fix Image does not announce "disabled" #31252)

Related PR #33070 PR callstack/react-native-slider#354

Changelog

[Android] [Fixed] - Text Component does not announce disabled and disables click functionality when disabled

Test Plan

1. Text has disabled and accessibilityState={{disabled: false}} (link)
2. Text has disabled (link)
3. Text has accessibilityState={{disabled: true}} (link)
4. Text has accessibilityState={{disabled:false}} (link)
5. Text has disabled={false} and accessibilityState={{disabled:true}} (link)
6. Text has accessibilityState={{disabled:true}} and method setAccessible in ReactTextAnchorViewManager (tested on commit b4cd8) (link)
7. Test Cases on the main branch
7.1. Text has disabled and accessibilityState={{disabled: false}} (link)
7.3 Text has accessibilityState={{disabled: true}} (link)
7.5 Text has disabled={false} and accessibilityState={{disabled:true}} (link)
7.6 Text has onPress callback and accessibilityState={{disabled: true}} (link)
7.7 Text has accessibilityState={{disabled:true}} and no method setAccessible in ReactTextAnchorViewManager (tested on commit c4f98dd) (link)

Adding the prop `accessible` to `ReactTextAnchorViewManager` fixes the problem for this component.
The same solution from my previous pr react#30935 (comment).
See test case at fabOnReact/react-native-notes#1 (comment)
Adding the prop `accessible` to `ReactTextAnchorViewManager` fixes the problem for this component.
The same solution from my previous pr react#30935 (comment).
See test case at fabOnReact/react-native-notes#1 (comment)666647e
@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Feb 9, 2022
@react-native-botreact-native-bot added Bug Platform: Android Android applications. labels Feb 9, 2022
@analysis-bot

Copy link
Copy Markdown
PlatformEngineArchSize (bytes)Diff
ios-universaln/a--

Base commit: 97064ae
Branch: main

@analysis-bot

Copy link
Copy Markdown
PlatformEngineArchSize (bytes)Diff
androidhermesarm64-v8a8,120,598-401
androidhermesarmeabi-v7a7,721,963-539
androidhermesx868,491,382-364
androidhermesx86_648,443,204-333
androidjscarm64-v8a9,787,227-638
androidjscarmeabi-v7a8,773,462-782
androidjscx869,754,605-590
androidjscx86_6410,350,527-564

Base commit: 97064ae
Branch: main

@fabOnReact
fabOnReact marked this pull request as ready for review February 11, 2022 06:30
@facebook-github-botfacebook-github-bot added the Shared with Meta Applied via automation to indicate that an Issue or Pull Request has been shared with the team. label Feb 11, 2022

@blavallablavalla left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code and test cases look good to me.

I'm curious why the change in ReactTextAnchorViewManager was needed. What would happen without this change? It doesn't seem like it should've made a difference, since the "disabled" attribute in Android shouldn't affect focusability of an element, although it does seem weird that it was missing, so maybe it was just fixing another bug.

@fabOnReact

fabOnReact commented Feb 14, 2022

Copy link
Copy Markdown
ContributorAuthor

Thanks @blavalla

What would happen without this change?

The Text component would not announce disabled.

DOES NOT ANNOUNCE DISABLED

notAnnounceDisabled.mp4

ANNOUNCES DISABLED

announcesDisabled.mp4

The change was already introduced in the Image Component with my PR #31252.

I added two additional tests cases to the Pull Request Summary (test case 6 and test case 7.7).

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@ShikaSD has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@react-native-bot

Copy link
Copy Markdown
Collaborator

This pull request was successfully merged by @fabriziobertoglio1987 in 7b2d817.

When will my fix make it into a release? | Upcoming Releases

@react-native-botreact-native-bot added the Merged This PR has been merged. label Feb 15, 2022
facebook-github-bot pushed a commit that referenced this pull request Jun 9, 2022
…cus to true
Summary:
[A recent fix](#33076) to Android to set focusable to true when accessible is true, and this caused several components not to work correctly.
This JS change essentially reverts the default back to Text not being focusable unless it is explicitly set. Android's "auto" behavior is better than setting `accessible=true`, and it's also the behavior React Native has had since accessibility on Android was implemented.
# Wall of Text Explanation
Explanation From Brett's comment [here](https://www.internalfb.com/diff/D35908559?dst_version_fbid=700876567897063&transaction_fbid=477905564133412)
blavalla
Generally speaking, "accessible" in react native maps to "focusable" in Android views, and the default value for "focusabe" for a TextView (and actually all views) is "auto" not "false". The difference here is that "false" is telling the system to explicitly disallow focus on this element, where as "auto" is telling the system that it's up to whatever service is trying to focus to determine if it should or not.
In the case of text, Talkback generally does default to focusing on Text when it's set to "auto", though it also does try to combine this text together with other not-explicitly focusable siblings and roll the focus up to some common ancestor element.
In the case of TetraButton here, I would expect the default behavior would be that the text is "auto" focusable, so Talkback would combine the text here with the parent <TetraPressable> (which is explicitly focusable via accessible="true").
...
[This diff](#33076) was to fix the issue with "disabled" not properly announcing on text views, which was commonly occuring due to the description-combining feature described above. Basically, when Talkback decides to combine not-explicitly-focusable elements together, it ignores properties like "disabled", "selected", etc. so when combined only the text is transferred.
The "fix" here was to make sure that if disabled was set, that an element was always explicitly focusable so that it wouldn't be eligible to be combined with others. I think that as a general concept makes sense, but the fix actually surfaced an issue that is likely a much older bug.
This line in <Text>
```
accessible={accessible !== false}
```
Is basically always setting accessible="true" unless it's explicitly set to false, and has been in there for years. It was likely added to force text to be accessible by default for iOS. But until [this diff](#33076) this line was basically a no-op for Android, since setting accessible="true" on text would do nothing at all.
[This diff](#33076) changed this so that setting accessible="true" worked how you'd expect, by making the view explicitly focusable, which was necessary for the disabled behavior to work properly. But that means that now by default all text views are explicitly focusable on both iOS and Android, and this there is likely many components that were built that don't expect this to be the case.
It doesn't seem like the right fix here is to revert this behavior to its previous state, as it wasn't working how anyone would expect it to if they looked at the code, and it seems like we were relying on some fairly undocumented behavior of Talkback to get it to work how we wanted. If we truly only wanted accessible="true" to be set on all TextViews for iOS, we should be explicit about it and do a platform check before setting that property. If we didn't want this to be iOS-specific, then everything is now actually working as originally intended.
For reference, this is the diff that introduced the default-accessible text - https://www.internalfb.com/diff/D1561326, and the description makes it clear that this was only tested on iOS, and the behavior was explicitly trying to map to iOS norms such as not allowing nested accessible elements.
Changelog:
[Android][Fixed] Make Text not focusable by default
Reviewed By: ryancat
Differential Revision: D36991394
fbshipit-source-id: c45d2ada72bb2d6ffeee6947d676a07fb8899449
Saadnajmi pushed a commit to Saadnajmi/react-native-macos that referenced this pull request Jan 15, 2023
…ality when disabled (react#33076)
Summary:
This issue fixesreact#30937fixesreact#30947fixesreact#30840 ([Test Case 7.1][7.1], [Test Case 7.3][7.3], [Test Case 7.5][7.5]) .
The issue is caused by:
1) The missing javascript logic on the `accessibilityState` in the Text component fabOnReact@6ab7ab3 (as previously implemented in [Button][20]).
2) The missing setter for prop `accessible` in `ReactTextAnchorViewManager` fabOnReact@17095c6 (More information in previous PR react#31252)
Related PR react#33070 PR callstack/react-native-slider#354
[20]: https://github.com/facebook/react-native/pull/31001/files#diff-4f225d043edf4cf5b8288285b6a957e2187fc0242f240bde396e41c4c25e4124R281-R289
[Android] [Fixed] - Text Component does not announce disabled and disables click functionality when disabled
Pull Request resolved: react#33076
Test Plan:
[1]. Text has `disabled` and `accessibilityState={{disabled: false}}` ([link][1])
[2]. Text has `disabled` ([link][2])
[3]. Text has `accessibilityState={{disabled: true}}` ([link][3])
[4]. Text has `accessibilityState={{disabled:false}}` ([link][4])
[5]. Text has `disabled={false}` and `accessibilityState={{disabled:true}}` ([link][5])
[6]. Text has `accessibilityState={{disabled:true}}` and method `setAccessible` in `ReactTextAnchorViewManager` (tested on commit [b4cd8][10]) ([link][6])
7. Test Cases on the main branch
[7.1]. Text has `disabled` and `accessibilityState={{disabled: false}}` ([link][7.1])
[7.3] Text has `accessibilityState={{disabled: true}}` ([link][7.3])
[7.5] Text has `disabled={false}` and `accessibilityState={{disabled:true}}` ([link][7.5])
[7.6] Text has `onPress callback` and `accessibilityState={{disabled: true}}` ([link][7.6])
[7.7] Text has `accessibilityState={{disabled:true}}` and no method `setAccessible` in `ReactTextAnchorViewManager` (tested on commit [c4f98dd][11]) ([link][7.7])
[1]: fabOnReact/react-native-notes#1 (comment)
[2]: fabOnReact/react-native-notes#1 (comment)
[3]: fabOnReact/react-native-notes#1 (comment)
[4]: fabOnReact/react-native-notes#1 (comment)
[5]: fabOnReact/react-native-notes#1 (comment)
[6]: fabOnReact/react-native-notes#1 (comment)
[7.1]: fabOnReact/react-native-notes#1 (comment)
[7.3]: fabOnReact/react-native-notes#1 (comment)
[7.5]: fabOnReact/react-native-notes#1 (comment)
[7.6]: fabOnReact/react-native-notes#1 (comment)
[7.7]: fabOnReact/react-native-notes#1 (comment)
[10]: react@17095c6
[11]: react@6ab7ab3
Reviewed By: blavalla
Differential Revision: D34211793
Pulled By: ShikaSD
fbshipit-source-id: e153fb48c194f5884e30beb9172e66aca7ce1a41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AccessibilityBugCLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.MergedThis PR has been merged.Platform: AndroidAndroid applications.Shared with MetaApplied via automation to indicate that an Issue or Pull Request has been shared with the team.

Projects

None yet

5 participants

@fabOnReact@analysis-bot@facebook-github-bot@react-native-bot@blavalla
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Text Component does not announce disabled and disables click functionality when disabled - #33076

Closed
fabOnReact wants to merge 4 commits into
react:mainfrom
fabOnReact:text-input-announce-disabled
Closed

Text Component does not announce disabled and disables click functionality when disabled#33076
fabOnReact wants to merge 4 commits into
react:mainfrom
fabOnReact:text-input-announce-disabled

Conversation

@fabOnReact

@fabOnReactfabOnReact commented Feb 9, 2022

Copy link
Copy Markdown
Contributor

Summary

This issue fixes#30937fixes#30947fixes#30840 (Test Case 7.1, Test Case 7.3, Test Case 7.5) .
The issue is caused by:

  1. The missing javascript logic on the accessibilityState in the Text component fabOnReact@6ab7ab3 (as previously implemented in Button).
  2. The missing setter for prop accessible in ReactTextAnchorViewManagerfabOnReact@17095c6 (More information in previous PR [Accessibility] Fix Image does not announce "disabled" #31252)

Related PR #33070 PR callstack/react-native-slider#354

Changelog

[Android] [Fixed] - Text Component does not announce disabled and disables click functionality when disabled

Test Plan

1. Text has disabled and accessibilityState={{disabled: false}} (link)
2. Text has disabled (link)
3. Text has accessibilityState={{disabled: true}} (link)
4. Text has accessibilityState={{disabled:false}} (link)
5. Text has disabled={false} and accessibilityState={{disabled:true}} (link)
6. Text has accessibilityState={{disabled:true}} and method setAccessible in ReactTextAnchorViewManager (tested on commit b4cd8) (link)
7. Test Cases on the main branch
7.1. Text has disabled and accessibilityState={{disabled: false}} (link)
7.3 Text has accessibilityState={{disabled: true}} (link)
7.5 Text has disabled={false} and accessibilityState={{disabled:true}} (link)
7.6 Text has onPress callback and accessibilityState={{disabled: true}} (link)
7.7 Text has accessibilityState={{disabled:true}} and no method setAccessible in ReactTextAnchorViewManager (tested on commit c4f98dd) (link)

Adding the prop `accessible` to `ReactTextAnchorViewManager` fixes the problem for this component.
The same solution from my previous pr react#30935 (comment).
See test case at fabOnReact/react-native-notes#1 (comment)
Adding the prop `accessible` to `ReactTextAnchorViewManager` fixes the problem for this component.
The same solution from my previous pr react#30935 (comment).
See test case at fabOnReact/react-native-notes#1 (comment)666647e
@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Feb 9, 2022
@react-native-botreact-native-bot added Bug Platform: Android Android applications. labels Feb 9, 2022
@analysis-bot

Copy link
Copy Markdown
PlatformEngineArchSize (bytes)Diff
ios-universaln/a--

Base commit: 97064ae
Branch: main

@analysis-bot

Copy link
Copy Markdown
PlatformEngineArchSize (bytes)Diff
androidhermesarm64-v8a8,120,598-401
androidhermesarmeabi-v7a7,721,963-539
androidhermesx868,491,382-364
androidhermesx86_648,443,204-333
androidjscarm64-v8a9,787,227-638
androidjscarmeabi-v7a8,773,462-782
androidjscx869,754,605-590
androidjscx86_6410,350,527-564

Base commit: 97064ae
Branch: main

@fabOnReact
fabOnReact marked this pull request as ready for review February 11, 2022 06:30
@facebook-github-botfacebook-github-bot added the Shared with Meta Applied via automation to indicate that an Issue or Pull Request has been shared with the team. label Feb 11, 2022

@blavallablavalla left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code and test cases look good to me.

I'm curious why the change in ReactTextAnchorViewManager was needed. What would happen without this change? It doesn't seem like it should've made a difference, since the "disabled" attribute in Android shouldn't affect focusability of an element, although it does seem weird that it was missing, so maybe it was just fixing another bug.

@fabOnReact

fabOnReact commented Feb 14, 2022

Copy link
Copy Markdown
ContributorAuthor

Thanks @blavalla

What would happen without this change?

The Text component would not announce disabled.

DOES NOT ANNOUNCE DISABLED

notAnnounceDisabled.mp4

ANNOUNCES DISABLED

announcesDisabled.mp4

The change was already introduced in the Image Component with my PR #31252.

I added two additional tests cases to the Pull Request Summary (test case 6 and test case 7.7).

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@ShikaSD has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@react-native-bot

Copy link
Copy Markdown
Collaborator

This pull request was successfully merged by @fabriziobertoglio1987 in 7b2d817.

When will my fix make it into a release? | Upcoming Releases

@react-native-botreact-native-bot added the Merged This PR has been merged. label Feb 15, 2022
facebook-github-bot pushed a commit that referenced this pull request Jun 9, 2022
…cus to true
Summary:
[A recent fix](#33076) to Android to set focusable to true when accessible is true, and this caused several components not to work correctly.
This JS change essentially reverts the default back to Text not being focusable unless it is explicitly set. Android's "auto" behavior is better than setting `accessible=true`, and it's also the behavior React Native has had since accessibility on Android was implemented.
# Wall of Text Explanation
Explanation From Brett's comment [here](https://www.internalfb.com/diff/D35908559?dst_version_fbid=700876567897063&transaction_fbid=477905564133412)
blavalla
Generally speaking, "accessible" in react native maps to "focusable" in Android views, and the default value for "focusabe" for a TextView (and actually all views) is "auto" not "false". The difference here is that "false" is telling the system to explicitly disallow focus on this element, where as "auto" is telling the system that it's up to whatever service is trying to focus to determine if it should or not.
In the case of text, Talkback generally does default to focusing on Text when it's set to "auto", though it also does try to combine this text together with other not-explicitly focusable siblings and roll the focus up to some common ancestor element.
In the case of TetraButton here, I would expect the default behavior would be that the text is "auto" focusable, so Talkback would combine the text here with the parent <TetraPressable> (which is explicitly focusable via accessible="true").
...
[This diff](#33076) was to fix the issue with "disabled" not properly announcing on text views, which was commonly occuring due to the description-combining feature described above. Basically, when Talkback decides to combine not-explicitly-focusable elements together, it ignores properties like "disabled", "selected", etc. so when combined only the text is transferred.
The "fix" here was to make sure that if disabled was set, that an element was always explicitly focusable so that it wouldn't be eligible to be combined with others. I think that as a general concept makes sense, but the fix actually surfaced an issue that is likely a much older bug.
This line in <Text>
```
accessible={accessible !== false}
```
Is basically always setting accessible="true" unless it's explicitly set to false, and has been in there for years. It was likely added to force text to be accessible by default for iOS. But until [this diff](#33076) this line was basically a no-op for Android, since setting accessible="true" on text would do nothing at all.
[This diff](#33076) changed this so that setting accessible="true" worked how you'd expect, by making the view explicitly focusable, which was necessary for the disabled behavior to work properly. But that means that now by default all text views are explicitly focusable on both iOS and Android, and this there is likely many components that were built that don't expect this to be the case.
It doesn't seem like the right fix here is to revert this behavior to its previous state, as it wasn't working how anyone would expect it to if they looked at the code, and it seems like we were relying on some fairly undocumented behavior of Talkback to get it to work how we wanted. If we truly only wanted accessible="true" to be set on all TextViews for iOS, we should be explicit about it and do a platform check before setting that property. If we didn't want this to be iOS-specific, then everything is now actually working as originally intended.
For reference, this is the diff that introduced the default-accessible text - https://www.internalfb.com/diff/D1561326, and the description makes it clear that this was only tested on iOS, and the behavior was explicitly trying to map to iOS norms such as not allowing nested accessible elements.
Changelog:
[Android][Fixed] Make Text not focusable by default
Reviewed By: ryancat
Differential Revision: D36991394
fbshipit-source-id: c45d2ada72bb2d6ffeee6947d676a07fb8899449
Saadnajmi pushed a commit to Saadnajmi/react-native-macos that referenced this pull request Jan 15, 2023
…ality when disabled (react#33076)
Summary:
This issue fixesreact#30937fixesreact#30947fixesreact#30840 ([Test Case 7.1][7.1], [Test Case 7.3][7.3], [Test Case 7.5][7.5]) .
The issue is caused by:
1) The missing javascript logic on the `accessibilityState` in the Text component fabOnReact@6ab7ab3 (as previously implemented in [Button][20]).
2) The missing setter for prop `accessible` in `ReactTextAnchorViewManager` fabOnReact@17095c6 (More information in previous PR react#31252)
Related PR react#33070 PR callstack/react-native-slider#354
[20]: https://github.com/facebook/react-native/pull/31001/files#diff-4f225d043edf4cf5b8288285b6a957e2187fc0242f240bde396e41c4c25e4124R281-R289
[Android] [Fixed] - Text Component does not announce disabled and disables click functionality when disabled
Pull Request resolved: react#33076
Test Plan:
[1]. Text has `disabled` and `accessibilityState={{disabled: false}}` ([link][1])
[2]. Text has `disabled` ([link][2])
[3]. Text has `accessibilityState={{disabled: true}}` ([link][3])
[4]. Text has `accessibilityState={{disabled:false}}` ([link][4])
[5]. Text has `disabled={false}` and `accessibilityState={{disabled:true}}` ([link][5])
[6]. Text has `accessibilityState={{disabled:true}}` and method `setAccessible` in `ReactTextAnchorViewManager` (tested on commit [b4cd8][10]) ([link][6])
7. Test Cases on the main branch
[7.1]. Text has `disabled` and `accessibilityState={{disabled: false}}` ([link][7.1])
[7.3] Text has `accessibilityState={{disabled: true}}` ([link][7.3])
[7.5] Text has `disabled={false}` and `accessibilityState={{disabled:true}}` ([link][7.5])
[7.6] Text has `onPress callback` and `accessibilityState={{disabled: true}}` ([link][7.6])
[7.7] Text has `accessibilityState={{disabled:true}}` and no method `setAccessible` in `ReactTextAnchorViewManager` (tested on commit [c4f98dd][11]) ([link][7.7])
[1]: fabOnReact/react-native-notes#1 (comment)
[2]: fabOnReact/react-native-notes#1 (comment)
[3]: fabOnReact/react-native-notes#1 (comment)
[4]: fabOnReact/react-native-notes#1 (comment)
[5]: fabOnReact/react-native-notes#1 (comment)
[6]: fabOnReact/react-native-notes#1 (comment)
[7.1]: fabOnReact/react-native-notes#1 (comment)
[7.3]: fabOnReact/react-native-notes#1 (comment)
[7.5]: fabOnReact/react-native-notes#1 (comment)
[7.6]: fabOnReact/react-native-notes#1 (comment)
[7.7]: fabOnReact/react-native-notes#1 (comment)
[10]: react@17095c6
[11]: react@6ab7ab3
Reviewed By: blavalla
Differential Revision: D34211793
Pulled By: ShikaSD
fbshipit-source-id: e153fb48c194f5884e30beb9172e66aca7ce1a41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AccessibilityBugCLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.MergedThis PR has been merged.Platform: AndroidAndroid applications.Shared with MetaApplied via automation to indicate that an Issue or Pull Request has been shared with the team.

Projects

None yet

5 participants

@fabOnReact@analysis-bot@facebook-github-bot@react-native-bot@blavalla
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Text Component does not announce disabled and disables click functionality when disabled - #33076

Closed
fabOnReact wants to merge 4 commits into
react:mainfrom
fabOnReact:text-input-announce-disabled
Closed

Text Component does not announce disabled and disables click functionality when disabled#33076
fabOnReact wants to merge 4 commits into
react:mainfrom
fabOnReact:text-input-announce-disabled

Conversation

@fabOnReact

@fabOnReactfabOnReact commented Feb 9, 2022

Copy link
Copy Markdown
Contributor

Summary

This issue fixes#30937fixes#30947fixes#30840 (Test Case 7.1, Test Case 7.3, Test Case 7.5) .
The issue is caused by:

  1. The missing javascript logic on the accessibilityState in the Text component fabOnReact@6ab7ab3 (as previously implemented in Button).
  2. The missing setter for prop accessible in ReactTextAnchorViewManagerfabOnReact@17095c6 (More information in previous PR [Accessibility] Fix Image does not announce "disabled" #31252)

Related PR #33070 PR callstack/react-native-slider#354

Changelog

[Android] [Fixed] - Text Component does not announce disabled and disables click functionality when disabled

Test Plan

1. Text has disabled and accessibilityState={{disabled: false}} (link)
2. Text has disabled (link)
3. Text has accessibilityState={{disabled: true}} (link)
4. Text has accessibilityState={{disabled:false}} (link)
5. Text has disabled={false} and accessibilityState={{disabled:true}} (link)
6. Text has accessibilityState={{disabled:true}} and method setAccessible in ReactTextAnchorViewManager (tested on commit b4cd8) (link)
7. Test Cases on the main branch
7.1. Text has disabled and accessibilityState={{disabled: false}} (link)
7.3 Text has accessibilityState={{disabled: true}} (link)
7.5 Text has disabled={false} and accessibilityState={{disabled:true}} (link)
7.6 Text has onPress callback and accessibilityState={{disabled: true}} (link)
7.7 Text has accessibilityState={{disabled:true}} and no method setAccessible in ReactTextAnchorViewManager (tested on commit c4f98dd) (link)

Adding the prop `accessible` to `ReactTextAnchorViewManager` fixes the problem for this component.
The same solution from my previous pr react#30935 (comment).
See test case at fabOnReact/react-native-notes#1 (comment)
Adding the prop `accessible` to `ReactTextAnchorViewManager` fixes the problem for this component.
The same solution from my previous pr react#30935 (comment).
See test case at fabOnReact/react-native-notes#1 (comment)666647e
@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Feb 9, 2022
@react-native-botreact-native-bot added Bug Platform: Android Android applications. labels Feb 9, 2022
@analysis-bot

Copy link
Copy Markdown
PlatformEngineArchSize (bytes)Diff
ios-universaln/a--

Base commit: 97064ae
Branch: main

@analysis-bot

Copy link
Copy Markdown
PlatformEngineArchSize (bytes)Diff
androidhermesarm64-v8a8,120,598-401
androidhermesarmeabi-v7a7,721,963-539
androidhermesx868,491,382-364
androidhermesx86_648,443,204-333
androidjscarm64-v8a9,787,227-638
androidjscarmeabi-v7a8,773,462-782
androidjscx869,754,605-590
androidjscx86_6410,350,527-564

Base commit: 97064ae
Branch: main

@fabOnReact
fabOnReact marked this pull request as ready for review February 11, 2022 06:30
@facebook-github-botfacebook-github-bot added the Shared with Meta Applied via automation to indicate that an Issue or Pull Request has been shared with the team. label Feb 11, 2022

@blavallablavalla left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code and test cases look good to me.

I'm curious why the change in ReactTextAnchorViewManager was needed. What would happen without this change? It doesn't seem like it should've made a difference, since the "disabled" attribute in Android shouldn't affect focusability of an element, although it does seem weird that it was missing, so maybe it was just fixing another bug.

@fabOnReact

fabOnReact commented Feb 14, 2022

Copy link
Copy Markdown
ContributorAuthor

Thanks @blavalla

What would happen without this change?

The Text component would not announce disabled.

DOES NOT ANNOUNCE DISABLED

notAnnounceDisabled.mp4

ANNOUNCES DISABLED

announcesDisabled.mp4

The change was already introduced in the Image Component with my PR #31252.

I added two additional tests cases to the Pull Request Summary (test case 6 and test case 7.7).

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@ShikaSD has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@react-native-bot

Copy link
Copy Markdown
Collaborator

This pull request was successfully merged by @fabriziobertoglio1987 in 7b2d817.

When will my fix make it into a release? | Upcoming Releases

@react-native-botreact-native-bot added the Merged This PR has been merged. label Feb 15, 2022
facebook-github-bot pushed a commit that referenced this pull request Jun 9, 2022
…cus to true
Summary:
[A recent fix](#33076) to Android to set focusable to true when accessible is true, and this caused several components not to work correctly.
This JS change essentially reverts the default back to Text not being focusable unless it is explicitly set. Android's "auto" behavior is better than setting `accessible=true`, and it's also the behavior React Native has had since accessibility on Android was implemented.
# Wall of Text Explanation
Explanation From Brett's comment [here](https://www.internalfb.com/diff/D35908559?dst_version_fbid=700876567897063&transaction_fbid=477905564133412)
blavalla
Generally speaking, "accessible" in react native maps to "focusable" in Android views, and the default value for "focusabe" for a TextView (and actually all views) is "auto" not "false". The difference here is that "false" is telling the system to explicitly disallow focus on this element, where as "auto" is telling the system that it's up to whatever service is trying to focus to determine if it should or not.
In the case of text, Talkback generally does default to focusing on Text when it's set to "auto", though it also does try to combine this text together with other not-explicitly focusable siblings and roll the focus up to some common ancestor element.
In the case of TetraButton here, I would expect the default behavior would be that the text is "auto" focusable, so Talkback would combine the text here with the parent <TetraPressable> (which is explicitly focusable via accessible="true").
...
[This diff](#33076) was to fix the issue with "disabled" not properly announcing on text views, which was commonly occuring due to the description-combining feature described above. Basically, when Talkback decides to combine not-explicitly-focusable elements together, it ignores properties like "disabled", "selected", etc. so when combined only the text is transferred.
The "fix" here was to make sure that if disabled was set, that an element was always explicitly focusable so that it wouldn't be eligible to be combined with others. I think that as a general concept makes sense, but the fix actually surfaced an issue that is likely a much older bug.
This line in <Text>
```
accessible={accessible !== false}
```
Is basically always setting accessible="true" unless it's explicitly set to false, and has been in there for years. It was likely added to force text to be accessible by default for iOS. But until [this diff](#33076) this line was basically a no-op for Android, since setting accessible="true" on text would do nothing at all.
[This diff](#33076) changed this so that setting accessible="true" worked how you'd expect, by making the view explicitly focusable, which was necessary for the disabled behavior to work properly. But that means that now by default all text views are explicitly focusable on both iOS and Android, and this there is likely many components that were built that don't expect this to be the case.
It doesn't seem like the right fix here is to revert this behavior to its previous state, as it wasn't working how anyone would expect it to if they looked at the code, and it seems like we were relying on some fairly undocumented behavior of Talkback to get it to work how we wanted. If we truly only wanted accessible="true" to be set on all TextViews for iOS, we should be explicit about it and do a platform check before setting that property. If we didn't want this to be iOS-specific, then everything is now actually working as originally intended.
For reference, this is the diff that introduced the default-accessible text - https://www.internalfb.com/diff/D1561326, and the description makes it clear that this was only tested on iOS, and the behavior was explicitly trying to map to iOS norms such as not allowing nested accessible elements.
Changelog:
[Android][Fixed] Make Text not focusable by default
Reviewed By: ryancat
Differential Revision: D36991394
fbshipit-source-id: c45d2ada72bb2d6ffeee6947d676a07fb8899449
Saadnajmi pushed a commit to Saadnajmi/react-native-macos that referenced this pull request Jan 15, 2023
…ality when disabled (react#33076)
Summary:
This issue fixesreact#30937fixesreact#30947fixesreact#30840 ([Test Case 7.1][7.1], [Test Case 7.3][7.3], [Test Case 7.5][7.5]) .
The issue is caused by:
1) The missing javascript logic on the `accessibilityState` in the Text component fabOnReact@6ab7ab3 (as previously implemented in [Button][20]).
2) The missing setter for prop `accessible` in `ReactTextAnchorViewManager` fabOnReact@17095c6 (More information in previous PR react#31252)
Related PR react#33070 PR callstack/react-native-slider#354
[20]: https://github.com/facebook/react-native/pull/31001/files#diff-4f225d043edf4cf5b8288285b6a957e2187fc0242f240bde396e41c4c25e4124R281-R289
[Android] [Fixed] - Text Component does not announce disabled and disables click functionality when disabled
Pull Request resolved: react#33076
Test Plan:
[1]. Text has `disabled` and `accessibilityState={{disabled: false}}` ([link][1])
[2]. Text has `disabled` ([link][2])
[3]. Text has `accessibilityState={{disabled: true}}` ([link][3])
[4]. Text has `accessibilityState={{disabled:false}}` ([link][4])
[5]. Text has `disabled={false}` and `accessibilityState={{disabled:true}}` ([link][5])
[6]. Text has `accessibilityState={{disabled:true}}` and method `setAccessible` in `ReactTextAnchorViewManager` (tested on commit [b4cd8][10]) ([link][6])
7. Test Cases on the main branch
[7.1]. Text has `disabled` and `accessibilityState={{disabled: false}}` ([link][7.1])
[7.3] Text has `accessibilityState={{disabled: true}}` ([link][7.3])
[7.5] Text has `disabled={false}` and `accessibilityState={{disabled:true}}` ([link][7.5])
[7.6] Text has `onPress callback` and `accessibilityState={{disabled: true}}` ([link][7.6])
[7.7] Text has `accessibilityState={{disabled:true}}` and no method `setAccessible` in `ReactTextAnchorViewManager` (tested on commit [c4f98dd][11]) ([link][7.7])
[1]: fabOnReact/react-native-notes#1 (comment)
[2]: fabOnReact/react-native-notes#1 (comment)
[3]: fabOnReact/react-native-notes#1 (comment)
[4]: fabOnReact/react-native-notes#1 (comment)
[5]: fabOnReact/react-native-notes#1 (comment)
[6]: fabOnReact/react-native-notes#1 (comment)
[7.1]: fabOnReact/react-native-notes#1 (comment)
[7.3]: fabOnReact/react-native-notes#1 (comment)
[7.5]: fabOnReact/react-native-notes#1 (comment)
[7.6]: fabOnReact/react-native-notes#1 (comment)
[7.7]: fabOnReact/react-native-notes#1 (comment)
[10]: react@17095c6
[11]: react@6ab7ab3
Reviewed By: blavalla
Differential Revision: D34211793
Pulled By: ShikaSD
fbshipit-source-id: e153fb48c194f5884e30beb9172e66aca7ce1a41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AccessibilityBugCLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.MergedThis PR has been merged.Platform: AndroidAndroid applications.Shared with MetaApplied via automation to indicate that an Issue or Pull Request has been shared with the team.

Projects

None yet

5 participants

@fabOnReact@analysis-bot@facebook-github-bot@react-native-bot@blavalla
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Text Component does not announce disabled and disables click functionality when disabled - #33076

Closed
fabOnReact wants to merge 4 commits into
react:mainfrom
fabOnReact:text-input-announce-disabled
Closed

Text Component does not announce disabled and disables click functionality when disabled#33076
fabOnReact wants to merge 4 commits into
react:mainfrom
fabOnReact:text-input-announce-disabled

Conversation

@fabOnReact

@fabOnReactfabOnReact commented Feb 9, 2022

Copy link
Copy Markdown
Contributor

Summary

This issue fixes#30937fixes#30947fixes#30840 (Test Case 7.1, Test Case 7.3, Test Case 7.5) .
The issue is caused by:

  1. The missing javascript logic on the accessibilityState in the Text component fabOnReact@6ab7ab3 (as previously implemented in Button).
  2. The missing setter for prop accessible in ReactTextAnchorViewManagerfabOnReact@17095c6 (More information in previous PR [Accessibility] Fix Image does not announce "disabled" #31252)

Related PR #33070 PR callstack/react-native-slider#354

Changelog

[Android] [Fixed] - Text Component does not announce disabled and disables click functionality when disabled

Test Plan

1. Text has disabled and accessibilityState={{disabled: false}} (link)
2. Text has disabled (link)
3. Text has accessibilityState={{disabled: true}} (link)
4. Text has accessibilityState={{disabled:false}} (link)
5. Text has disabled={false} and accessibilityState={{disabled:true}} (link)
6. Text has accessibilityState={{disabled:true}} and method setAccessible in ReactTextAnchorViewManager (tested on commit b4cd8) (link)
7. Test Cases on the main branch
7.1. Text has disabled and accessibilityState={{disabled: false}} (link)
7.3 Text has accessibilityState={{disabled: true}} (link)
7.5 Text has disabled={false} and accessibilityState={{disabled:true}} (link)
7.6 Text has onPress callback and accessibilityState={{disabled: true}} (link)
7.7 Text has accessibilityState={{disabled:true}} and no method setAccessible in ReactTextAnchorViewManager (tested on commit c4f98dd) (link)

Adding the prop `accessible` to `ReactTextAnchorViewManager` fixes the problem for this component.
The same solution from my previous pr react#30935 (comment).
See test case at fabOnReact/react-native-notes#1 (comment)
Adding the prop `accessible` to `ReactTextAnchorViewManager` fixes the problem for this component.
The same solution from my previous pr react#30935 (comment).
See test case at fabOnReact/react-native-notes#1 (comment)666647e
@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Feb 9, 2022
@react-native-botreact-native-bot added Bug Platform: Android Android applications. labels Feb 9, 2022
@analysis-bot

Copy link
Copy Markdown
PlatformEngineArchSize (bytes)Diff
ios-universaln/a--

Base commit: 97064ae
Branch: main

@analysis-bot

Copy link
Copy Markdown
PlatformEngineArchSize (bytes)Diff
androidhermesarm64-v8a8,120,598-401
androidhermesarmeabi-v7a7,721,963-539
androidhermesx868,491,382-364
androidhermesx86_648,443,204-333
androidjscarm64-v8a9,787,227-638
androidjscarmeabi-v7a8,773,462-782
androidjscx869,754,605-590
androidjscx86_6410,350,527-564

Base commit: 97064ae
Branch: main

@fabOnReact
fabOnReact marked this pull request as ready for review February 11, 2022 06:30
@facebook-github-botfacebook-github-bot added the Shared with Meta Applied via automation to indicate that an Issue or Pull Request has been shared with the team. label Feb 11, 2022

@blavallablavalla left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code and test cases look good to me.

I'm curious why the change in ReactTextAnchorViewManager was needed. What would happen without this change? It doesn't seem like it should've made a difference, since the "disabled" attribute in Android shouldn't affect focusability of an element, although it does seem weird that it was missing, so maybe it was just fixing another bug.

@fabOnReact

fabOnReact commented Feb 14, 2022

Copy link
Copy Markdown
ContributorAuthor

Thanks @blavalla

What would happen without this change?

The Text component would not announce disabled.

DOES NOT ANNOUNCE DISABLED

notAnnounceDisabled.mp4

ANNOUNCES DISABLED

announcesDisabled.mp4

The change was already introduced in the Image Component with my PR #31252.

I added two additional tests cases to the Pull Request Summary (test case 6 and test case 7.7).

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@ShikaSD has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@react-native-bot

Copy link
Copy Markdown
Collaborator

This pull request was successfully merged by @fabriziobertoglio1987 in 7b2d817.

When will my fix make it into a release? | Upcoming Releases

@react-native-botreact-native-bot added the Merged This PR has been merged. label Feb 15, 2022
facebook-github-bot pushed a commit that referenced this pull request Jun 9, 2022
…cus to true
Summary:
[A recent fix](#33076) to Android to set focusable to true when accessible is true, and this caused several components not to work correctly.
This JS change essentially reverts the default back to Text not being focusable unless it is explicitly set. Android's "auto" behavior is better than setting `accessible=true`, and it's also the behavior React Native has had since accessibility on Android was implemented.
# Wall of Text Explanation
Explanation From Brett's comment [here](https://www.internalfb.com/diff/D35908559?dst_version_fbid=700876567897063&transaction_fbid=477905564133412)
blavalla
Generally speaking, "accessible" in react native maps to "focusable" in Android views, and the default value for "focusabe" for a TextView (and actually all views) is "auto" not "false". The difference here is that "false" is telling the system to explicitly disallow focus on this element, where as "auto" is telling the system that it's up to whatever service is trying to focus to determine if it should or not.
In the case of text, Talkback generally does default to focusing on Text when it's set to "auto", though it also does try to combine this text together with other not-explicitly focusable siblings and roll the focus up to some common ancestor element.
In the case of TetraButton here, I would expect the default behavior would be that the text is "auto" focusable, so Talkback would combine the text here with the parent <TetraPressable> (which is explicitly focusable via accessible="true").
...
[This diff](#33076) was to fix the issue with "disabled" not properly announcing on text views, which was commonly occuring due to the description-combining feature described above. Basically, when Talkback decides to combine not-explicitly-focusable elements together, it ignores properties like "disabled", "selected", etc. so when combined only the text is transferred.
The "fix" here was to make sure that if disabled was set, that an element was always explicitly focusable so that it wouldn't be eligible to be combined with others. I think that as a general concept makes sense, but the fix actually surfaced an issue that is likely a much older bug.
This line in <Text>
```
accessible={accessible !== false}
```
Is basically always setting accessible="true" unless it's explicitly set to false, and has been in there for years. It was likely added to force text to be accessible by default for iOS. But until [this diff](#33076) this line was basically a no-op for Android, since setting accessible="true" on text would do nothing at all.
[This diff](#33076) changed this so that setting accessible="true" worked how you'd expect, by making the view explicitly focusable, which was necessary for the disabled behavior to work properly. But that means that now by default all text views are explicitly focusable on both iOS and Android, and this there is likely many components that were built that don't expect this to be the case.
It doesn't seem like the right fix here is to revert this behavior to its previous state, as it wasn't working how anyone would expect it to if they looked at the code, and it seems like we were relying on some fairly undocumented behavior of Talkback to get it to work how we wanted. If we truly only wanted accessible="true" to be set on all TextViews for iOS, we should be explicit about it and do a platform check before setting that property. If we didn't want this to be iOS-specific, then everything is now actually working as originally intended.
For reference, this is the diff that introduced the default-accessible text - https://www.internalfb.com/diff/D1561326, and the description makes it clear that this was only tested on iOS, and the behavior was explicitly trying to map to iOS norms such as not allowing nested accessible elements.
Changelog:
[Android][Fixed] Make Text not focusable by default
Reviewed By: ryancat
Differential Revision: D36991394
fbshipit-source-id: c45d2ada72bb2d6ffeee6947d676a07fb8899449
Saadnajmi pushed a commit to Saadnajmi/react-native-macos that referenced this pull request Jan 15, 2023
…ality when disabled (react#33076)
Summary:
This issue fixesreact#30937fixesreact#30947fixesreact#30840 ([Test Case 7.1][7.1], [Test Case 7.3][7.3], [Test Case 7.5][7.5]) .
The issue is caused by:
1) The missing javascript logic on the `accessibilityState` in the Text component fabOnReact@6ab7ab3 (as previously implemented in [Button][20]).
2) The missing setter for prop `accessible` in `ReactTextAnchorViewManager` fabOnReact@17095c6 (More information in previous PR react#31252)
Related PR react#33070 PR callstack/react-native-slider#354
[20]: https://github.com/facebook/react-native/pull/31001/files#diff-4f225d043edf4cf5b8288285b6a957e2187fc0242f240bde396e41c4c25e4124R281-R289
[Android] [Fixed] - Text Component does not announce disabled and disables click functionality when disabled
Pull Request resolved: react#33076
Test Plan:
[1]. Text has `disabled` and `accessibilityState={{disabled: false}}` ([link][1])
[2]. Text has `disabled` ([link][2])
[3]. Text has `accessibilityState={{disabled: true}}` ([link][3])
[4]. Text has `accessibilityState={{disabled:false}}` ([link][4])
[5]. Text has `disabled={false}` and `accessibilityState={{disabled:true}}` ([link][5])
[6]. Text has `accessibilityState={{disabled:true}}` and method `setAccessible` in `ReactTextAnchorViewManager` (tested on commit [b4cd8][10]) ([link][6])
7. Test Cases on the main branch
[7.1]. Text has `disabled` and `accessibilityState={{disabled: false}}` ([link][7.1])
[7.3] Text has `accessibilityState={{disabled: true}}` ([link][7.3])
[7.5] Text has `disabled={false}` and `accessibilityState={{disabled:true}}` ([link][7.5])
[7.6] Text has `onPress callback` and `accessibilityState={{disabled: true}}` ([link][7.6])
[7.7] Text has `accessibilityState={{disabled:true}}` and no method `setAccessible` in `ReactTextAnchorViewManager` (tested on commit [c4f98dd][11]) ([link][7.7])
[1]: fabOnReact/react-native-notes#1 (comment)
[2]: fabOnReact/react-native-notes#1 (comment)
[3]: fabOnReact/react-native-notes#1 (comment)
[4]: fabOnReact/react-native-notes#1 (comment)
[5]: fabOnReact/react-native-notes#1 (comment)
[6]: fabOnReact/react-native-notes#1 (comment)
[7.1]: fabOnReact/react-native-notes#1 (comment)
[7.3]: fabOnReact/react-native-notes#1 (comment)
[7.5]: fabOnReact/react-native-notes#1 (comment)
[7.6]: fabOnReact/react-native-notes#1 (comment)
[7.7]: fabOnReact/react-native-notes#1 (comment)
[10]: react@17095c6
[11]: react@6ab7ab3
Reviewed By: blavalla
Differential Revision: D34211793
Pulled By: ShikaSD
fbshipit-source-id: e153fb48c194f5884e30beb9172e66aca7ce1a41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AccessibilityBugCLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.MergedThis PR has been merged.Platform: AndroidAndroid applications.Shared with MetaApplied via automation to indicate that an Issue or Pull Request has been shared with the team.

Projects

None yet

5 participants

@fabOnReact@analysis-bot@facebook-github-bot@react-native-bot@blavalla
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Text Component does not announce disabled and disables click functionality when disabled - #33076

Closed
fabOnReact wants to merge 4 commits into
react:mainfrom
fabOnReact:text-input-announce-disabled
Closed

Text Component does not announce disabled and disables click functionality when disabled#33076
fabOnReact wants to merge 4 commits into
react:mainfrom
fabOnReact:text-input-announce-disabled

Conversation

@fabOnReact

@fabOnReactfabOnReact commented Feb 9, 2022

Copy link
Copy Markdown
Contributor

Summary

This issue fixes#30937fixes#30947fixes#30840 (Test Case 7.1, Test Case 7.3, Test Case 7.5) .
The issue is caused by:

  1. The missing javascript logic on the accessibilityState in the Text component fabOnReact@6ab7ab3 (as previously implemented in Button).
  2. The missing setter for prop accessible in ReactTextAnchorViewManagerfabOnReact@17095c6 (More information in previous PR [Accessibility] Fix Image does not announce "disabled" #31252)

Related PR #33070 PR callstack/react-native-slider#354

Changelog

[Android] [Fixed] - Text Component does not announce disabled and disables click functionality when disabled

Test Plan

1. Text has disabled and accessibilityState={{disabled: false}} (link)
2. Text has disabled (link)
3. Text has accessibilityState={{disabled: true}} (link)
4. Text has accessibilityState={{disabled:false}} (link)
5. Text has disabled={false} and accessibilityState={{disabled:true}} (link)
6. Text has accessibilityState={{disabled:true}} and method setAccessible in ReactTextAnchorViewManager (tested on commit b4cd8) (link)
7. Test Cases on the main branch
7.1. Text has disabled and accessibilityState={{disabled: false}} (link)
7.3 Text has accessibilityState={{disabled: true}} (link)
7.5 Text has disabled={false} and accessibilityState={{disabled:true}} (link)
7.6 Text has onPress callback and accessibilityState={{disabled: true}} (link)
7.7 Text has accessibilityState={{disabled:true}} and no method setAccessible in ReactTextAnchorViewManager (tested on commit c4f98dd) (link)

Adding the prop `accessible` to `ReactTextAnchorViewManager` fixes the problem for this component.
The same solution from my previous pr react#30935 (comment).
See test case at fabOnReact/react-native-notes#1 (comment)
Adding the prop `accessible` to `ReactTextAnchorViewManager` fixes the problem for this component.
The same solution from my previous pr react#30935 (comment).
See test case at fabOnReact/react-native-notes#1 (comment)666647e
@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Feb 9, 2022
@react-native-botreact-native-bot added Bug Platform: Android Android applications. labels Feb 9, 2022
@analysis-bot

Copy link
Copy Markdown
PlatformEngineArchSize (bytes)Diff
ios-universaln/a--

Base commit: 97064ae
Branch: main

@analysis-bot

Copy link
Copy Markdown
PlatformEngineArchSize (bytes)Diff
androidhermesarm64-v8a8,120,598-401
androidhermesarmeabi-v7a7,721,963-539
androidhermesx868,491,382-364
androidhermesx86_648,443,204-333
androidjscarm64-v8a9,787,227-638
androidjscarmeabi-v7a8,773,462-782
androidjscx869,754,605-590
androidjscx86_6410,350,527-564

Base commit: 97064ae
Branch: main

@fabOnReact
fabOnReact marked this pull request as ready for review February 11, 2022 06:30
@facebook-github-botfacebook-github-bot added the Shared with Meta Applied via automation to indicate that an Issue or Pull Request has been shared with the team. label Feb 11, 2022

@blavallablavalla left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code and test cases look good to me.

I'm curious why the change in ReactTextAnchorViewManager was needed. What would happen without this change? It doesn't seem like it should've made a difference, since the "disabled" attribute in Android shouldn't affect focusability of an element, although it does seem weird that it was missing, so maybe it was just fixing another bug.

@fabOnReact

fabOnReact commented Feb 14, 2022

Copy link
Copy Markdown
ContributorAuthor

Thanks @blavalla

What would happen without this change?

The Text component would not announce disabled.

DOES NOT ANNOUNCE DISABLED

notAnnounceDisabled.mp4

ANNOUNCES DISABLED

announcesDisabled.mp4

The change was already introduced in the Image Component with my PR #31252.

I added two additional tests cases to the Pull Request Summary (test case 6 and test case 7.7).

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@ShikaSD has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@react-native-bot

Copy link
Copy Markdown
Collaborator

This pull request was successfully merged by @fabriziobertoglio1987 in 7b2d817.

When will my fix make it into a release? | Upcoming Releases

@react-native-botreact-native-bot added the Merged This PR has been merged. label Feb 15, 2022
facebook-github-bot pushed a commit that referenced this pull request Jun 9, 2022
…cus to true
Summary:
[A recent fix](#33076) to Android to set focusable to true when accessible is true, and this caused several components not to work correctly.
This JS change essentially reverts the default back to Text not being focusable unless it is explicitly set. Android's "auto" behavior is better than setting `accessible=true`, and it's also the behavior React Native has had since accessibility on Android was implemented.
# Wall of Text Explanation
Explanation From Brett's comment [here](https://www.internalfb.com/diff/D35908559?dst_version_fbid=700876567897063&transaction_fbid=477905564133412)
blavalla
Generally speaking, "accessible" in react native maps to "focusable" in Android views, and the default value for "focusabe" for a TextView (and actually all views) is "auto" not "false". The difference here is that "false" is telling the system to explicitly disallow focus on this element, where as "auto" is telling the system that it's up to whatever service is trying to focus to determine if it should or not.
In the case of text, Talkback generally does default to focusing on Text when it's set to "auto", though it also does try to combine this text together with other not-explicitly focusable siblings and roll the focus up to some common ancestor element.
In the case of TetraButton here, I would expect the default behavior would be that the text is "auto" focusable, so Talkback would combine the text here with the parent <TetraPressable> (which is explicitly focusable via accessible="true").
...
[This diff](#33076) was to fix the issue with "disabled" not properly announcing on text views, which was commonly occuring due to the description-combining feature described above. Basically, when Talkback decides to combine not-explicitly-focusable elements together, it ignores properties like "disabled", "selected", etc. so when combined only the text is transferred.
The "fix" here was to make sure that if disabled was set, that an element was always explicitly focusable so that it wouldn't be eligible to be combined with others. I think that as a general concept makes sense, but the fix actually surfaced an issue that is likely a much older bug.
This line in <Text>
```
accessible={accessible !== false}
```
Is basically always setting accessible="true" unless it's explicitly set to false, and has been in there for years. It was likely added to force text to be accessible by default for iOS. But until [this diff](#33076) this line was basically a no-op for Android, since setting accessible="true" on text would do nothing at all.
[This diff](#33076) changed this so that setting accessible="true" worked how you'd expect, by making the view explicitly focusable, which was necessary for the disabled behavior to work properly. But that means that now by default all text views are explicitly focusable on both iOS and Android, and this there is likely many components that were built that don't expect this to be the case.
It doesn't seem like the right fix here is to revert this behavior to its previous state, as it wasn't working how anyone would expect it to if they looked at the code, and it seems like we were relying on some fairly undocumented behavior of Talkback to get it to work how we wanted. If we truly only wanted accessible="true" to be set on all TextViews for iOS, we should be explicit about it and do a platform check before setting that property. If we didn't want this to be iOS-specific, then everything is now actually working as originally intended.
For reference, this is the diff that introduced the default-accessible text - https://www.internalfb.com/diff/D1561326, and the description makes it clear that this was only tested on iOS, and the behavior was explicitly trying to map to iOS norms such as not allowing nested accessible elements.
Changelog:
[Android][Fixed] Make Text not focusable by default
Reviewed By: ryancat
Differential Revision: D36991394
fbshipit-source-id: c45d2ada72bb2d6ffeee6947d676a07fb8899449
Saadnajmi pushed a commit to Saadnajmi/react-native-macos that referenced this pull request Jan 15, 2023
…ality when disabled (react#33076)
Summary:
This issue fixesreact#30937fixesreact#30947fixesreact#30840 ([Test Case 7.1][7.1], [Test Case 7.3][7.3], [Test Case 7.5][7.5]) .
The issue is caused by:
1) The missing javascript logic on the `accessibilityState` in the Text component fabOnReact@6ab7ab3 (as previously implemented in [Button][20]).
2) The missing setter for prop `accessible` in `ReactTextAnchorViewManager` fabOnReact@17095c6 (More information in previous PR react#31252)
Related PR react#33070 PR callstack/react-native-slider#354
[20]: https://github.com/facebook/react-native/pull/31001/files#diff-4f225d043edf4cf5b8288285b6a957e2187fc0242f240bde396e41c4c25e4124R281-R289
[Android] [Fixed] - Text Component does not announce disabled and disables click functionality when disabled
Pull Request resolved: react#33076
Test Plan:
[1]. Text has `disabled` and `accessibilityState={{disabled: false}}` ([link][1])
[2]. Text has `disabled` ([link][2])
[3]. Text has `accessibilityState={{disabled: true}}` ([link][3])
[4]. Text has `accessibilityState={{disabled:false}}` ([link][4])
[5]. Text has `disabled={false}` and `accessibilityState={{disabled:true}}` ([link][5])
[6]. Text has `accessibilityState={{disabled:true}}` and method `setAccessible` in `ReactTextAnchorViewManager` (tested on commit [b4cd8][10]) ([link][6])
7. Test Cases on the main branch
[7.1]. Text has `disabled` and `accessibilityState={{disabled: false}}` ([link][7.1])
[7.3] Text has `accessibilityState={{disabled: true}}` ([link][7.3])
[7.5] Text has `disabled={false}` and `accessibilityState={{disabled:true}}` ([link][7.5])
[7.6] Text has `onPress callback` and `accessibilityState={{disabled: true}}` ([link][7.6])
[7.7] Text has `accessibilityState={{disabled:true}}` and no method `setAccessible` in `ReactTextAnchorViewManager` (tested on commit [c4f98dd][11]) ([link][7.7])
[1]: fabOnReact/react-native-notes#1 (comment)
[2]: fabOnReact/react-native-notes#1 (comment)
[3]: fabOnReact/react-native-notes#1 (comment)
[4]: fabOnReact/react-native-notes#1 (comment)
[5]: fabOnReact/react-native-notes#1 (comment)
[6]: fabOnReact/react-native-notes#1 (comment)
[7.1]: fabOnReact/react-native-notes#1 (comment)
[7.3]: fabOnReact/react-native-notes#1 (comment)
[7.5]: fabOnReact/react-native-notes#1 (comment)
[7.6]: fabOnReact/react-native-notes#1 (comment)
[7.7]: fabOnReact/react-native-notes#1 (comment)
[10]: react@17095c6
[11]: react@6ab7ab3
Reviewed By: blavalla
Differential Revision: D34211793
Pulled By: ShikaSD
fbshipit-source-id: e153fb48c194f5884e30beb9172e66aca7ce1a41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AccessibilityBugCLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.MergedThis PR has been merged.Platform: AndroidAndroid applications.Shared with MetaApplied via automation to indicate that an Issue or Pull Request has been shared with the team.

Projects

None yet

5 participants

@fabOnReact@analysis-bot@facebook-github-bot@react-native-bot@blavalla
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Text Component does not announce disabled and disables click functionality when disabled - #33076

Closed
fabOnReact wants to merge 4 commits into
react:mainfrom
fabOnReact:text-input-announce-disabled
Closed

Text Component does not announce disabled and disables click functionality when disabled#33076
fabOnReact wants to merge 4 commits into
react:mainfrom
fabOnReact:text-input-announce-disabled

Conversation

@fabOnReact

@fabOnReactfabOnReact commented Feb 9, 2022

Copy link
Copy Markdown
Contributor

Summary

This issue fixes#30937fixes#30947fixes#30840 (Test Case 7.1, Test Case 7.3, Test Case 7.5) .
The issue is caused by:

  1. The missing javascript logic on the accessibilityState in the Text component fabOnReact@6ab7ab3 (as previously implemented in Button).
  2. The missing setter for prop accessible in ReactTextAnchorViewManagerfabOnReact@17095c6 (More information in previous PR [Accessibility] Fix Image does not announce "disabled" #31252)

Related PR #33070 PR callstack/react-native-slider#354

Changelog

[Android] [Fixed] - Text Component does not announce disabled and disables click functionality when disabled

Test Plan

1. Text has disabled and accessibilityState={{disabled: false}} (link)
2. Text has disabled (link)
3. Text has accessibilityState={{disabled: true}} (link)
4. Text has accessibilityState={{disabled:false}} (link)
5. Text has disabled={false} and accessibilityState={{disabled:true}} (link)
6. Text has accessibilityState={{disabled:true}} and method setAccessible in ReactTextAnchorViewManager (tested on commit b4cd8) (link)
7. Test Cases on the main branch
7.1. Text has disabled and accessibilityState={{disabled: false}} (link)
7.3 Text has accessibilityState={{disabled: true}} (link)
7.5 Text has disabled={false} and accessibilityState={{disabled:true}} (link)
7.6 Text has onPress callback and accessibilityState={{disabled: true}} (link)
7.7 Text has accessibilityState={{disabled:true}} and no method setAccessible in ReactTextAnchorViewManager (tested on commit c4f98dd) (link)

Adding the prop `accessible` to `ReactTextAnchorViewManager` fixes the problem for this component.
The same solution from my previous pr react#30935 (comment).
See test case at fabOnReact/react-native-notes#1 (comment)
Adding the prop `accessible` to `ReactTextAnchorViewManager` fixes the problem for this component.
The same solution from my previous pr react#30935 (comment).
See test case at fabOnReact/react-native-notes#1 (comment)666647e
@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Feb 9, 2022
@react-native-botreact-native-bot added Bug Platform: Android Android applications. labels Feb 9, 2022
@analysis-bot

Copy link
Copy Markdown
PlatformEngineArchSize (bytes)Diff
ios-universaln/a--

Base commit: 97064ae
Branch: main

@analysis-bot

Copy link
Copy Markdown
PlatformEngineArchSize (bytes)Diff
androidhermesarm64-v8a8,120,598-401
androidhermesarmeabi-v7a7,721,963-539
androidhermesx868,491,382-364
androidhermesx86_648,443,204-333
androidjscarm64-v8a9,787,227-638
androidjscarmeabi-v7a8,773,462-782
androidjscx869,754,605-590
androidjscx86_6410,350,527-564

Base commit: 97064ae
Branch: main

@fabOnReact
fabOnReact marked this pull request as ready for review February 11, 2022 06:30
@facebook-github-botfacebook-github-bot added the Shared with Meta Applied via automation to indicate that an Issue or Pull Request has been shared with the team. label Feb 11, 2022

@blavallablavalla left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code and test cases look good to me.

I'm curious why the change in ReactTextAnchorViewManager was needed. What would happen without this change? It doesn't seem like it should've made a difference, since the "disabled" attribute in Android shouldn't affect focusability of an element, although it does seem weird that it was missing, so maybe it was just fixing another bug.

@fabOnReact

fabOnReact commented Feb 14, 2022

Copy link
Copy Markdown
ContributorAuthor

Thanks @blavalla

What would happen without this change?

The Text component would not announce disabled.

DOES NOT ANNOUNCE DISABLED

notAnnounceDisabled.mp4

ANNOUNCES DISABLED

announcesDisabled.mp4

The change was already introduced in the Image Component with my PR #31252.

I added two additional tests cases to the Pull Request Summary (test case 6 and test case 7.7).

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@ShikaSD has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@react-native-bot

Copy link
Copy Markdown
Collaborator

This pull request was successfully merged by @fabriziobertoglio1987 in 7b2d817.

When will my fix make it into a release? | Upcoming Releases

@react-native-botreact-native-bot added the Merged This PR has been merged. label Feb 15, 2022
facebook-github-bot pushed a commit that referenced this pull request Jun 9, 2022
…cus to true
Summary:
[A recent fix](#33076) to Android to set focusable to true when accessible is true, and this caused several components not to work correctly.
This JS change essentially reverts the default back to Text not being focusable unless it is explicitly set. Android's "auto" behavior is better than setting `accessible=true`, and it's also the behavior React Native has had since accessibility on Android was implemented.
# Wall of Text Explanation
Explanation From Brett's comment [here](https://www.internalfb.com/diff/D35908559?dst_version_fbid=700876567897063&transaction_fbid=477905564133412)
blavalla
Generally speaking, "accessible" in react native maps to "focusable" in Android views, and the default value for "focusabe" for a TextView (and actually all views) is "auto" not "false". The difference here is that "false" is telling the system to explicitly disallow focus on this element, where as "auto" is telling the system that it's up to whatever service is trying to focus to determine if it should or not.
In the case of text, Talkback generally does default to focusing on Text when it's set to "auto", though it also does try to combine this text together with other not-explicitly focusable siblings and roll the focus up to some common ancestor element.
In the case of TetraButton here, I would expect the default behavior would be that the text is "auto" focusable, so Talkback would combine the text here with the parent <TetraPressable> (which is explicitly focusable via accessible="true").
...
[This diff](#33076) was to fix the issue with "disabled" not properly announcing on text views, which was commonly occuring due to the description-combining feature described above. Basically, when Talkback decides to combine not-explicitly-focusable elements together, it ignores properties like "disabled", "selected", etc. so when combined only the text is transferred.
The "fix" here was to make sure that if disabled was set, that an element was always explicitly focusable so that it wouldn't be eligible to be combined with others. I think that as a general concept makes sense, but the fix actually surfaced an issue that is likely a much older bug.
This line in <Text>
```
accessible={accessible !== false}
```
Is basically always setting accessible="true" unless it's explicitly set to false, and has been in there for years. It was likely added to force text to be accessible by default for iOS. But until [this diff](#33076) this line was basically a no-op for Android, since setting accessible="true" on text would do nothing at all.
[This diff](#33076) changed this so that setting accessible="true" worked how you'd expect, by making the view explicitly focusable, which was necessary for the disabled behavior to work properly. But that means that now by default all text views are explicitly focusable on both iOS and Android, and this there is likely many components that were built that don't expect this to be the case.
It doesn't seem like the right fix here is to revert this behavior to its previous state, as it wasn't working how anyone would expect it to if they looked at the code, and it seems like we were relying on some fairly undocumented behavior of Talkback to get it to work how we wanted. If we truly only wanted accessible="true" to be set on all TextViews for iOS, we should be explicit about it and do a platform check before setting that property. If we didn't want this to be iOS-specific, then everything is now actually working as originally intended.
For reference, this is the diff that introduced the default-accessible text - https://www.internalfb.com/diff/D1561326, and the description makes it clear that this was only tested on iOS, and the behavior was explicitly trying to map to iOS norms such as not allowing nested accessible elements.
Changelog:
[Android][Fixed] Make Text not focusable by default
Reviewed By: ryancat
Differential Revision: D36991394
fbshipit-source-id: c45d2ada72bb2d6ffeee6947d676a07fb8899449
Saadnajmi pushed a commit to Saadnajmi/react-native-macos that referenced this pull request Jan 15, 2023
…ality when disabled (react#33076)
Summary:
This issue fixesreact#30937fixesreact#30947fixesreact#30840 ([Test Case 7.1][7.1], [Test Case 7.3][7.3], [Test Case 7.5][7.5]) .
The issue is caused by:
1) The missing javascript logic on the `accessibilityState` in the Text component fabOnReact@6ab7ab3 (as previously implemented in [Button][20]).
2) The missing setter for prop `accessible` in `ReactTextAnchorViewManager` fabOnReact@17095c6 (More information in previous PR react#31252)
Related PR react#33070 PR callstack/react-native-slider#354
[20]: https://github.com/facebook/react-native/pull/31001/files#diff-4f225d043edf4cf5b8288285b6a957e2187fc0242f240bde396e41c4c25e4124R281-R289
[Android] [Fixed] - Text Component does not announce disabled and disables click functionality when disabled
Pull Request resolved: react#33076
Test Plan:
[1]. Text has `disabled` and `accessibilityState={{disabled: false}}` ([link][1])
[2]. Text has `disabled` ([link][2])
[3]. Text has `accessibilityState={{disabled: true}}` ([link][3])
[4]. Text has `accessibilityState={{disabled:false}}` ([link][4])
[5]. Text has `disabled={false}` and `accessibilityState={{disabled:true}}` ([link][5])
[6]. Text has `accessibilityState={{disabled:true}}` and method `setAccessible` in `ReactTextAnchorViewManager` (tested on commit [b4cd8][10]) ([link][6])
7. Test Cases on the main branch
[7.1]. Text has `disabled` and `accessibilityState={{disabled: false}}` ([link][7.1])
[7.3] Text has `accessibilityState={{disabled: true}}` ([link][7.3])
[7.5] Text has `disabled={false}` and `accessibilityState={{disabled:true}}` ([link][7.5])
[7.6] Text has `onPress callback` and `accessibilityState={{disabled: true}}` ([link][7.6])
[7.7] Text has `accessibilityState={{disabled:true}}` and no method `setAccessible` in `ReactTextAnchorViewManager` (tested on commit [c4f98dd][11]) ([link][7.7])
[1]: fabOnReact/react-native-notes#1 (comment)
[2]: fabOnReact/react-native-notes#1 (comment)
[3]: fabOnReact/react-native-notes#1 (comment)
[4]: fabOnReact/react-native-notes#1 (comment)
[5]: fabOnReact/react-native-notes#1 (comment)
[6]: fabOnReact/react-native-notes#1 (comment)
[7.1]: fabOnReact/react-native-notes#1 (comment)
[7.3]: fabOnReact/react-native-notes#1 (comment)
[7.5]: fabOnReact/react-native-notes#1 (comment)
[7.6]: fabOnReact/react-native-notes#1 (comment)
[7.7]: fabOnReact/react-native-notes#1 (comment)
[10]: react@17095c6
[11]: react@6ab7ab3
Reviewed By: blavalla
Differential Revision: D34211793
Pulled By: ShikaSD
fbshipit-source-id: e153fb48c194f5884e30beb9172e66aca7ce1a41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AccessibilityBugCLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.MergedThis PR has been merged.Platform: AndroidAndroid applications.Shared with MetaApplied via automation to indicate that an Issue or Pull Request has been shared with the team.

Projects

None yet

5 participants

@fabOnReact@analysis-bot@facebook-github-bot@react-native-bot@blavalla
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Text Component does not announce disabled and disables click functionality when disabled - #33076

Closed
fabOnReact wants to merge 4 commits into
react:mainfrom
fabOnReact:text-input-announce-disabled
Closed

Text Component does not announce disabled and disables click functionality when disabled#33076
fabOnReact wants to merge 4 commits into
react:mainfrom
fabOnReact:text-input-announce-disabled

Conversation

@fabOnReact

@fabOnReactfabOnReact commented Feb 9, 2022

Copy link
Copy Markdown
Contributor

Summary

This issue fixes#30937fixes#30947fixes#30840 (Test Case 7.1, Test Case 7.3, Test Case 7.5) .
The issue is caused by:

  1. The missing javascript logic on the accessibilityState in the Text component fabOnReact@6ab7ab3 (as previously implemented in Button).
  2. The missing setter for prop accessible in ReactTextAnchorViewManagerfabOnReact@17095c6 (More information in previous PR [Accessibility] Fix Image does not announce "disabled" #31252)

Related PR #33070 PR callstack/react-native-slider#354

Changelog

[Android] [Fixed] - Text Component does not announce disabled and disables click functionality when disabled

Test Plan

1. Text has disabled and accessibilityState={{disabled: false}} (link)
2. Text has disabled (link)
3. Text has accessibilityState={{disabled: true}} (link)
4. Text has accessibilityState={{disabled:false}} (link)
5. Text has disabled={false} and accessibilityState={{disabled:true}} (link)
6. Text has accessibilityState={{disabled:true}} and method setAccessible in ReactTextAnchorViewManager (tested on commit b4cd8) (link)
7. Test Cases on the main branch
7.1. Text has disabled and accessibilityState={{disabled: false}} (link)
7.3 Text has accessibilityState={{disabled: true}} (link)
7.5 Text has disabled={false} and accessibilityState={{disabled:true}} (link)
7.6 Text has onPress callback and accessibilityState={{disabled: true}} (link)
7.7 Text has accessibilityState={{disabled:true}} and no method setAccessible in ReactTextAnchorViewManager (tested on commit c4f98dd) (link)

Adding the prop `accessible` to `ReactTextAnchorViewManager` fixes the problem for this component.
The same solution from my previous pr react#30935 (comment).
See test case at fabOnReact/react-native-notes#1 (comment)
Adding the prop `accessible` to `ReactTextAnchorViewManager` fixes the problem for this component.
The same solution from my previous pr react#30935 (comment).
See test case at fabOnReact/react-native-notes#1 (comment)666647e
@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Feb 9, 2022
@react-native-botreact-native-bot added Bug Platform: Android Android applications. labels Feb 9, 2022
@analysis-bot

Copy link
Copy Markdown
PlatformEngineArchSize (bytes)Diff
ios-universaln/a--

Base commit: 97064ae
Branch: main

@analysis-bot

Copy link
Copy Markdown
PlatformEngineArchSize (bytes)Diff
androidhermesarm64-v8a8,120,598-401
androidhermesarmeabi-v7a7,721,963-539
androidhermesx868,491,382-364
androidhermesx86_648,443,204-333
androidjscarm64-v8a9,787,227-638
androidjscarmeabi-v7a8,773,462-782
androidjscx869,754,605-590
androidjscx86_6410,350,527-564

Base commit: 97064ae
Branch: main

@fabOnReact
fabOnReact marked this pull request as ready for review February 11, 2022 06:30
@facebook-github-botfacebook-github-bot added the Shared with Meta Applied via automation to indicate that an Issue or Pull Request has been shared with the team. label Feb 11, 2022

@blavallablavalla left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code and test cases look good to me.

I'm curious why the change in ReactTextAnchorViewManager was needed. What would happen without this change? It doesn't seem like it should've made a difference, since the "disabled" attribute in Android shouldn't affect focusability of an element, although it does seem weird that it was missing, so maybe it was just fixing another bug.

@fabOnReact

fabOnReact commented Feb 14, 2022

Copy link
Copy Markdown
ContributorAuthor

Thanks @blavalla

What would happen without this change?

The Text component would not announce disabled.

DOES NOT ANNOUNCE DISABLED

notAnnounceDisabled.mp4

ANNOUNCES DISABLED

announcesDisabled.mp4

The change was already introduced in the Image Component with my PR #31252.

I added two additional tests cases to the Pull Request Summary (test case 6 and test case 7.7).

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@ShikaSD has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@react-native-bot

Copy link
Copy Markdown
Collaborator

This pull request was successfully merged by @fabriziobertoglio1987 in 7b2d817.

When will my fix make it into a release? | Upcoming Releases

@react-native-botreact-native-bot added the Merged This PR has been merged. label Feb 15, 2022
facebook-github-bot pushed a commit that referenced this pull request Jun 9, 2022
…cus to true
Summary:
[A recent fix](#33076) to Android to set focusable to true when accessible is true, and this caused several components not to work correctly.
This JS change essentially reverts the default back to Text not being focusable unless it is explicitly set. Android's "auto" behavior is better than setting `accessible=true`, and it's also the behavior React Native has had since accessibility on Android was implemented.
# Wall of Text Explanation
Explanation From Brett's comment [here](https://www.internalfb.com/diff/D35908559?dst_version_fbid=700876567897063&transaction_fbid=477905564133412)
blavalla
Generally speaking, "accessible" in react native maps to "focusable" in Android views, and the default value for "focusabe" for a TextView (and actually all views) is "auto" not "false". The difference here is that "false" is telling the system to explicitly disallow focus on this element, where as "auto" is telling the system that it's up to whatever service is trying to focus to determine if it should or not.
In the case of text, Talkback generally does default to focusing on Text when it's set to "auto", though it also does try to combine this text together with other not-explicitly focusable siblings and roll the focus up to some common ancestor element.
In the case of TetraButton here, I would expect the default behavior would be that the text is "auto" focusable, so Talkback would combine the text here with the parent <TetraPressable> (which is explicitly focusable via accessible="true").
...
[This diff](#33076) was to fix the issue with "disabled" not properly announcing on text views, which was commonly occuring due to the description-combining feature described above. Basically, when Talkback decides to combine not-explicitly-focusable elements together, it ignores properties like "disabled", "selected", etc. so when combined only the text is transferred.
The "fix" here was to make sure that if disabled was set, that an element was always explicitly focusable so that it wouldn't be eligible to be combined with others. I think that as a general concept makes sense, but the fix actually surfaced an issue that is likely a much older bug.
This line in <Text>
```
accessible={accessible !== false}
```
Is basically always setting accessible="true" unless it's explicitly set to false, and has been in there for years. It was likely added to force text to be accessible by default for iOS. But until [this diff](#33076) this line was basically a no-op for Android, since setting accessible="true" on text would do nothing at all.
[This diff](#33076) changed this so that setting accessible="true" worked how you'd expect, by making the view explicitly focusable, which was necessary for the disabled behavior to work properly. But that means that now by default all text views are explicitly focusable on both iOS and Android, and this there is likely many components that were built that don't expect this to be the case.
It doesn't seem like the right fix here is to revert this behavior to its previous state, as it wasn't working how anyone would expect it to if they looked at the code, and it seems like we were relying on some fairly undocumented behavior of Talkback to get it to work how we wanted. If we truly only wanted accessible="true" to be set on all TextViews for iOS, we should be explicit about it and do a platform check before setting that property. If we didn't want this to be iOS-specific, then everything is now actually working as originally intended.
For reference, this is the diff that introduced the default-accessible text - https://www.internalfb.com/diff/D1561326, and the description makes it clear that this was only tested on iOS, and the behavior was explicitly trying to map to iOS norms such as not allowing nested accessible elements.
Changelog:
[Android][Fixed] Make Text not focusable by default
Reviewed By: ryancat
Differential Revision: D36991394
fbshipit-source-id: c45d2ada72bb2d6ffeee6947d676a07fb8899449
Saadnajmi pushed a commit to Saadnajmi/react-native-macos that referenced this pull request Jan 15, 2023
…ality when disabled (react#33076)
Summary:
This issue fixesreact#30937fixesreact#30947fixesreact#30840 ([Test Case 7.1][7.1], [Test Case 7.3][7.3], [Test Case 7.5][7.5]) .
The issue is caused by:
1) The missing javascript logic on the `accessibilityState` in the Text component fabOnReact@6ab7ab3 (as previously implemented in [Button][20]).
2) The missing setter for prop `accessible` in `ReactTextAnchorViewManager` fabOnReact@17095c6 (More information in previous PR react#31252)
Related PR react#33070 PR callstack/react-native-slider#354
[20]: https://github.com/facebook/react-native/pull/31001/files#diff-4f225d043edf4cf5b8288285b6a957e2187fc0242f240bde396e41c4c25e4124R281-R289
[Android] [Fixed] - Text Component does not announce disabled and disables click functionality when disabled
Pull Request resolved: react#33076
Test Plan:
[1]. Text has `disabled` and `accessibilityState={{disabled: false}}` ([link][1])
[2]. Text has `disabled` ([link][2])
[3]. Text has `accessibilityState={{disabled: true}}` ([link][3])
[4]. Text has `accessibilityState={{disabled:false}}` ([link][4])
[5]. Text has `disabled={false}` and `accessibilityState={{disabled:true}}` ([link][5])
[6]. Text has `accessibilityState={{disabled:true}}` and method `setAccessible` in `ReactTextAnchorViewManager` (tested on commit [b4cd8][10]) ([link][6])
7. Test Cases on the main branch
[7.1]. Text has `disabled` and `accessibilityState={{disabled: false}}` ([link][7.1])
[7.3] Text has `accessibilityState={{disabled: true}}` ([link][7.3])
[7.5] Text has `disabled={false}` and `accessibilityState={{disabled:true}}` ([link][7.5])
[7.6] Text has `onPress callback` and `accessibilityState={{disabled: true}}` ([link][7.6])
[7.7] Text has `accessibilityState={{disabled:true}}` and no method `setAccessible` in `ReactTextAnchorViewManager` (tested on commit [c4f98dd][11]) ([link][7.7])
[1]: fabOnReact/react-native-notes#1 (comment)
[2]: fabOnReact/react-native-notes#1 (comment)
[3]: fabOnReact/react-native-notes#1 (comment)
[4]: fabOnReact/react-native-notes#1 (comment)
[5]: fabOnReact/react-native-notes#1 (comment)
[6]: fabOnReact/react-native-notes#1 (comment)
[7.1]: fabOnReact/react-native-notes#1 (comment)
[7.3]: fabOnReact/react-native-notes#1 (comment)
[7.5]: fabOnReact/react-native-notes#1 (comment)
[7.6]: fabOnReact/react-native-notes#1 (comment)
[7.7]: fabOnReact/react-native-notes#1 (comment)
[10]: react@17095c6
[11]: react@6ab7ab3
Reviewed By: blavalla
Differential Revision: D34211793
Pulled By: ShikaSD
fbshipit-source-id: e153fb48c194f5884e30beb9172e66aca7ce1a41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AccessibilityBugCLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.MergedThis PR has been merged.Platform: AndroidAndroid applications.Shared with MetaApplied via automation to indicate that an Issue or Pull Request has been shared with the team.

Projects

None yet

5 participants

@fabOnReact@analysis-bot@facebook-github-bot@react-native-bot@blavalla