From baa66f63d8af2b772dea8ff8eda50eba264c3faf Mon Sep 17 00:00:00 2001 From: Sharon Gong Date: Mon, 14 Oct 2019 00:26:41 -0700 Subject: [PATCH] Announce accessibility state changes happening in the background (#26624) Summary: Currently the react native framework doesn't handle the accessibility state changes of the focused item that happen not upon double tapping. Screen reader doesn't get notified when the state of the focused item changes in the background. To fix this problem, post a layout change notification for every state changes on iOS. On Android, send a click event whenever state "checked", "selected" or "disabled" changes. In the case that such states changes upon user's clicking, the duplicated click event will be skipped by Talkback. ## Changelog: [General][Fixed] - Announce accessibility state changes happening in the background Pull Request resolved: https://github.com/facebook/react-native/pull/26624 Test Plan: Add a nested checkbox example which state changes after a delay in the AccessibilityExample. Differential Revision: D17903205 Pulled By: cpojer fbshipit-source-id: 9245ee0b79936cf11b408b52d45c59ba3415b9f9 --- .../Accessibility/AccessibilityExample.js | 157 ++++++++++++++---- RNTester/js/examples/Accessibility/check.png | Bin 0 -> 25924 bytes RNTester/js/examples/Accessibility/mixed.png | Bin 0 -> 19043 bytes .../js/examples/Accessibility/uncheck.png | Bin 0 -> 16363 bytes React/Views/RCTViewManager.m | 4 + .../react/uimanager/BaseViewManager.java | 8 + 6 files changed, 138 insertions(+), 31 deletions(-) create mode 100644 RNTester/js/examples/Accessibility/check.png create mode 100644 RNTester/js/examples/Accessibility/mixed.png create mode 100644 RNTester/js/examples/Accessibility/uncheck.png diff --git a/RNTester/js/examples/Accessibility/AccessibilityExample.js b/RNTester/js/examples/Accessibility/AccessibilityExample.js index c2fc33a0ae4eb5..38fa2b3cdb2409 100644 --- a/RNTester/js/examples/Accessibility/AccessibilityExample.js +++ b/RNTester/js/examples/Accessibility/AccessibilityExample.js @@ -13,18 +13,30 @@ const React = require('react'); const { AccessibilityInfo, Button, + Image, Text, View, TouchableOpacity, TouchableWithoutFeedback, Alert, - UIManager, - findNodeHandle, - Platform, + StyleSheet, } = require('react-native'); const RNTesterBlock = require('../../components/RNTesterBlock'); +const checkImageSource = require('./check.png'); +const uncheckImageSource = require('./uncheck.png'); +const mixedCheckboxImageSource = require('./mixed.png'); + +const styles = StyleSheet.create({ + image: { + width: 20, + height: 20, + resizeMode: 'contain', + marginRight: 10, + }, +}); + class AccessibilityExample extends React.Component { render() { return ( @@ -161,13 +173,6 @@ class CheckboxExample extends React.Component { this.setState({ checkboxState: checkboxState, }); - - if (Platform.OS === 'android') { - UIManager.sendAccessibilityEvent( - findNodeHandle(this), - UIManager.AccessibilityEventTypes.typeViewClicked, - ); - } }; render() { @@ -195,13 +200,6 @@ class SwitchExample extends React.Component { this.setState({ switchState: switchState, }); - - if (Platform.OS === 'android') { - UIManager.sendAccessibilityEvent( - findNodeHandle(this), - UIManager.AccessibilityEventTypes.typeViewClicked, - ); - } }; render() { @@ -252,13 +250,6 @@ class SelectionExample extends React.Component { isSelected: !this.state.isSelected, }); } - - if (Platform.OS === 'android') { - UIManager.sendAccessibilityEvent( - findNodeHandle(this.selectableElement.current), - UIManager.AccessibilityEventTypes.typeViewClicked, - ); - } }} accessibilityLabel="element 19" accessibilityState={{ @@ -292,13 +283,6 @@ class ExpandableElementExample extends React.Component { this.setState({ expandState: expandState, }); - - if (Platform.OS === 'android') { - UIManager.sendAccessibilityEvent( - findNodeHandle(this), - UIManager.AccessibilityEventTypes.typeViewClicked, - ); - } }; render() { @@ -314,6 +298,114 @@ class ExpandableElementExample extends React.Component { } } +class NestedCheckBox extends React.Component { + state = { + checkbox1: false, + checkbox2: false, + checkbox3: false, + }; + + _onPress1 = () => { + let checkbox1 = false; + if (this.state.checkbox1 === false) { + checkbox1 = true; + } else if (this.state.checkbox1 === 'mixed') { + checkbox1 = false; + } else { + checkbox1 = false; + } + setTimeout(() => { + this.setState({ + checkbox1: checkbox1, + checkbox2: checkbox1, + checkbox3: checkbox1, + }); + }, 2000); + }; + + _onPress2 = () => { + const checkbox2 = !this.state.checkbox2; + + this.setState({ + checkbox2: checkbox2, + checkbox1: + checkbox2 && this.state.checkbox3 + ? true + : checkbox2 || this.state.checkbox3 + ? 'mixed' + : false, + }); + }; + + _onPress3 = () => { + const checkbox3 = !this.state.checkbox3; + + this.setState({ + checkbox3: checkbox3, + checkbox1: + this.state.checkbox2 && checkbox3 + ? true + : this.state.checkbox2 || checkbox3 + ? 'mixed' + : false, + }); + }; + + render() { + return ( + + + + Meat + + + + Beef + + + + Bacon + + + ); + } +} + class AccessibilityRoleAndStateExample extends React.Component<{}> { render() { return ( @@ -412,6 +504,9 @@ class AccessibilityRoleAndStateExample extends React.Component<{}> { + + + ); } diff --git a/RNTester/js/examples/Accessibility/check.png b/RNTester/js/examples/Accessibility/check.png new file mode 100644 index 0000000000000000000000000000000000000000..de4c1492b8fd970f101590e9033be000cf0558d4 GIT binary patch literal 25924 zcmc$G`9IX(_xQ{(wyfEPEMpCoY-z|cvbWfY%D%Lr#x6@kvM=+}W}*n8Qdvp~QO4SY zHcLd!$R62>QuDd@S??ddf5ErMDnlI0E$jU(dj5U3t&RAv{9@86pM;t(NQcg0Js5afD0@J&@4y?{t3|5rfO@` zwY6E0EEoj@Xa`WW1L)cTEXW0zqy}hHsoGS!HkAdL0Wh0FPj)HY-4z zMb&1}wON2F;2IzUOam?fTVM_l2DkxgfD0^UL4n{H{GkQ}&;tTkP(DBwjHuKADm{S8 zg5m-$z$Bd-K&J=LSwMQg6o3t2Q3F`?02UAr=mW3`Rs(ea`2iC^LcldZ2ABq10#LvQ zAPjH=)BqO?Y7S0=G5ABLQdv-uKt4bgjOcVKodxs?#06Y{Nh*s@WdS_`O#=l0z5qB- zG>{gk66gc4304Dj0G@!rKtjMZKn9owD*;=84?q~;2B=xkL=YNGgE9ES0u}>`1o8p0 zU_@uJpaBu{LoN`DLVF@cf=nTLhvr3833)`c1Fek+3|U5GfW}AIf)XH<0BYb4z)C=Q zKqf%yfy+TD5CAG+4mOTDHOxQ0>HA)WlpQ7Haa_#e9CbcG)ZY5`eZL|C)HRz{`t$=#?mTd`rG%pxtZgOpT+wsdQCT`W)|nZf193IU0PrJ zB4>lGRKk1O8)BASzOZAmX-5=z}f@T?`ZjL_Y{M@(kbsZbr#;H1V zG@-fPFx`;dE9>s?z%fs&D|8L~!Zcy|I@{p$kA?Y@V@#>MPI_{2WaW#lH(E)>Q-(ga?Jvlc9B?3JpJtYGQU(|&`1wvK<9lb&m;6YB8`s@}*vEfr z#QUJWxEef)^L1fE>&1n9WK((f@nGw~ySoCNcaLEcirqhUOyAK9=NunemLXz;ha06F zNJN;qnrtQvfm!kp5g6$p0!h!7(Q>qkm^sBWDEJ)&1rXg z_)75Hy`A{0!3`L-i1$5-8IQ2z%JJ-|M~5G3U37LP%4|P`(fKUjb29v{3Vx@09O~7R zxKzg@ZFjgktA`^J$_kvDy-q8k^?u~46zLthY+U4FPVD&@h1Iz|pX4McIA%nScwaza zur19EbM`$vE9?+O%#Qnoy7t3$nmKLGIo@{tP|Nm>+e?oev7F=2LuFe6rP`?vl)rG$ zPW2?X-CmepabWX#waqJ7>?#RUX--Ag|9C3km7G0ucG4*g9Zi}Q)o?tv%l+U^4g8f6 zY(Qo4ez`X6xMI7Y*A1~rlKyrNZ*;wG43<9XtRx_IMU-N!c@|asU1V!p&1DhFOPn6L z{>ZyC#x8p3=&E4u7SD5x5!WgoOo)&#M@u=QaNBl8{7$hTPS+6UHB&i%cG`ddS+;;? zU2{N*ef$F)xEs>aYRs_g^0vzST@(I)OU%Jt^RHo1B>pP>lyu6<3?+fEbX zW4^O_-K!-W6H`7#++M&{mDUzopqr7ajUSEXue!N;jCx}yeqdCetE#$W>He)_n^KQ) zqU#(+9<3ZjlUAj?_TReqAa5(aqwE2y4tQIBSq(dFMYP3co~d&HOVzk%RU{ zfGj6<@Z9g8oQ}aX|JV@J_b}4-F``v*{O48C}GVs~Bma z&UgN~b~_CdGP9)D(vr>K&3~zbj?T8-)N)2FTKrIfB0jhogKHxd1k~oqBY(H<`4YXA zEA{<;l*O`S`3K&1fz;thv_%+h>+p1zjNn~Qbf(&Hx2rEFjVX&#c)3dKe1g_{l99vN za{NA{U{AF@+tQ~+6EgRBbm22n-)h2Rs2u1#-rPtv}}kgY+h%D#r-ak zpZq~nS|1LWv~#7#qsBF-KQ=0C9J#?lb^3QF^0I8B|488rxeKjj4e9@k=^O??q z9lDy#O>`3@#ml_1LocHAiQet;ig88cC=`1U;V~&)rb`2S<{~DjGZYQ8O)v}&53+pL zS?vWubbSsVwn$?qsaU2Jg-Cmx22{@_a$twQna?!V(2!$HG_k>6y6%fwaMv;rH%FVpI^SLto%Ut6{WmQxq5YWa&q}%eyj1J zNYdJ4wVu(|Aw7JS2TJc}C@I?DXZ}=z!*!!VgX_Bv=RPmw7}|yZ+I0Tg;`ARKBPorT zfvqWDo9_HlHX5;u;I(qx@3kY?Hk%oWR%|Xj{o$v7^e6M`h)tafgLyxt-FeTsb068s>5g&uAsu|Iq*9fG-e&!gPcI`!Gf5h=B$97m zQu}L75Y_P0J=~PTU{kOx<*cm9IVS-xT(jrw_4KqH4f0nuhv|wP!R@YeT;9E_!-R%+ z0Z*(e@3A>dviFyi8BWHF)7u5Zlt`Ep`{%`f?W7V)YC&mk%7|Xb?U%On$dJ zA$VCcpZ4oTr@tEQbwSr>o_osEnkmo{U~~8IdK_gyHb|7R zmU2qt#Vix;a`yId`B{~^=$*str8iC=e?0t(j^<_Dx)J^7;^25(AgSzL0N+LJ-U2qN z)S=}-@4#ZSOKJPSgMDw54 zf)9VPu%^$-g}gj>ei@5;xKPSU1`%=YzU!t_^Oy_uY0HlF-wVEvY2a_!PV${GmTYN} z*>~>#nOE|KY7Jr1`%EY#P(!fa+a-IVd&hTa!?`1@tb@8B;VRq*~} z2Q_Hv>L>-(UlOTJ^Bx}+@#f7IGo7`v#MeE{KTSqgK_vYR;+S|rx| zvT4hT{Dl(K$V?;>=_Q`V^bP)PVX` zWAcYfXHC2&9~JduOZ#@>WsEpyLJv>XBsTon`%E40?}1(yKEi2tSIG z`?99P{TNE`^19deY)_MZ_R`L6_)!Bcr@Nhxu#p=)HTrmS4>akQs9m+ZXHNC-AzO5v!ZC$~=iIu!o2|o&U*!T{k)WRhuYjbI3LC5@w-AAyeycZ*i&SE{J z2d76%ozbeNB}OlFa3*kwM4dksIOO7jEqyZlYTl<6HRCdhO&l1k3996>BJGraCr~6h zK=RnuuKqyzs1W6i$9Tg)zBoGFVI-0weWU7#5M^!u{%Y4I?I8cUBDbvn>C-Vw%;t?yFtbcqv%hKz+e?E6U>f@5l=nb;SO4@cW%)`o3 z|5J}Q;(kw(MIJhoa`q+EU0$*J8L{mKEB37VlsVqRYm?5ryiFu_aQ+eAn4`2PJnFR1 zMbtIto}dTA?iMUf{Fm`>+v~WBydz27FBkOcjw=ADy!}(^MQovGBqtj;>Yir)aU^!v zC(ZNKwQRpst93fC&mx}3O7ksgvf2cdwI}nfN5rr}764*A=<4B7ZV9}!WcE|{5Pv*Z zr}f6Jdg-?BsD}%Y1?x4#j4u+#?4_56(T$0MdH*?hym;7FJpYk=DP(txb)W#i9s?31#;Xz5Vgep^}?APG6NBZcrX8cZJ*A}VEn%IYnN>g9Rm#Q<bOY{vA&<15E4;ibDuJrT&@Fp8m=}J9Z8Iy{qk0D_)RDHmuPoGcKU$TcUUQJi z*;implBcWH`Cq?9zNB$JTyz+tVMT-`GMIt=hg2a5rH?n3A$) ztGy(q>NUSF>akN`_emD}_^v-MGqZgiQ2}?!k52}!c)U1=$z{FCI@X8gc~Wpj=t#{Q zV{{rzqhzdF38j677A`%C9wnwC+ci}X;KAokOKgf@&X~vB!BVW>3D*0K#dpPn^Mm$Y)UBwl#iZSy(dr%dOf&#En zu@0&SKgX;o|HyKkJv4q0-PLq&Q~~?#;C#pHfw6&0KzG*aE LbQ6`NBie*KCAiZ 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 0) { view.reactAccessibilityElement.accessibilityState = newState; + // Post a layout change notification to make sure VoiceOver get notified for the state + // changes that don't happen upon users' click. + UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, nil); } else { view.reactAccessibilityElement.accessibilityState = nil; } + } RCT_CUSTOM_VIEW_PROPERTY(nativeID, NSString *, RCTView) diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java index 9c8b35b8ea5500..65c2fb3e387dd6 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java @@ -9,6 +9,7 @@ import android.text.TextUtils; import android.view.View; import android.view.ViewParent; +import android.view.accessibility.AccessibilityEvent; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.view.ViewCompat; @@ -170,6 +171,13 @@ public void setViewState(@NonNull T view, @Nullable ReadableMap accessibilitySta && accessibilityState.getType(STATE_CHECKED) == ReadableType.String)) { updateViewContentDescription(view); break; + } else if (view.isAccessibilityFocused()) { + // Internally Talkback ONLY uses TYPE_VIEW_CLICKED for "checked" and + // "selected" announcements. Send a click event to make sure Talkback + // get notified for the state changes that don't happen upon users' click. + // For the state changes that happens immediately, Talkback will skip + // the duplicated click event. + view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); } } }