From 4c3a2b2d90d7fa2027925205679d8bca943884ec Mon Sep 17 00:00:00 2001 From: iliapnmrv Date: Wed, 29 Jan 2025 16:20:45 +0300 Subject: [PATCH] [wip] tooltip text android --- .../Components/View/ReactNativeViewAttributes.js | 1 + .../Libraries/Components/View/ViewPropTypes.d.ts | 5 +++++ .../Libraries/Components/View/ViewPropTypes.js | 9 +++++++++ .../NativeComponent/BaseViewConfig.android.js | 1 + .../__snapshots__/public-api-test.js.snap | 2 ++ .../react-native/ReactAndroid/api/ReactAndroid.api | 2 ++ .../facebook/react/uimanager/BaseViewManager.java | 5 +++++ .../react/uimanager/BaseViewManagerDelegate.kt | 3 +++ .../java/com/facebook/react/uimanager/ViewProps.kt | 1 + .../components/view/HostPlatformViewProps.cpp | 14 ++++++++++++++ .../components/view/HostPlatformViewProps.h | 1 + packages/rn-tester/js/examples/View/ViewExample.js | 13 +++++++++++++ tools/api/ReactNativeCPP.api | 1 + 13 files changed, 58 insertions(+) diff --git a/packages/react-native/Libraries/Components/View/ReactNativeViewAttributes.js b/packages/react-native/Libraries/Components/View/ReactNativeViewAttributes.js index d07a319837aacb..ccfb1df627e3fc 100644 --- a/packages/react-native/Libraries/Components/View/ReactNativeViewAttributes.js +++ b/packages/react-native/Libraries/Components/View/ReactNativeViewAttributes.js @@ -28,6 +28,7 @@ const UIView = { nativeID: true, testID: true, renderToHardwareTextureAndroid: true, + tooltipTextAndroid: true, shouldRasterizeIOS: true, onLayout: true, onAccessibilityAction: true, diff --git a/packages/react-native/Libraries/Components/View/ViewPropTypes.d.ts b/packages/react-native/Libraries/Components/View/ViewPropTypes.d.ts index a1aa196ccbd6ee..c915b603c27297 100644 --- a/packages/react-native/Libraries/Components/View/ViewPropTypes.d.ts +++ b/packages/react-native/Libraries/Components/View/ViewPropTypes.d.ts @@ -99,6 +99,11 @@ export interface ViewPropsAndroid { */ renderToHardwareTextureAndroid?: boolean | undefined; + /** + * Displays a small descriptive message that appears near a view when users long press the view or hover their mouse over it + */ + tooltipTextAndroid?: string | undefined; + /** * Whether this `View` should be focusable with a non-touch input device, eg. receive focus with a hardware keyboard. */ diff --git a/packages/react-native/Libraries/Components/View/ViewPropTypes.js b/packages/react-native/Libraries/Components/View/ViewPropTypes.js index 8f5a93eb8fd24e..8a9ba0d372c09d 100644 --- a/packages/react-native/Libraries/Components/View/ViewPropTypes.js +++ b/packages/react-native/Libraries/Components/View/ViewPropTypes.js @@ -315,6 +315,15 @@ type AndroidViewProps = $ReadOnly<{ */ renderToHardwareTextureAndroid?: ?boolean, + /** + * Displays a small descriptive message that appears near a view when users long press the view or hover their mouse over it + * + * @platform android + * + * See https://reactnative.dev/docs/view#tooltipTextAndroid + */ + tooltipTextAndroid?: ?string, + /** * Controls how view is important for accessibility which is if it * fires accessibility events and if it is reported to accessibility services diff --git a/packages/react-native/Libraries/NativeComponent/BaseViewConfig.android.js b/packages/react-native/Libraries/NativeComponent/BaseViewConfig.android.js index 407943c4c9dc9c..b60c02f3ff6b09 100644 --- a/packages/react-native/Libraries/NativeComponent/BaseViewConfig.android.js +++ b/packages/react-native/Libraries/NativeComponent/BaseViewConfig.android.js @@ -182,6 +182,7 @@ const validAttributesForNonEventProps = { shadowColor: {process: require('../StyleSheet/processColor').default}, zIndex: true, renderToHardwareTextureAndroid: true, + tooltipTextAndroid: true, testID: true, nativeID: true, accessibilityLabelledBy: true, diff --git a/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap b/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap index 6433b89bbf2ab4..3fd7ea06bcad8e 100644 --- a/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap +++ b/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap @@ -3926,6 +3926,7 @@ exports[`public API should not change unintentionally Libraries/Components/View/ nativeID: true, testID: true, renderToHardwareTextureAndroid: true, + tooltipTextAndroid: true, shouldRasterizeIOS: true, onLayout: true, onAccessibilityAction: true, @@ -4186,6 +4187,7 @@ type AndroidViewProps = $ReadOnly<{ nativeBackgroundAndroid?: ?AndroidDrawable, nativeForegroundAndroid?: ?AndroidDrawable, renderToHardwareTextureAndroid?: ?boolean, + tooltipTextAndroid?: ?string, importantForAccessibility?: ?(\\"auto\\" | \\"yes\\" | \\"no\\" | \\"no-hide-descendants\\"), hasTVPreferredFocus?: ?boolean, nextFocusDown?: ?number, diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index 42834d90f17377..0e6ad16b4382ba 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -3954,6 +3954,7 @@ public abstract class com/facebook/react/uimanager/BaseViewManager : com/faceboo public fun setPointerOver (Landroid/view/View;Z)V public fun setPointerOverCapture (Landroid/view/View;Z)V public fun setRenderToHardwareTexture (Landroid/view/View;Z)V + public fun setTooltipText (Landroid/view/View;Z)V public fun setResponderEnd (Landroid/view/View;Z)V public fun setResponderGrant (Landroid/view/View;Z)V public fun setResponderMove (Landroid/view/View;Z)V @@ -5354,6 +5355,7 @@ public final class com/facebook/react/uimanager/ViewProps { public static final field POINTER_EVENTS Ljava/lang/String; public static final field POSITION Ljava/lang/String; public static final field RENDER_TO_HARDWARE_TEXTURE Ljava/lang/String; + public static final field TOOLTIP_TEXT Ljava/lang/String; public static final field RESIZE_METHOD Ljava/lang/String; public static final field RESIZE_MODE Ljava/lang/String; public static final field RIGHT Ljava/lang/String; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java index d55d7f3f3c9216..57f0128d92a0eb 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java @@ -271,6 +271,11 @@ public void setRenderToHardwareTexture(@NonNull T view, boolean useHWTexture) { view.setTag(R.id.use_hardware_layer, useHWTexture); } + @ReactProp(name = ViewProps.TOOLTIP_TEXT) + public void setTooltipText(@NonNull T view, String tooltipText) { + view.setTooltipText(tooltipText); + } + @ReactProp(name = ViewProps.TEST_ID) public void setTestId(@NonNull T view, @Nullable String testId) { view.setTag(R.id.react_test_id, testId); diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManagerDelegate.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManagerDelegate.kt index 6c0c24890d874c..00755b3ebc57bc 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManagerDelegate.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManagerDelegate.kt @@ -108,6 +108,9 @@ public abstract class BaseViewManagerDelegate< ViewProps.RENDER_TO_HARDWARE_TEXTURE -> mViewManager.setRenderToHardwareTexture(view, value as Boolean? ?: false) + ViewProps.TOOLTIP_TEXT -> + mViewManager.setTooltipText(view, value as String?) + ViewProps.ROTATION -> mViewManager.setRotation(view, (value as Double?)?.toFloat() ?: 0.0f) ViewProps.SCALE_X -> mViewManager.setScaleX(view, (value as Double?)?.toFloat() ?: 1.0f) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewProps.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewProps.kt index 1e882c2a28ac87..3ded295f473a47 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewProps.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewProps.kt @@ -147,6 +147,7 @@ public object ViewProps { public const val SHADOW_COLOR: String = "shadowColor" public const val Z_INDEX: String = "zIndex" public const val RENDER_TO_HARDWARE_TEXTURE: String = "renderToHardwareTextureAndroid" + public const val TOOLTIP_TEXT: String = "tooltipTextAndroid" public const val ACCESSIBILITY_LABEL: String = "accessibilityLabel" public const val ACCESSIBILITY_COLLECTION: String = "accessibilityCollection" public const val ACCESSIBILITY_COLLECTION_ITEM: String = "accessibilityCollectionItem" diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.cpp index 4355fed6c457ad..54886358f1df30 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.cpp @@ -85,6 +85,15 @@ HostPlatformViewProps::HostPlatformViewProps( rawProps, "renderToHardwareTextureAndroid", sourceProps.renderToHardwareTextureAndroid, + {})), + tooltipTextAndroid( + ReactNativeFeatureFlags::enableCppPropsIteratorSetter() + ? sourceProps.tooltipTextAndroid + : convertRawProp( + context, + rawProps, + "tooltipTextAndroid", + sourceProps.tooltipTextAndroid, {})) {} #define VIEW_EVENT_CASE(eventType) \ @@ -513,6 +522,11 @@ folly::dynamic HostPlatformViewProps::getDiffProps( oldProps->renderToHardwareTextureAndroid) { result["renderToHardwareTextureAndroid"] = renderToHardwareTextureAndroid; } + + if (tooltipTextAndroid != + oldProps->tooltipTextAndroid) { + result["tooltipTextAndroid"] = tooltipTextAndroid; + } if (opacity != oldProps->opacity) { result["opacity"] = opacity; diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.h b/packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.h index d18d7e863bbdf9..0d3773d839de7d 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.h @@ -47,6 +47,7 @@ class HostPlatformViewProps : public BaseViewProps { bool hasTVPreferredFocus{false}; bool needsOffscreenAlphaCompositing{false}; bool renderToHardwareTextureAndroid{false}; + std::string tooltipTextAndroid{}; #pragma mark - Convenience Methods diff --git a/packages/rn-tester/js/examples/View/ViewExample.js b/packages/rn-tester/js/examples/View/ViewExample.js index 4546c299f19f17..12f1436118a0cd 100644 --- a/packages/rn-tester/js/examples/View/ViewExample.js +++ b/packages/rn-tester/js/examples/View/ViewExample.js @@ -657,6 +657,14 @@ function BoxSizingExample(): React.Node { ); } +function TooltipTextAndroidExample(): React.Node { + return ( + + + + ); +} + export default ({ title: 'View', documentationURL: 'https://reactnative.dev/docs/view', @@ -1321,5 +1329,10 @@ export default ({ name: 'box-sizing', render: BoxSizingExample, }, + { + title: 'Tooltip text android', + name: 'tooltip-text', + render: TooltipTextAndroidExample, + }, ], }: RNTesterModule); diff --git a/tools/api/ReactNativeCPP.api b/tools/api/ReactNativeCPP.api index 1f58222fd235af..62ad56364fef00 100644 --- a/tools/api/ReactNativeCPP.api +++ b/tools/api/ReactNativeCPP.api @@ -23195,6 +23195,7 @@ class HostPlatformViewProps : public BaseViewProps { bool hasTVPreferredFocus{false}; bool needsOffscreenAlphaCompositing{false}; bool renderToHardwareTextureAndroid{false}; + std::string tooltipTextAndroid{}; bool getProbablyMoreHorizontalThanVertical_DEPRECATED() const; }; } // namespace facebook::react