diff --git a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp index 248018cb4ed218..b2535e5d9f68c0 100644 --- a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp +++ b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp @@ -539,7 +539,7 @@ void NativeAnimatedNodesManager::startRenderCallbackIfNeeded() { } if (startOnRenderCallback_) { - startOnRenderCallback_([this]() { onRender(); }); + startOnRenderCallback_(); } } diff --git a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.h b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.h index 9ecf6de7443b6d..62f4698811f628 100644 --- a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.h +++ b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.h @@ -61,7 +61,7 @@ class NativeAnimatedNodesManager { std::function; using FabricCommitCallback = std::function&)>; - using StartOnRenderCallback = std::function&&)>; + using StartOnRenderCallback = std::function; using StopOnRenderCallback = std::function; explicit NativeAnimatedNodesManager( diff --git a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp index 8f45b416490735..1e7b48894c446d 100644 --- a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp +++ b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp @@ -19,23 +19,41 @@ namespace facebook::react { UIManagerNativeAnimatedDelegateImpl::UIManagerNativeAnimatedDelegateImpl( - std::weak_ptr nativeAnimatedNodesManager) - : nativeAnimatedNodesManager_(std::move(nativeAnimatedNodesManager)) {} + NativeAnimatedNodesManagerProvider::FrameRateListenerCallback + frameRateListenerCallback) + : frameRateListenerCallback_(std::move(frameRateListenerCallback)) {} void UIManagerNativeAnimatedDelegateImpl::runAnimationFrame() { if (auto nativeAnimatedNodesManagerStrong = nativeAnimatedNodesManager_.lock()) { + if (frameRateListenerCallback_) { + frameRateListenerCallback_(true); + } nativeAnimatedNodesManagerStrong->onRender(); } } NativeAnimatedNodesManagerProvider::NativeAnimatedNodesManagerProvider( - NativeAnimatedNodesManager::StartOnRenderCallback startOnRenderCallback, - NativeAnimatedNodesManager::StopOnRenderCallback stopOnRenderCallback) + StartOnRenderCallback startOnRenderCallback, + StopOnRenderCallback stopOnRenderCallback, + FrameRateListenerCallback frameRateListenerCallback) : eventEmitterListenerContainer_( std::make_shared()), - startOnRenderCallback_(std::move(startOnRenderCallback)), - stopOnRenderCallback_(std::move(stopOnRenderCallback)) {} + frameRateListenerCallback_(std::move(frameRateListenerCallback)), + startOnRenderCallback_(std::move(startOnRenderCallback)) { + if (frameRateListenerCallback_) { + stopOnRenderCallback_ = [this, stopOnRenderCallback]() { + if (stopOnRenderCallback) { + stopOnRenderCallback(); + } + if (frameRateListenerCallback_) { + frameRateListenerCallback_(false); + } + }; + } else { + stopOnRenderCallback_ = std::move(stopOnRenderCallback); + } +} std::shared_ptr NativeAnimatedNodesManagerProvider::getOrCreate( @@ -67,6 +85,10 @@ NativeAnimatedNodesManagerProvider::getOrCreate( uiManager->synchronouslyUpdateViewOnUIThread(viewTag, props); }; + nativeAnimatedDelegate_ = + std::make_shared( + frameRateListenerCallback_); + if (ReactNativeFeatureFlags::useSharedAnimatedBackend()) { #ifdef RN_USE_ANIMATION_BACKEND // TODO: this should be initialized outside of animated, but for now it @@ -84,14 +106,29 @@ NativeAnimatedNodesManagerProvider::getOrCreate( uiManager->unstable_setAnimationBackend(animationBackend_); } else { + auto startOnRenderCallback = [this, + startOnRenderCallbackFn = + std::move(startOnRenderCallback_)]() { + if (startOnRenderCallbackFn) { + startOnRenderCallbackFn([this]() { + if (nativeAnimatedDelegate_) { + nativeAnimatedDelegate_->runAnimationFrame(); + } + }); + } + }; nativeAnimatedNodesManager_ = std::make_shared( std::move(directManipulationCallback), std::move(fabricCommitCallback), - std::move(startOnRenderCallback_), + std::move(startOnRenderCallback), std::move(stopOnRenderCallback_)); } + std::static_pointer_cast( + nativeAnimatedDelegate_) + ->setNativeAnimatedNodesManager(nativeAnimatedNodesManager_); + addEventEmitterListener( nativeAnimatedNodesManager_->getEventEmitterListener()); @@ -112,10 +149,6 @@ NativeAnimatedNodesManagerProvider::getOrCreate( return false; })); - nativeAnimatedDelegate_ = - std::make_shared( - nativeAnimatedNodesManager_); - uiManager->setNativeAnimatedDelegate(nativeAnimatedDelegate_); // TODO: remove force casting. diff --git a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.h b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.h index cf409bf1953ff5..9f170673f264d2 100644 --- a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.h +++ b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.h @@ -13,27 +13,19 @@ namespace facebook::react { -class UIManagerNativeAnimatedDelegateImpl - : public UIManagerNativeAnimatedDelegate { - public: - explicit UIManagerNativeAnimatedDelegateImpl( - std::weak_ptr nativeAnimatedNodesManager); - - void runAnimationFrame() override; - - private: - std::weak_ptr nativeAnimatedNodesManager_; -}; - class AnimatedMountingOverrideDelegate; class NativeAnimatedNodesManagerProvider { public: + using FrameRateListenerCallback = + std::function; + using StartOnRenderCallback = std::function&&)>; + using StopOnRenderCallback = NativeAnimatedNodesManager::StopOnRenderCallback; + NativeAnimatedNodesManagerProvider( - NativeAnimatedNodesManager::StartOnRenderCallback startOnRenderCallback = - nullptr, - NativeAnimatedNodesManager::StopOnRenderCallback stopOnRenderCallback = - nullptr); + StartOnRenderCallback startOnRenderCallback = nullptr, + StopOnRenderCallback stopOnRenderCallback = nullptr, + FrameRateListenerCallback frameRateListenerCallback = nullptr); std::shared_ptr getOrCreate( jsi::Runtime& runtime, @@ -56,10 +48,31 @@ class NativeAnimatedNodesManagerProvider { std::shared_ptr animatedMountingOverrideDelegate_; - NativeAnimatedNodesManager::StartOnRenderCallback startOnRenderCallback_; - NativeAnimatedNodesManager::StopOnRenderCallback stopOnRenderCallback_; + FrameRateListenerCallback frameRateListenerCallback_; + StartOnRenderCallback startOnRenderCallback_; + StopOnRenderCallback stopOnRenderCallback_; std::unique_ptr mergedValueDispatcher_; }; +class UIManagerNativeAnimatedDelegateImpl + : public UIManagerNativeAnimatedDelegate { + public: + explicit UIManagerNativeAnimatedDelegateImpl( + NativeAnimatedNodesManagerProvider::FrameRateListenerCallback + frameRateListenerCallback); + + void runAnimationFrame() override; + + void setNativeAnimatedNodesManager( + std::weak_ptr manager) { + nativeAnimatedNodesManager_ = manager; + } + + private: + std::weak_ptr nativeAnimatedNodesManager_; + NativeAnimatedNodesManagerProvider::FrameRateListenerCallback + frameRateListenerCallback_; +}; + } // namespace facebook::react