diff --git a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp index 7bdb273e246..1e7b48894c4 100644 --- a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp +++ b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp @@ -18,22 +18,42 @@ namespace facebook::react { -UIManagerNativeAnimatedDelegateImpl::UIManagerNativeAnimatedDelegateImpl() {} +UIManagerNativeAnimatedDelegateImpl::UIManagerNativeAnimatedDelegateImpl( + NativeAnimatedNodesManagerProvider::FrameRateListenerCallback + frameRateListenerCallback) + : frameRateListenerCallback_(std::move(frameRateListenerCallback)) {} void UIManagerNativeAnimatedDelegateImpl::runAnimationFrame() { if (auto nativeAnimatedNodesManagerStrong = nativeAnimatedNodesManager_.lock()) { + if (frameRateListenerCallback_) { + frameRateListenerCallback_(true); + } nativeAnimatedNodesManagerStrong->onRender(); } } NativeAnimatedNodesManagerProvider::NativeAnimatedNodesManagerProvider( StartOnRenderCallback startOnRenderCallback, - StopOnRenderCallback stopOnRenderCallback) + 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( @@ -66,7 +86,8 @@ NativeAnimatedNodesManagerProvider::getOrCreate( }; nativeAnimatedDelegate_ = - std::make_shared(); + std::make_shared( + frameRateListenerCallback_); if (ReactNativeFeatureFlags::useSharedAnimatedBackend()) { #ifdef RN_USE_ANIMATION_BACKEND diff --git a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.h b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.h index c02efd69187..9f170673f26 100644 --- a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.h +++ b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.h @@ -15,30 +15,17 @@ namespace facebook::react { class AnimatedMountingOverrideDelegate; -class UIManagerNativeAnimatedDelegateImpl - : public UIManagerNativeAnimatedDelegate { - public: - explicit UIManagerNativeAnimatedDelegateImpl(); - - void runAnimationFrame() override; - - void setNativeAnimatedNodesManager( - std::weak_ptr manager) { - nativeAnimatedNodesManager_ = manager; - } - - private: - std::weak_ptr nativeAnimatedNodesManager_; -}; - class NativeAnimatedNodesManagerProvider { public: + using FrameRateListenerCallback = + std::function; using StartOnRenderCallback = std::function&&)>; using StopOnRenderCallback = NativeAnimatedNodesManager::StopOnRenderCallback; NativeAnimatedNodesManagerProvider( StartOnRenderCallback startOnRenderCallback = nullptr, - StopOnRenderCallback stopOnRenderCallback = nullptr); + StopOnRenderCallback stopOnRenderCallback = nullptr, + FrameRateListenerCallback frameRateListenerCallback = nullptr); std::shared_ptr getOrCreate( jsi::Runtime& runtime, @@ -61,10 +48,31 @@ class NativeAnimatedNodesManagerProvider { std::shared_ptr animatedMountingOverrideDelegate_; + 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