Allow passing down frameRateListenerCallback in cxx animated (#54142)

Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/54142

## Changelog:

[Internal] [Added] - Allow passing down frameRateListenerCallback in cxx animated

exposing `frameRateListenerCallback` to add instrumentation at animation frame and stop
we're deferring the actual implementation of frame rate listening/logging to app/platform side

Reviewed By: sammy-SC

Differential Revision: D84510183

fbshipit-source-id: d8835542e8e50c5018032c951a510fec27b5a4d5
This commit is contained in:
Zeya Peng
2025-10-22 11:45:32 -07:00
committed by meta-codesync[bot]
parent 4c7351d9b1
commit 9f7a3bb2ff
2 changed files with 51 additions and 22 deletions
@@ -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<EventEmitterListenerContainer>()),
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<NativeAnimatedNodesManager>
NativeAnimatedNodesManagerProvider::getOrCreate(
@@ -66,7 +86,8 @@ NativeAnimatedNodesManagerProvider::getOrCreate(
};
nativeAnimatedDelegate_ =
std::make_shared<UIManagerNativeAnimatedDelegateImpl>();
std::make_shared<UIManagerNativeAnimatedDelegateImpl>(
frameRateListenerCallback_);
if (ReactNativeFeatureFlags::useSharedAnimatedBackend()) {
#ifdef RN_USE_ANIMATION_BACKEND
@@ -15,30 +15,17 @@ namespace facebook::react {
class AnimatedMountingOverrideDelegate;
class UIManagerNativeAnimatedDelegateImpl
: public UIManagerNativeAnimatedDelegate {
public:
explicit UIManagerNativeAnimatedDelegateImpl();
void runAnimationFrame() override;
void setNativeAnimatedNodesManager(
std::weak_ptr<NativeAnimatedNodesManager> manager) {
nativeAnimatedNodesManager_ = manager;
}
private:
std::weak_ptr<NativeAnimatedNodesManager> nativeAnimatedNodesManager_;
};
class NativeAnimatedNodesManagerProvider {
public:
using FrameRateListenerCallback =
std::function<void(bool /* shouldEnableListener */)>;
using StartOnRenderCallback = std::function<void(std::function<void()>&&)>;
using StopOnRenderCallback = NativeAnimatedNodesManager::StopOnRenderCallback;
NativeAnimatedNodesManagerProvider(
StartOnRenderCallback startOnRenderCallback = nullptr,
StopOnRenderCallback stopOnRenderCallback = nullptr);
StopOnRenderCallback stopOnRenderCallback = nullptr,
FrameRateListenerCallback frameRateListenerCallback = nullptr);
std::shared_ptr<NativeAnimatedNodesManager> getOrCreate(
jsi::Runtime& runtime,
@@ -61,10 +48,31 @@ class NativeAnimatedNodesManagerProvider {
std::shared_ptr<AnimatedMountingOverrideDelegate>
animatedMountingOverrideDelegate_;
FrameRateListenerCallback frameRateListenerCallback_;
StartOnRenderCallback startOnRenderCallback_;
StopOnRenderCallback stopOnRenderCallback_;
std::unique_ptr<MergedValueDispatcher> mergedValueDispatcher_;
};
class UIManagerNativeAnimatedDelegateImpl
: public UIManagerNativeAnimatedDelegate {
public:
explicit UIManagerNativeAnimatedDelegateImpl(
NativeAnimatedNodesManagerProvider::FrameRateListenerCallback
frameRateListenerCallback);
void runAnimationFrame() override;
void setNativeAnimatedNodesManager(
std::weak_ptr<NativeAnimatedNodesManager> manager) {
nativeAnimatedNodesManager_ = manager;
}
private:
std::weak_ptr<NativeAnimatedNodesManager> nativeAnimatedNodesManager_;
NativeAnimatedNodesManagerProvider::FrameRateListenerCallback
frameRateListenerCallback_;
};
} // namespace facebook::react