From c5c6621af4dd58894af4b905fdae26de61d0d4cf Mon Sep 17 00:00:00 2001 From: David Vacca Date: Wed, 22 Jan 2025 09:33:53 -0800 Subject: [PATCH 1/2] [skip ci] Introduce getDiffProps for (#45552) Summary: In this diff I'm overriding the getDiffProps for ViewProps. The goal is to verify what's the impact of calculating diffs of props in Android, starting with ViewProps. Once we verify what are the implication we will automatic implement this diffing. The full implementation of this method will be implemented in the following diffs changelog: [internal] internal Reviewed By: NickGerleman Differential Revision: D59969328 --- .../components/view/HostPlatformViewProps.cpp | 21 +++++++++++++++++++ .../components/view/HostPlatformViewProps.h | 6 ++++++ 2 files changed, 27 insertions(+) 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 dfbae60abd7c94..352b8274c929db 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 @@ -133,4 +133,25 @@ SharedDebugStringConvertibleList HostPlatformViewProps::getDebugProps() const { } #endif +#ifdef ANDROID + +folly::dynamic HostPlatformViewProps::getDiffProps( + const Props* prevProps) const { + folly::dynamic result = folly::dynamic::object(); + + static const auto defaultProps = HostPlatformViewProps(); + + const HostPlatformViewProps* oldProps = prevProps == nullptr + ? &defaultProps + : static_cast(prevProps); + + if (focusable != oldProps->focusable) { + result["focusable"] = focusable; + } + + return result; +} + +#endif + } // namespace facebook::react 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 25a6cd30529b1a..d18d7e863bbdf9 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 @@ -55,6 +55,12 @@ class HostPlatformViewProps : public BaseViewProps { #if RN_DEBUG_STRING_CONVERTIBLE SharedDebugStringConvertibleList getDebugProps() const override; #endif + +#ifdef ANDROID + + folly::dynamic getDiffProps(const Props* prevProps) const override; + +#endif }; } // namespace facebook::react From 0d5f448fbb43f268a4c8e9aa0fdfbd7da7f6e6a4 Mon Sep 17 00:00:00 2001 From: David Vacca Date: Wed, 22 Jan 2025 09:33:53 -0800 Subject: [PATCH 2/2] Implement prop diffing for basic props in (#48829) Summary: This diff implements the diffing for basic props of changelog: [internal] internal Reviewed By: NickGerleman Differential Revision: D59972040 --- .../components/view/HostPlatformViewProps.cpp | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) 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 352b8274c929db..d46e6425f9c84e 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 @@ -145,10 +145,116 @@ folly::dynamic HostPlatformViewProps::getDiffProps( ? &defaultProps : static_cast(prevProps); + if (this == oldProps) { + return result; + } if (focusable != oldProps->focusable) { result["focusable"] = focusable; } + if (hasTVPreferredFocus != oldProps->hasTVPreferredFocus) { + result["hasTVPreferredFocus"] = hasTVPreferredFocus; + } + + if (needsOffscreenAlphaCompositing != + oldProps->needsOffscreenAlphaCompositing) { + result["needsOffscreenAlphaCompositing"] = needsOffscreenAlphaCompositing; + } + + if (renderToHardwareTextureAndroid != + oldProps->renderToHardwareTextureAndroid) { + result["renderToHardwareTextureAndroid"] = renderToHardwareTextureAndroid; + } + + if (opacity != oldProps->opacity) { + result["opacity"] = opacity; + } + + if (backgroundColor != oldProps->backgroundColor) { + result["backgroundColor"] = *backgroundColor; + } + + if (shadowColor != oldProps->shadowColor) { + result["shadowColor"] = *shadowColor; + } + + if (shadowOpacity != oldProps->shadowOpacity) { + result["shadowOpacity"] = shadowOpacity; + } + + if (shadowRadius != oldProps->shadowRadius) { + result["shadowRadius"] = shadowRadius; + } + + if (shouldRasterize != oldProps->shouldRasterize) { + result["shouldRasterize"] = shouldRasterize; + } + + if (collapsable != oldProps->collapsable) { + result["collapsable"] = collapsable; + } + + if (removeClippedSubviews != oldProps->removeClippedSubviews) { + result["removeClippedSubviews"] = removeClippedSubviews; + } + + if (onLayout != oldProps->onLayout) { + result["onLayout"] = onLayout; + } + + if (zIndex != oldProps->zIndex) { + result["zIndex"] = zIndex.value(); + } + + if (pointerEvents != oldProps->pointerEvents) { + std::string value; + switch (pointerEvents) { + case PointerEventsMode::BoxOnly: + result["pointerEvents"] = "box-only"; + break; + case PointerEventsMode::BoxNone: + result["pointerEvents"] = "box-none"; + break; + case PointerEventsMode::None: + result["pointerEvents"] = "none"; + break; + default: + result["pointerEvents"] = "auto"; + break; + } + + if (nativeId != oldProps->nativeId) { + result["nativeId"] = nativeId; + } + + if (testId != oldProps->testId) { + result["testId"] = testId; + } + + if (accessible != oldProps->accessible) { + result["accessible"] = accessible; + } + + if (getClipsContentToBounds() != oldProps->getClipsContentToBounds()) { + result["overflow"] = getClipsContentToBounds() ? "hidden" : "visible"; + result["scroll"] = result["overflow"]; + } + + if (backfaceVisibility != oldProps->backfaceVisibility) { + switch (backfaceVisibility) { + case BackfaceVisibility::Auto: + result["backfaceVisibility"] = "auto"; + break; + case BackfaceVisibility::Visible: + result["backfaceVisibility"] = "visible"; + break; + case BackfaceVisibility::Hidden: + result["backfaceVisibility"] = "hidden"; + break; + } + } + } + return result; }