From ca5a0cc765d14f8c8af7dd503a617ca600c4ebfb Mon Sep 17 00:00:00 2001 From: Bartlomiej Bloniarz Date: Tue, 7 Oct 2025 23:43:09 -0700 Subject: [PATCH] Make android work Differential Revision: D84055754 --- .../animated/NativeAnimatedNodesManager.cpp | 1 + .../NativeAnimatedNodesManagerProvider.cpp | 18 ++++++++----- .../animationbackend/AnimationBackend.cpp | 26 +++++++++++++++---- .../animationbackend/AnimationBackend.h | 14 ++++++++++ 4 files changed, 48 insertions(+), 11 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp index 248018cb4ed..bcfb9ec51ba 100644 --- a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp +++ b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp @@ -975,6 +975,7 @@ AnimationMutations NativeAnimatedNodesManager::pullAnimationMutations() { AnimationMutation{tag, nullptr, propsBuilder.get()}); containsChange = true; } + updateViewPropsDirect_.clear(); } if (!containsChange) { diff --git a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp index 8f45b416490..110b25f258b 100644 --- a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp +++ b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp @@ -82,6 +82,12 @@ NativeAnimatedNodesManagerProvider::getOrCreate( nativeAnimatedNodesManager_ = std::make_shared(animationBackend_); + nativeAnimatedDelegate_ = + std::make_shared( + animationBackend_); + + uiManager->setNativeAnimatedDelegate(nativeAnimatedDelegate_); + uiManager->unstable_setAnimationBackend(animationBackend_); } else { nativeAnimatedNodesManager_ = @@ -90,6 +96,12 @@ NativeAnimatedNodesManagerProvider::getOrCreate( std::move(fabricCommitCallback), std::move(startOnRenderCallback_), std::move(stopOnRenderCallback_)); + + nativeAnimatedDelegate_ = + std::make_shared( + nativeAnimatedNodesManager_); + + uiManager->setNativeAnimatedDelegate(nativeAnimatedDelegate_); } addEventEmitterListener( @@ -112,12 +124,6 @@ NativeAnimatedNodesManagerProvider::getOrCreate( return false; })); - nativeAnimatedDelegate_ = - std::make_shared( - nativeAnimatedNodesManager_); - - uiManager->setNativeAnimatedDelegate(nativeAnimatedDelegate_); - // TODO: remove force casting. auto* scheduler = (Scheduler*)uiManager->getDelegate(); animatedMountingOverrideDelegate_ = diff --git a/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.cpp b/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.cpp index c5e438c6eea..449a2fa0242 100644 --- a/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.cpp +++ b/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.cpp @@ -10,6 +10,18 @@ namespace facebook::react { +UIManagerNativeAnimatedDelegateBackendImpl:: + UIManagerNativeAnimatedDelegateBackendImpl( + std::weak_ptr animationBackend) + : animationBackend_(std::move(animationBackend)) {} + +void UIManagerNativeAnimatedDelegateBackendImpl::runAnimationFrame() { + if (auto animationBackendStrong = animationBackend_.lock()) { + animationBackendStrong->onAnimationFrame( + std::chrono::steady_clock::now().time_since_epoch().count() / 1000); + } +} + static inline Props::Shared cloneProps( AnimatedProps& animatedProps, const ShadowNode& shadowNode) { @@ -108,13 +120,17 @@ void AnimationBackend::onAnimationFrame(double timestamp) { void AnimationBackend::start(const Callback& callback) { callbacks.push_back(callback); // TODO: startOnRenderCallback_ should provide the timestamp from the platform - startOnRenderCallback_([this]() { - onAnimationFrame( - std::chrono::steady_clock::now().time_since_epoch().count() / 1000); - }); + if (startOnRenderCallback_) { + startOnRenderCallback_([this]() { + onAnimationFrame( + std::chrono::steady_clock::now().time_since_epoch().count() / 1000); + }); + } } void AnimationBackend::stop() { - stopOnRenderCallback_(); + if (stopOnRenderCallback_) { + stopOnRenderCallback_(); + } callbacks.clear(); } diff --git a/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.h b/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.h index b4eea2d64c3..1fd0f87dcf8 100644 --- a/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.h +++ b/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.h @@ -18,6 +18,20 @@ namespace facebook::react { +class AnimationBackend; + +class UIManagerNativeAnimatedDelegateBackendImpl + : public UIManagerNativeAnimatedDelegate { + public: + explicit UIManagerNativeAnimatedDelegateBackendImpl( + std::weak_ptr animationBackend); + + void runAnimationFrame() override; + + private: + std::weak_ptr animationBackend_; +}; + struct AnimationMutation { Tag tag; const ShadowNodeFamily* family;