Skip to content

Commit 53143cc

Browse files
mdvaccafacebook-github-bot
authored andcommitted
Implement prop diffing for accessibility props in <View> (#48833)
Summary: This diff implements the diffing for accessibility props of <View> changelog: [internal] internal Reviewed By: rshest Differential Revision: D59972041
1 parent 09a731f commit 53143cc

File tree

1 file changed

+179
-1
lines changed
  • packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view

1 file changed

+179
-1
lines changed

packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.cpp

Lines changed: 179 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,10 @@ static void updateBorderRadiusProps(
254254
newBorderRadii.endEnd,
255255
oldBorderRadii.endEnd);
256256
updateBorderRadiusPropValue(
257-
result, "borderEndStartRadius", newBorderRadii.all, oldBorderRadii.all);
257+
result,
258+
"borderEndStartRadius",
259+
newBorderRadii.endStart,
260+
oldBorderRadii.endStart);
258261
updateBorderRadiusPropValue(
259262
result,
260263
"borderStartEndRadius",
@@ -396,6 +399,53 @@ inline static void updateTransformProps(
396399
}
397400
}
398401

402+
inline static void updateAccessibilityStateProp(
403+
folly::dynamic& result,
404+
const std::optional<AccessibilityState>& newState,
405+
const std::optional<AccessibilityState>& oldState) {
406+
folly::dynamic resultState = folly::dynamic::object();
407+
408+
if (!newState.has_value() && oldState.has_value()) {
409+
result["accessibilityState"] = resultState;
410+
return;
411+
}
412+
413+
if (!oldState.has_value() || newState->disabled != oldState->disabled) {
414+
resultState["disabled"] = newState->disabled;
415+
}
416+
417+
if (!oldState.has_value() || newState->selected != oldState->selected) {
418+
resultState["selected"] = newState->selected;
419+
}
420+
421+
if (!oldState.has_value() || newState->busy != oldState->busy) {
422+
resultState["busy"] = newState->busy;
423+
}
424+
425+
if (!oldState.has_value() || newState->expanded != oldState->expanded) {
426+
resultState["expanded"] =
427+
newState->expanded.has_value() && newState->expanded.value();
428+
}
429+
430+
if (!oldState.has_value() || newState->checked != oldState->checked) {
431+
switch (newState->checked) {
432+
case AccessibilityState::Unchecked:
433+
resultState["checked"] = "unchecked";
434+
break;
435+
case AccessibilityState::Checked:
436+
resultState["checked"] = "checked";
437+
break;
438+
case AccessibilityState::Mixed:
439+
resultState["checked"] = "mixed";
440+
break;
441+
case AccessibilityState::None:
442+
resultState["checked"] = "none";
443+
break;
444+
}
445+
}
446+
result["accessibilityState"] = resultState;
447+
}
448+
399449
folly::dynamic HostPlatformViewProps::getDiffProps(
400450
const Props* prevProps) const {
401451
folly::dynamic result = folly::dynamic::object();
@@ -409,6 +459,11 @@ folly::dynamic HostPlatformViewProps::getDiffProps(
409459
if (this == oldProps) {
410460
return result;
411461
}
462+
463+
if (elevation != oldProps->elevation) {
464+
result["elevation"] = elevation;
465+
}
466+
412467
if (focusable != oldProps->focusable) {
413468
result["focusable"] = focusable;
414469
}
@@ -705,6 +760,129 @@ folly::dynamic HostPlatformViewProps::getDiffProps(
705760
result["transformOrigin"] = transformOrigin;
706761
}
707762

763+
// Accessibility
764+
765+
if (accessibilityState != oldProps->accessibilityState) {
766+
updateAccessibilityStateProp(
767+
result, oldProps->accessibilityState, accessibilityState);
768+
}
769+
770+
if (accessibilityLabel != oldProps->accessibilityLabel) {
771+
result["accessibilityLabel"] = accessibilityLabel;
772+
}
773+
774+
if (accessibilityLabelledBy != oldProps->accessibilityLabelledBy) {
775+
auto accessibilityLabelledByValues = folly::dynamic::array();
776+
for (const auto& accessibilityLabelledByValue :
777+
accessibilityLabelledBy.value) {
778+
accessibilityLabelledByValues.push_back(accessibilityLabelledByValue);
779+
}
780+
result["accessibilityLabelledBy"] = accessibilityLabelledByValues;
781+
}
782+
783+
if (accessibilityLiveRegion != oldProps->accessibilityLiveRegion) {
784+
switch (accessibilityLiveRegion) {
785+
case AccessibilityLiveRegion::Assertive:
786+
result["accessibilityLiveRegion"] = "assertive";
787+
break;
788+
case AccessibilityLiveRegion::Polite:
789+
result["accessibilityLiveRegion"] = "polite";
790+
break;
791+
case AccessibilityLiveRegion::None:
792+
result["accessibilityLiveRegion"] = "none";
793+
break;
794+
}
795+
}
796+
797+
if (accessibilityHint != oldProps->accessibilityHint) {
798+
result["accessibilityHint"] = accessibilityHint;
799+
}
800+
801+
if (accessibilityRole != oldProps->accessibilityRole) {
802+
result["accessibilityRole"] = accessibilityRole;
803+
}
804+
805+
if (accessibilityLanguage != oldProps->accessibilityLanguage) {
806+
result["accessibilityLanguage"] = accessibilityLanguage;
807+
}
808+
809+
if (accessibilityValue != oldProps->accessibilityValue) {
810+
folly::dynamic accessibilityValueObject = folly::dynamic::object();
811+
if (accessibilityValue.min.has_value()) {
812+
accessibilityValueObject["min"] = accessibilityValue.min.value();
813+
}
814+
if (accessibilityValue.max.has_value()) {
815+
accessibilityValueObject["max"] = accessibilityValue.max.value();
816+
}
817+
if (accessibilityValue.now.has_value()) {
818+
accessibilityValueObject["now"] = accessibilityValue.now.value();
819+
}
820+
if (accessibilityValue.text.has_value()) {
821+
accessibilityValueObject["text"] = accessibilityValue.text.value();
822+
}
823+
result["accessibilityValue"] = accessibilityValueObject;
824+
}
825+
826+
if (accessibilityActions != oldProps->accessibilityActions) {
827+
auto accessibilityActionsArray = folly::dynamic::array();
828+
for (const auto& accessibilityAction : accessibilityActions) {
829+
folly::dynamic accessibilityActionObject = folly::dynamic::object();
830+
accessibilityActionObject["name"] = accessibilityAction.name;
831+
if (accessibilityAction.label.has_value()) {
832+
accessibilityActionObject["label"] = accessibilityAction.label.value();
833+
}
834+
accessibilityActionsArray.push_back(accessibilityActionObject);
835+
}
836+
result["accessibilityActions"] = accessibilityActionsArray;
837+
}
838+
839+
if (accessibilityViewIsModal != oldProps->accessibilityViewIsModal) {
840+
result["accessibilityViewIsModal"] = accessibilityViewIsModal;
841+
}
842+
843+
if (accessibilityElementsHidden != oldProps->accessibilityElementsHidden) {
844+
result["accessibilityElementsHidden"] = accessibilityElementsHidden;
845+
}
846+
847+
if (accessibilityIgnoresInvertColors !=
848+
oldProps->accessibilityIgnoresInvertColors) {
849+
result["accessibilityIgnoresInvertColors"] =
850+
accessibilityIgnoresInvertColors;
851+
}
852+
853+
if (onAccessibilityTap != oldProps->onAccessibilityTap) {
854+
result["onAccessibilityTap"] = onAccessibilityTap;
855+
}
856+
857+
if (onAccessibilityMagicTap != oldProps->onAccessibilityMagicTap) {
858+
result["onAccessibilityMagicTap"] = onAccessibilityMagicTap;
859+
}
860+
861+
if (onAccessibilityEscape != oldProps->onAccessibilityEscape) {
862+
result["onAccessibilityEscape"] = onAccessibilityEscape;
863+
}
864+
865+
if (onAccessibilityAction != oldProps->onAccessibilityAction) {
866+
result["onAccessibilityAction"] = onAccessibilityAction;
867+
}
868+
869+
if (importantForAccessibility != oldProps->importantForAccessibility) {
870+
switch (importantForAccessibility) {
871+
case ImportantForAccessibility::Auto:
872+
result["importantForAccessibility"] = "auto";
873+
break;
874+
case ImportantForAccessibility::Yes:
875+
result["importantForAccessibility"] = "yes";
876+
break;
877+
case ImportantForAccessibility::No:
878+
result["importantForAccessibility"] = "no";
879+
break;
880+
case ImportantForAccessibility::NoHideDescendants:
881+
result["importantForAccessibility"] = "noHideDescendants";
882+
break;
883+
}
884+
}
885+
708886
return result;
709887
}
710888

0 commit comments

Comments
 (0)