From 2c50e7043bfbc1392b85c19cccb2db884c328559 Mon Sep 17 00:00:00 2001 From: David Vacca Date: Wed, 22 Jan 2025 12:07:06 -0800 Subject: [PATCH] Implement prop diffing for nativeForegroundAndroid prop (#48834) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/48834 Implement prop diffing for nativeForegroundAndroid prop changelog: [internal] internal Reviewed By: rshest Differential Revision: D60001410 fbshipit-source-id: c6b5b71ddb66136f9cf61e2cca5aeb6e1274841e --- .../views/scroll/ReactScrollViewHelper.kt | 2 +- .../components/view/HostPlatformViewProps.cpp | 44 ++++++++++++++++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.kt index cb84aecaed2..5744008c915 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.kt @@ -114,7 +114,7 @@ public object ReactScrollViewHelper { return } val contentView = scrollView.getChildAt(0) ?: return - for (scrollListener in scrollListeners) { + for (scrollListener in scrollListeners.toList()) { scrollListener.get()?.onScroll(scrollView, scrollEventType, xVelocity, yVelocity) } val reactContext = scrollView.context as ReactContext 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 dfa14d0fde8..4355fed6c45 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 @@ -336,6 +336,38 @@ static void updateBorderColorsProps( oldBorderColor.blockStart); } +inline static void updateNativeDrawableProp( + folly::dynamic& result, + const std::string& propName, + const std::optional& nativeDrawable) { + folly::dynamic nativeDrawableResult; + if (nativeDrawable.has_value()) { + nativeDrawableResult = folly::dynamic::object(); + const auto& nativeDrawableValue = nativeDrawable.value(); + nativeDrawableResult["attribute"] = nativeDrawableValue.themeAttr; + switch (nativeDrawableValue.kind) { + case NativeDrawable::Kind::Ripple: + nativeDrawableResult["type"] = "RippleAndroid"; + break; + case NativeDrawable::Kind::ThemeAttr: + nativeDrawableResult["type"] = "ThemeAttrAndroid"; + break; + } + if (nativeDrawableValue.ripple.rippleRadius.has_value()) { + nativeDrawableResult["rippleRadius"] = + nativeDrawableValue.ripple.rippleRadius.value(); + } + if (nativeDrawableValue.ripple.color.has_value()) { + nativeDrawableResult["color"] = nativeDrawableValue.ripple.color.value(); + } + nativeDrawableResult["borderless"] = nativeDrawableValue.ripple.borderless; + } else { + nativeDrawableResult = folly::dynamic(nullptr); + } + + result[propName] = nativeDrawableResult; +} + inline static void updateTransformOperationValue( const std::string& operationName, const ValueUnit& valueUnit, @@ -571,8 +603,18 @@ folly::dynamic HostPlatformViewProps::getDiffProps( } } - // TODO T212662692: pass events as std::bitset<64> to java + if (nativeBackground != oldProps->nativeBackground) { + updateNativeDrawableProp( + result, "nativeBackgroundAndroid", nativeBackground); + } + + if (nativeForeground != oldProps->nativeForeground) { + updateNativeDrawableProp( + result, "nativeForegroundAndroid", nativeForeground); + } + // Events + // TODO T212662692: pass events as std::bitset<64> to java if (events != oldProps->events) { updateEventProp( result,