Skip to content

Commit a96ad8a

Browse files
committed
DRAFT CPP solution to pass static string as accessibilityUnit
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)
1 parent ec4bc8e commit a96ad8a

File tree

7 files changed

+38
-6
lines changed

7 files changed

+38
-6
lines changed

ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManagerDelegate.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package com.facebook.react.uimanager;
99

10+
import android.util.Log;
1011
import android.view.View;
1112
import androidx.annotation.Nullable;
1213
import com.facebook.react.bridge.ColorPropConverter;
@@ -30,6 +31,8 @@ public BaseViewManagerDelegate(U viewManager) {
3031

3132
@Override
3233
public void setProperty(T view, String propName, @Nullable Object value) {
34+
Log.w("TESTING::BaseViewManagerDelegate", "propName: " + (propName));
35+
Log.w("TESTING::BaseViewManagerDelegate", "value: " + (value));
3336
switch (propName) {
3437
case ViewProps.ACCESSIBILITY_ACTIONS:
3538
mViewManager.setAccessibilityActions(view, (ReadableArray) value);

ReactAndroid/src/main/java/com/facebook/react/views/text/ReactBaseTextShadowNode.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import android.text.Spannable;
1616
import android.text.SpannableStringBuilder;
1717
import android.text.TextUtils;
18+
import android.util.Log;
1819
import android.view.Gravity;
1920
import androidx.annotation.Nullable;
2021
import com.facebook.infer.annotation.Assertions;
@@ -507,6 +508,8 @@ public void setBackgroundColor(@Nullable Integer color) {
507508

508509
@ReactProp(name = ViewProps.ACCESSIBILITY_ROLE)
509510
public void setIsAccessibilityLink(@Nullable String accessibilityRole) {
511+
Log.w("TESTING::ReactBaseTextShadowNode", "setIsAccessibilityLink");
512+
Log.w("TESTING::ReactBaseTextShadowNode", "accessibilityRole: " + (accessibilityRole));
510513
if (isVirtual()) {
511514
String roleClassName =
512515
AccessibilityRole.getValue(AccessibilityRole.fromValue(accessibilityRole));
@@ -519,6 +522,8 @@ public void setIsAccessibilityLink(@Nullable String accessibilityRole) {
519522

520523
@ReactProp(name = "accessibilityUnit")
521524
public void setAccessibilityUnit(@Nullable String accessibilityUnit) {
525+
Log.w("TESTING::ReactBaseTextShadowNode", "setAccessibilityUnit");
526+
Log.w("TESTING::ReactBaseTextShadowNode", "accessibilityUnit: " + (accessibilityUnit));
522527
if (isVirtual()) {
523528
markUpdated();
524529
}

ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import android.text.Layout;
1212
import android.text.TextUtils;
1313
import android.util.LayoutDirection;
14+
import android.util.Log;
1415
import android.view.Gravity;
1516
import androidx.annotation.Nullable;
1617
import com.facebook.react.bridge.JSApplicationIllegalArgumentException;
@@ -53,6 +54,7 @@ public class TextAttributeProps {
5354
public static final short TA_KEY_IS_HIGHLIGHTED = 20;
5455
public static final short TA_KEY_LAYOUT_DIRECTION = 21;
5556
public static final short TA_KEY_ACCESSIBILITY_ROLE = 22;
57+
public static final short TA_KEY_ACCESSIBILITY_UNIT = 47;
5658

5759
public static final int UNSET = -1;
5860

@@ -144,6 +146,8 @@ public static TextAttributeProps fromMapBuffer(MapBuffer props) {
144146

145147
// TODO T83483191: Review constants that are not being set!
146148
Iterator<MapBuffer.Entry> iterator = props.iterator();
149+
Log.w("TESTING::TextAttributeProps", "fromMapBuffer");
150+
Log.w("TESTING::TextAttributeProps", "props: " + (props));
147151
while (iterator.hasNext()) {
148152
MapBuffer.Entry entry = iterator.next();
149153
switch (entry.getKey()) {
@@ -206,6 +210,9 @@ public static TextAttributeProps fromMapBuffer(MapBuffer props) {
206210
case TA_KEY_ACCESSIBILITY_ROLE:
207211
result.setAccessibilityRole(entry.getStringValue());
208212
break;
213+
case TA_KEY_ACCESSIBILITY_UNIT:
214+
result.setAccessibilityUnit(entry.getStringValue());
215+
break;
209216
}
210217
}
211218

@@ -602,6 +609,8 @@ private void setTextTransform(@Nullable String textTransform) {
602609

603610
private void setAccessibilityRole(@Nullable String accessibilityRole) {
604611
if (accessibilityRole != null) {
612+
Log.w("TESTING::TextAttributeProps", "setAccessibilityRole");
613+
Log.w("TESTING::TextAttributeProps", "accessibilityRole: " + (accessibilityRole));
605614
mIsAccessibilityRoleSet = true;
606615
mAccessibilityRole = AccessibilityRole.fromValue(accessibilityRole);
607616
mIsAccessibilityLink = mAccessibilityRole.equals(AccessibilityRole.LINK);
@@ -613,6 +622,8 @@ private void setAccessibilityRole(@Nullable String accessibilityRole) {
613622
}
614623

615624
private void setAccessibilityUnit(@Nullable String accessibilityUnit) {
625+
Log.w("TESTING::TextAttributeProps", "setAccessibilityUnit");
626+
Log.w("TESTING::TextAttributeProps", "accessibilityUnit: " + (accessibilityUnit));
616627
// not yet implemented
617628
}
618629

ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import android.text.StaticLayout;
2020
import android.text.TextPaint;
2121
import android.util.LayoutDirection;
22+
import android.util.Log;
2223
import android.util.LruCache;
2324
import android.view.View;
2425
import androidx.annotation.NonNull;
@@ -196,6 +197,7 @@ public static Spannable getOrCreateSpannableForText(
196197
Context context,
197198
ReadableMap attributedString,
198199
@Nullable ReactTextViewManagerCallback reactTextViewManagerCallback) {
200+
Log.w("TESTING::TextLayoutManager", "getOrCreateSpannableForText");
199201

200202
return createSpannableFromAttributedString(
201203
context, attributedString, reactTextViewManagerCallback);

ReactAndroid/src/main/java/com/facebook/react/views/view/ReactMapBufferPropSetter.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ object ReactMapBufferPropSetter {
133133
viewManager.accessibilityState(view, entry.mapBufferValue)
134134
}
135135
VP_ACCESSIBILITY_UNIT -> {
136-
viewManager.accessibilityUnit(view, entry.stringValue)
136+
viewManager.setAccessibilityUnit(view, entry.stringValue.takeIf { it.isNotEmpty() })
137137
}
138138
VP_ACCESSIBILITY_VALUE -> {
139139
viewManager.accessibilityValue(view, entry.stringValue)
@@ -285,11 +285,8 @@ object ReactMapBufferPropSetter {
285285

286286
private fun ReactViewManager.accessibilityUnit(view: ReactViewGroup, value: String) {
287287
Log.w("TESTING::ReactMapBufferPropSetter", "accessibilityUnit");
288-
/*
289-
val accessibilityUnit = JavaOnlyMap()
290-
accessibilityUnit.putString("hours", "10")
291-
setAccessibilityUnit(view, accessibilityUnit)
292-
*/
288+
Log.w("TESTING::ReactMapBufferPropSetter", "value: " + ( value ));
289+
setAccessibilityUnit(view,"random string")
293290
}
294291

295292
private fun ReactViewManager.accessibilityState(view: ReactViewGroup, value: MapBuffer) {

ReactCommon/react/renderer/attributedstring/conversions.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,6 +1083,7 @@ constexpr static MapBuffer::Key TA_KEY_IS_HIGHLIGHTED = 20;
10831083
constexpr static MapBuffer::Key TA_KEY_LAYOUT_DIRECTION = 21;
10841084
constexpr static MapBuffer::Key TA_KEY_ACCESSIBILITY_ROLE = 22;
10851085
constexpr static MapBuffer::Key TA_KEY_LINE_BREAK_STRATEGY = 23;
1086+
constexpr static MapBuffer::Key TA_KEY_ACCESSIBILITY_UNIT = 47;
10861087

10871088
// constants for ParagraphAttributes serialization
10881089
constexpr static MapBuffer::Key PA_KEY_MAX_NUMBER_OF_LINES = 0;
@@ -1226,8 +1227,12 @@ inline MapBuffer toMapBuffer(const TextAttributes &textAttributes) {
12261227
TA_KEY_LAYOUT_DIRECTION, toString(*textAttributes.layoutDirection));
12271228
}
12281229
if (textAttributes.accessibilityRole.has_value()) {
1230+
1231+
LOG(ERROR) << "TESTING:: attributedString conversions.h accessibilityRole: " << toString(*textAttributes.accessibilityRole);
12291232
builder.putString(
12301233
TA_KEY_ACCESSIBILITY_ROLE, toString(*textAttributes.accessibilityRole));
1234+
builder.putString(
1235+
TA_KEY_ACCESSIBILITY_UNIT, "random unit");
12311236
}
12321237
return builder.build();
12331238
}

packages/rn-tester/js/examples/Accessibility/AccessibilityExample.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,15 @@ class AccessibilityExample extends React.Component<{}> {
178178
17:00
179179
</Text>
180180
</Text>
181+
<Text accessible={true}>
182+
This is a
183+
<Text
184+
accessibilityRole="link"
185+
accessible={true}
186+
style={{backgroundColor: 'red'}}>
187+
link
188+
</Text>
189+
</Text>
181190
</View>
182191
<View>
183192
<Text accessible={true} accessibilityRole="telephone">

0 commit comments

Comments
 (0)