diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp index 7401f8ad813103..b96133bfaf0e0b 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp @@ -220,6 +220,17 @@ static inline float scale(Float value, Float pointScaleFactor) { jni::local_ref FabricMountingManager::getProps( const ShadowView& oldShadowView, const ShadowView& newShadowView) { + auto componentName = newShadowView.componentName; + // We calculate the diffing between the props of the last mounted ShadowTree + // and the Props of the latest commited ShadowTree). ONLY for + // components when the "enablePropsUpdateReconciliationAndroid" feature flag + // is enabled. + if (ReactNativeFeatureFlags::enablePropsUpdateReconciliationAndroid() && + strcmp(componentName, "View") == 0) { + const Props* oldProps = oldShadowView.props.get(); + auto diffProps = newShadowView.props->getDiffProps(oldProps); + return ReadableNativeMap::newObjectCxxArgs(diffProps); + } return ReadableNativeMap::newObjectCxxArgs(newShadowView.props->rawProps); } diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewProps.cpp index 939690249352d6..76ee628a67db20 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewProps.cpp @@ -432,12 +432,8 @@ static BorderRadii radiiPercentToPoint( }; } -BorderMetrics BaseViewProps::resolveBorderMetrics( - const LayoutMetrics& layoutMetrics) const { - auto isRTL = - bool{layoutMetrics.layoutDirection == LayoutDirection::RightToLeft}; - - auto borderWidths = CascadedBorderWidths{ +CascadedBorderWidths BaseViewProps::getBorderWidths() const { + return CascadedBorderWidths{ /* .left = */ optionalFloatFromYogaValue( yogaStyle.border(yoga::Edge::Left)), /* .top = */ @@ -457,6 +453,14 @@ BorderMetrics BaseViewProps::resolveBorderMetrics( /* .all = */ optionalFloatFromYogaValue(yogaStyle.border(yoga::Edge::All)), }; +} + +BorderMetrics BaseViewProps::resolveBorderMetrics( + const LayoutMetrics& layoutMetrics) const { + auto isRTL = + bool{layoutMetrics.layoutDirection == LayoutDirection::RightToLeft}; + + auto borderWidths = getBorderWidths(); BorderRadii radii = radiiPercentToPoint( borderRadii.resolve(isRTL, ValueUnit{0.0f, UnitType::Point}), diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewProps.h b/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewProps.h index ff5c4971075835..452e2bd9b53e12 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewProps.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewProps.h @@ -96,6 +96,7 @@ class BaseViewProps : public YogaStylableProps, public AccessibilityProps { #pragma mark - Convenience Methods + CascadedBorderWidths getBorderWidths() const; BorderMetrics resolveBorderMetrics(const LayoutMetrics& layoutMetrics) const; Transform resolveTransform(const LayoutMetrics& layoutMetrics) const; bool getClipsContentToBounds() const; diff --git a/packages/react-native/ReactCommon/react/renderer/core/Props.h b/packages/react-native/ReactCommon/react/renderer/core/Props.h index 0c34109850fc64..144cc8a039d0d3 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/Props.h +++ b/packages/react-native/ReactCommon/react/renderer/core/Props.h @@ -59,6 +59,11 @@ class Props : public virtual Sealable, public virtual DebugStringConvertible { #ifdef ANDROID folly::dynamic rawProps = folly::dynamic::object(); + + virtual folly::dynamic getDiffProps(const Props* prevProps) const { + return folly::dynamic::object(); + } + #endif protected: