-
Notifications
You must be signed in to change notification settings - Fork 2
Adding prop accessibilityUnit to TextAttributesProps (fabric) #3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Adding prop accessibilityUnit to TextAttributesProps (fabric) #3
Conversation
|
SOLUTION: Clearing the cache fixed the issue ([comment](pyg-team/pytorch_geometric#4419 (comment))). The user was experiencing similar issue on arm64. It reports errors that result from attempts to exceed implementation defined length limits for some object ([link](https://en.cppreference.com/w/cpp/error/length_error)). "Adding a string prop to TextAttributes.cpp: Read error message with Android Studio ([screenshot](https://www.icloud.com/iclouddrive/053tE1XWF0rgVUMxmLhUJTJUA#terminating_std_length_error_vector)) Search online for the error message and understand the configuration mistake in the cpp type ([link](https://www.google.com/search?q=terminating+with+uncaught+exception+of+type+std::length_error:+vector)) terminating with uncaught exception of type std::length_error: vector Verify all changes from [#2](https://github.com/fabriziobertoglio1987/react-native/pull/2/files) are added in [#3](https://github.com/fabriziobertoglio1987/react-native/pull/3/files) Verify there are no mistakes in the types Read about APIs that you added to cpp Read complete logcat errors Does it build only with the Java Changes? Commit the java changes and stash cpp The error std::length_error: vector indicates wrong cpp type
getOrCreateSpannableForText is not called. The method is called on the parent Text, but not on the Span Text. Review implementation of accessibilityRole in [BaseViewManager](https://github.com/fabriziobertoglio1987/react-native/blob/ec4bc8eb5905f81cebbb4b623acda8245ee5683c/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java#L247) and [ReactMapBufferPropSetter.kt](http://www.apple.com/) Probably the method setAccessibilityRole is called directly from kotlin MapBufferPropSetter Add required changes and debug the functionality accessibilityRole link is called, but time is not they have the same cpp configuration, but one of them is not invoked in BaseViewManager. This suggest missing configs from the [accessibility link PR](facebook@7b5b114), maybe accessibilityRole Link is triggered with resetAccessibilityDelegate Find logic in accessibility link PR that resets the Delegate Before resetting the Delegate, TextLayoutManager adds the Span to the Text. The field is TextAttributes mIsAccessibilityLink. This field is set to true if accessibilityRole = link mIsAccessibilityLink is set to true in the ReactBaseTextShadowNode #setIsAccessibilityLink sets the value Debug the value of ReactBaseTextShadowNode #setAccessibilityUnit Verify if accessibilityUnit is retrieve in that method, because this manager is also for nested text Check if setIsAccessibiltyLink also is triggered for role time, if not understand why text does not trigger. Yes, it is triggered. We set there the accessibilityRole - We could follow the same implementation, we add the span based on mIsAccessibilityTtsSpan - We retrieve get spans of class ReactTtsSpan - We follow same implementation from accessibilityLinks Implement same logic for accessibilityRole time Verify accessibilityRole time is invoked Use resetAccessibilityDelegate to add accessibilityUnit info to child Text Copy missing changes from another prop (for ex. accessibilityRole). setAccessibilityRole is triggered, while setAccessibilityUnit is not triggered. Review missing diff with [#2](https://github.com/fabriziobertoglio1987/react-native/pull/2/files) Review the current diff with main branch Add breakpoint in cpp SOLUTION: adding the value in [attributedstring/conversion.h](https://github.com/fabriziobertoglio1987/react-native/blob/ec4bc8eb5905f81cebbb4b623acda8245ee5683c/ReactCommon/react/renderer/attributedstring/conversions.h#L1087) will then pass it to [TextAttributesProps as key 24](https://www.icloud.com/iclouddrive/0b8-oKB396zP7Astpyc3puGqQ#ACC_UNIT_passed_as_key_24)
"Complete draft CPP accessibilityUnit settings: Commit the changes and push Add more clear log statements and further verify value passed to accessibilityUnit Log the value passed from javascript in conversion.h Add changes from PR [#2](https://github.com/fabriziobertoglio1987/react-native/pull/2/files) Change logic in conversion.h to add the value passed from javascript"
Basic working setup to use CPP Map instead of basic string type Settings copied from accessibilityState (fromRawValue) and from importantForAccessibility (toString) the CPP convertRawProps will use two functions to convert the prop: - fromRawValue which takes as param the prop RawValue - toString or toBoolean, to*** which convert the RawValue to String/Boolean/Number The error was triggered for missing conversion from RawValue (AccessibilityUnit field hours) toString. (std::string) accessibilityUnit.hours would call toString(accessibilityUnit.hours) Tasks Details: Complete draft CPP accessibilityUnit settings:Commit the changes and pushAdd more clear log statements and further verify value passed to accessibilityUnitLog the value passed from javascript in conversion.hAdd changes from PR #2Change logic in conversion.h to add the value passed from javascript -- Change the type from String to Hash in PR #3:Plan next tasksFind a prop that uses the Hash type (for ex accessibilityState)Start with a clear git statusCopy the CPP settings from accessibilityState Parse accessibilityUnit hours value to a string type. The value is already string, but in CPP is not mapped to string.importantForAccessibility uses 2 conversions, fromRawValue and toString. fromRawValue parses the props importantForAccessibility, while toString converts the value from IMPORTANT_FOR_ACCESSIBILITY to string.Follow the same implementation fromRawValue(IMPORTANT_FOR_ACCESSIBILITY), but avoid adding their toString(Important_For_Accessibility) conversion.Pass a static string auto hours = “10”; "Complete draft CPP accessibilityUnit settings: Commit the changes and push Add more clear log statements and further verify value passed to accessibilityUnit Log the value passed from javascript in conversion.h Add changes from PR [#2](https://github.com/fabriziobertoglio1987/react-native/pull/2/files) Change logic in conversion.h to add the value passed from javascript" "Change the type from String to Hash in PR [#3](https://github.com/fabriziobertoglio1987/react-native/pull/3/files): Plan next tasks Find a prop that uses the Hash type (for ex [accessibilityState](https://github.com/fabriziobertoglio1987/react-native/blob/41173cbeba53b26a3c838d16776daa8d10e57639/ReactCommon/react/renderer/components/view/AccessibilityProps.h#L41)) Start with a clear git status Copy the CPP settings from accessibilityState" "Parse accessibilityUnit hours value to a string type. The value is already string, but in CPP is not mapped to string. [importantForAccessibility](https://github.com/fabriziobertoglio1987/react-native/blob/41173cbeba53b26a3c838d16776daa8d10e57639/ReactCommon/react/renderer/components/view/accessibilityPropsConversions.h#L173-L209) uses 2 conversions, fromRawValue and toString. fromRawValue parses the props importantForAccessibility, while toString converts the value from IMPORTANT_FOR_ACCESSIBILITY to string. Follow the same implementation [fromRawValue(IMPORTANT_FOR_ACCESSIBILITY)](https://github.com/fabriziobertoglio1987/react-native/blob/41173cbeba53b26a3c838d16776daa8d10e57639/ReactCommon/react/renderer/components/view/accessibilityPropsConversions.h#L193), but avoid adding their toString(Important_For_Accessibility) conversion. Pass a static string auto hours = “10”;"
[build error](https://www.icloud.com/iclouddrive/083j4A7FWBweG3wFmAnHzDyfQ#call_to_implicitly_deleted_constructor) seems to be caused by the double declaration of primitive AccessibilityUnit:
This reverts commit 252e6f4.
Summary: Pull Request resolved: facebook#50147 Noticed a couple bugs here, around a crash from assertion internal to the caching map which hashes on the AttributedString, that may or may not be related. 1. We are missing `baseTextAttributes` for both hashing and equality (which is mostly innocuous, but still wrong) 2. We were not hashing or comparing `textAlignVertical` 3. For equality, we were comparing parent shadow view tag and metrics, but for hashing, we were hashing the whole ShadowView. I think #3 could cause issues, since we could see different hash despite equality, which could break invariants. Changelog: [Internal] Reviewed By: lunaleaps Differential Revision: D71500246 fbshipit-source-id: 462749d5ca10d10bf0dab88089253a2bb8e603fb
…tion for existing view (facebook#51294) Summary: Pull Request resolved: facebook#51294 changelog: [internal] Fix a crash where a node that is supposed to be culled doesn't get visited because culling context is not updated. The differentiator would generate a create instruction for a view that already exists. Stack trace for the crash: ``` * thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT * frame #0: 0x0000000111740874 libsystem_kernel.dylib`__pthread_kill + 8 frame #1: 0x00000001117aa2ec libsystem_pthread.dylib`pthread_kill + 264 frame #2: 0x0000000180171ea8 libsystem_c.dylib`abort + 100 frame #3: 0x00000001802b0144 libc++abi.dylib`abort_message + 128 frame #4: 0x000000018029fe4c libc++abi.dylib`demangling_terminate_handler() + 296 frame #5: 0x000000018006f220 libobjc.A.dylib`_objc_terminate() + 124 frame #6: 0x00000001375d1964 INFRAFramework`meta_terminate() + 5468 frame #7: 0x00000001802af570 libc++abi.dylib`std::__terminate(void (*)()) + 12 frame #8: 0x00000001802b2498 libc++abi.dylib`__cxxabiv1::failed_throw(__cxxabiv1::__cxa_exception*) + 32 frame #9: 0x00000001802b2478 libc++abi.dylib`__cxa_throw + 88 frame #10: 0x0000000180093904 libobjc.A.dylib`objc_exception_throw + 384 frame facebook#11: 0x0000000180e6999c Foundation`-[NSAssertionHandler handleFailureInFunction:file:lineNumber:description:] + 268 frame facebook#12: 0x000000031a3bcfc8 XPLAT_6_Framework`-[RCTComponentViewRegistry dequeueComponentViewWithComponentHandle:tag:] + 528 frame facebook#13: 0x000000031a3ccdec XPLAT_6_Framework`RCTPerformMountInstructions(std::__1::vector<facebook::react::ShadowViewMutation, std::__1::allocator<facebook::react::ShadowViewMutation>> const&, RCTComponentViewRegistry*, RCTMountingTransactionObserverCoordinator&, int) + 356 frame facebook#14: 0x000000031a3ccc7c XPLAT_6_Framework`-[RCTMountingManager performTransaction:]::$_1::operator()(facebook::react::MountingTransaction const&, facebook::react::SurfaceTelemetry const&) const + 80 frame facebook#15: 0x000000031a3ccc20 XPLAT_6_Framework`decltype(std::declval<-[RCTMountingManager performTransaction:]::$_1&>()(std::declval<facebook::react::MountingTransaction const&>(), std::declval<facebook::react::SurfaceTelemetry const&>())) std::__1::__invoke[abi:ne190102]<-[RCTMountingManager performTransaction:]::$_1&, facebook::react::MountingTransaction const&, facebook::react::SurfaceTelemetry const&>(-[RCTMountingManager performTransaction:]::$_1&, facebook::react::MountingTransaction const&, facebook::react::SurfaceTelemetry const&) + 40 frame facebook#16: 0x000000031a3ccbc8 XPLAT_6_Framework`void std::__1::__invoke_void_return_wrapper<void, true>::__call[abi:ne190102]<-[RCTMountingManager performTransaction:]::$_1&, facebook::react::MountingTransaction const&, facebook::react::SurfaceTelemetry const&>(-[RCTMountingManager performTransaction:]::$_1&, facebook::react::MountingTransaction const&, facebook::react::SurfaceTelemetry const&) + 40 frame facebook#17: 0x000000031a3ccb94 XPLAT_6_Framework`std::__1::__function::__alloc_func<-[RCTMountingManager performTransaction:]::$_1, std::__1::allocator<-[RCTMountingManager performTransaction:]::$_1>, void (facebook::react::MountingTransaction const&, facebook::react::SurfaceTelemetry const&)>::operator()[abi:ne190102](facebook::react::MountingTransaction const&, facebook::react::SurfaceTelemetry const&) + 44 frame facebook#18: 0x000000031a3cba1c XPLAT_6_Framework`std::__1::__function::__func<-[RCTMountingManager performTransaction:]::$_1, std::__1::allocator<-[RCTMountingManager performTransaction:]::$_1>, void (facebook::react::MountingTransaction const&, facebook::react::SurfaceTelemetry const&)>::operator()(facebook::react::MountingTransaction const&, facebook::react::SurfaceTelemetry const&) + 44 frame facebook#20: 0x000000032f219804 XPLAT_1_Framework`std::__1::function<void (facebook::react::MountingTransaction const&, facebook::react::SurfaceTelemetry const&)>::operator()(this=0x000000016d4f0c78, __arg=0x000000016d4f0a10, __arg=0x000000016d4f0978) const at function.h:989:10 frame facebook#21: 0x000000032f219668 XPLAT_1_Framework`facebook::react::TelemetryController::pullTransaction(this=0x00000003f4680f00, willMount=0x000000016d4f0c98, doMount=0x000000016d4f0c78, didMount=0x000000016d4f0c58) const at TelemetryController.cpp:39:3 frame facebook#22: 0x000000031a3c5b28 XPLAT_6_Framework`-[RCTMountingManager performTransaction:] + 544 frame facebook#23: 0x000000031a3c5864 XPLAT_6_Framework`-[RCTMountingManager initiateTransaction:] + 456 frame facebook#24: 0x000000031a3c5240 XPLAT_6_Framework`__42-[RCTMountingManager scheduleTransaction:]_block_invoke + 308 frame facebook#25: 0x0000000131f81b84 BOTTOMFramework`__RCTExecuteOnMainQueue_block_invoke + 40 frame facebook#26: 0x000000018017c788 libdispatch.dylib`_dispatch_call_block_and_release + 24 frame facebook#27: 0x0000000180197278 libdispatch.dylib`_dispatch_client_callout + 12 frame facebook#28: 0x00000001801b2fcc libdispatch.dylib`_dispatch_main_queue_drain.cold.7 + 24 frame facebook#29: 0x000000018018c1c4 libdispatch.dylib`_dispatch_main_queue_drain + 1184 frame facebook#30: 0x000000018018bd14 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 40 frame facebook#31: 0x0000000180427fec CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12 frame facebook#32: 0x00000001804229f8 CoreFoundation`__CFRunLoopRun + 1920 frame facebook#33: 0x0000000180421e3c CoreFoundation`CFRunLoopRunSpecific + 536 frame facebook#34: 0x0000000190f62d00 GraphicsServices`GSEventRunModal + 164 frame facebook#35: 0x0000000185bcec98 UIKitCore`-[UIApplication _run] + 796 frame facebook#36: 0x0000000185bd3064 UIKitCore`UIApplicationMain + 124 frame facebook#37: 0x0000000115fbf0bc PRODUCTFramework`main + 200 frame facebook#38: 0x00000001114293d8 dyld_sim`start_sim + 20 frame facebook#39: 0x0000000111506b4c dyld`start + 6000 ``` Reviewed By: rubennorte Differential Revision: D74654157 fbshipit-source-id: 9181bcd28524c71d0ca4620bd630dc0baa172386
Summary
Adds the accessibilityUnit to fabric CPP API (part of PR facebook#35130 Adding support for Android Accessibility TtsSpan API)
The TtsSpan API now supports verbatim, date, and fraction but may not work with other span types like phone numbers, currency, time, measure, and money.
An explanation of the use case is as follows:
Date, time, numbers, and locale lack control of readback details #30849
Implementing the above functionality requires adding a new prop to the react-native API responsible for managing attributes of nested Text.
The spans are updated based on a caching mechanism that re-renders the Android TextView only if specific attributes are updated. The updates are triggered only if the Text or Paragraph Text attributes change.
These mappings are configured in Java, CPP, and Javascript.
As this and PR #33468 require changes to the text attributes, the below work was needed this week:
Related: PR #4 - separating accessibilityUnit from accessibilityMinutes and accessibilityHours