@@ -45,8 +45,16 @@ std::shared_ptr<NativeAnimatedNodesManager>
4545NativeAnimatedNodesManagerProvider::getOrCreate (
4646 jsi::Runtime& runtime,
4747 std::shared_ptr<CallInvoker> jsInvoker) {
48- if (nativeAnimatedNodesManager_ == nullptr ) {
49- auto * uiManager = &UIManagerBinding::getBinding (runtime)->getUIManager ();
48+ if (nativeAnimatedNodesManager_ != nullptr ) {
49+ return nativeAnimatedNodesManager_;
50+ }
51+
52+ auto * uiManager = &UIManagerBinding::getBinding (runtime)->getUIManager ();
53+
54+ if (!ReactNativeFeatureFlags::useSharedAnimatedBackend ()) {
55+ // === PATH 1: Legacy Backend (useSharedAnimatedBackend = false) ===
56+ // Uses the architecture with MergedValueDispatcher and
57+ // AnimatedMountingOverrideDelegate
5058
5159 mergedValueDispatcher_ = std::make_unique<MergedValueDispatcher>(
5260 [jsInvoker](std::function<void ()>&& func) {
@@ -84,78 +92,78 @@ NativeAnimatedNodesManagerProvider::getOrCreate(
8492 }
8593 };
8694
87- if (ReactNativeFeatureFlags::useSharedAnimatedBackend ()) {
88- auto animationBackend = uiManager->unstable_getAnimationBackend ().lock ();
89- react_native_assert (
90- animationBackend != nullptr && " animationBackend is nullptr" );
91- animationBackend->registerJSInvoker (jsInvoker);
92-
93- nativeAnimatedNodesManager_ =
94- std::make_shared<NativeAnimatedNodesManager>(animationBackend);
95- } else {
96- nativeAnimatedNodesManager_ =
97- std::make_shared<NativeAnimatedNodesManager>(
98- std::move (directManipulationCallback),
99- std::move (fabricCommitCallback),
100- std::move (resolvePlatformColor),
101- std::move (startOnRenderCallback_),
102- std::move (stopOnRenderCallback_),
103- std::move (frameRateListenerCallback_));
104-
105- nativeAnimatedDelegate_ =
106- std::make_shared<UIManagerNativeAnimatedDelegateImpl>(
107- nativeAnimatedNodesManager_);
108- }
109-
110- addEventEmitterListener (
111- nativeAnimatedNodesManager_->getEventEmitterListener ());
112-
113- uiManager->addEventListener (
114- std::make_shared<EventListener>(
115- [eventEmitterListenerContainerWeak =
116- std::weak_ptr<EventEmitterListenerContainer>(
117- eventEmitterListenerContainer_)](
118- const RawEvent& rawEvent) {
119- const auto & eventTarget = rawEvent.eventTarget ;
120- const auto & eventPayload = rawEvent.eventPayload ;
121- if (eventTarget && eventPayload) {
122- if (auto eventEmitterListenerContainer =
123- eventEmitterListenerContainerWeak.lock ();
124- eventEmitterListenerContainer != nullptr ) {
125- return eventEmitterListenerContainer->willDispatchEvent (
126- eventTarget->getTag (), rawEvent.type , *eventPayload);
127- }
128- }
129- return false ;
130- }));
95+ nativeAnimatedNodesManager_ = std::make_shared<NativeAnimatedNodesManager>(
96+ std::move (directManipulationCallback),
97+ std::move (fabricCommitCallback),
98+ std::move (resolvePlatformColor),
99+ std::move (startOnRenderCallback_),
100+ std::move (stopOnRenderCallback_),
101+ std::move (frameRateListenerCallback_));
102+
103+ nativeAnimatedDelegate_ =
104+ std::make_shared<UIManagerNativeAnimatedDelegateImpl>(
105+ nativeAnimatedNodesManager_);
106+
107+ animatedMountingOverrideDelegate_ =
108+ std::make_shared<AnimatedMountingOverrideDelegate>(
109+ *nativeAnimatedNodesManager_, *scheduler);
110+
111+ // Register on existing surfaces
112+ uiManager->getShadowTreeRegistry ().enumerate(
113+ [animatedMountingOverrideDelegate =
114+ std::weak_ptr<const AnimatedMountingOverrideDelegate>(
115+ animatedMountingOverrideDelegate_)](
116+ const ShadowTree& shadowTree, bool & /* stop*/ ) {
117+ shadowTree.getMountingCoordinator ()->setMountingOverrideDelegate (
118+ animatedMountingOverrideDelegate);
119+ });
131120
132- uiManager->setNativeAnimatedDelegate (nativeAnimatedDelegate_);
121+ // Register on surfaces started in the future
122+ uiManager->setOnSurfaceStartCallback (
123+ [animatedMountingOverrideDelegate =
124+ std::weak_ptr<const AnimatedMountingOverrideDelegate>(
125+ animatedMountingOverrideDelegate_)](
126+ const ShadowTree& shadowTree) {
127+ shadowTree.getMountingCoordinator ()->setMountingOverrideDelegate (
128+ animatedMountingOverrideDelegate);
129+ });
133130
134- if (!ReactNativeFeatureFlags::useSharedAnimatedBackend ()) {
135- animatedMountingOverrideDelegate_ =
136- std::make_shared<AnimatedMountingOverrideDelegate>(
137- *nativeAnimatedNodesManager_, *scheduler);
138-
139- // Register on existing surfaces
140- uiManager->getShadowTreeRegistry ().enumerate(
141- [animatedMountingOverrideDelegate =
142- std::weak_ptr<const AnimatedMountingOverrideDelegate>(
143- animatedMountingOverrideDelegate_)](
144- const ShadowTree& shadowTree, bool & /* stop*/ ) {
145- shadowTree.getMountingCoordinator ()->setMountingOverrideDelegate (
146- animatedMountingOverrideDelegate);
147- });
148- // Register on surfaces started in the future
149- uiManager->setOnSurfaceStartCallback (
150- [animatedMountingOverrideDelegate =
151- std::weak_ptr<const AnimatedMountingOverrideDelegate>(
152- animatedMountingOverrideDelegate_)](
153- const ShadowTree& shadowTree) {
154- shadowTree.getMountingCoordinator ()->setMountingOverrideDelegate (
155- animatedMountingOverrideDelegate);
156- });
157- }
131+ uiManager->setNativeAnimatedDelegate (nativeAnimatedDelegate_);
132+ } else {
133+ // === PATH 2: Shared AnimationBackend (useSharedAnimatedBackend = true) ===
134+ // Uses the shared AnimationBackend from UIManager. The backend handles all
135+ // animation commits and platform integration internally.
136+
137+ auto animationBackend = uiManager->unstable_getAnimationBackend ().lock ();
138+ react_native_assert (
139+ animationBackend != nullptr && " animationBackend is nullptr" );
140+ animationBackend->registerJSInvoker (jsInvoker);
141+
142+ nativeAnimatedNodesManager_ =
143+ std::make_shared<NativeAnimatedNodesManager>(animationBackend);
158144 }
145+
146+ addEventEmitterListener (
147+ nativeAnimatedNodesManager_->getEventEmitterListener ());
148+
149+ uiManager->addEventListener (
150+ std::make_shared<EventListener>(
151+ [eventEmitterListenerContainerWeak =
152+ std::weak_ptr<EventEmitterListenerContainer>(
153+ eventEmitterListenerContainer_)](const RawEvent& rawEvent) {
154+ const auto & eventTarget = rawEvent.eventTarget ;
155+ const auto & eventPayload = rawEvent.eventPayload ;
156+ if (eventTarget && eventPayload) {
157+ if (auto eventEmitterListenerContainer =
158+ eventEmitterListenerContainerWeak.lock ();
159+ eventEmitterListenerContainer != nullptr ) {
160+ return eventEmitterListenerContainer->willDispatchEvent (
161+ eventTarget->getTag (), rawEvent.type , *eventPayload);
162+ }
163+ }
164+ return false ;
165+ }));
166+
159167 return nativeAnimatedNodesManager_;
160168}
161169
0 commit comments