Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ add_react_common_subdir(react/debug)
add_react_common_subdir(react/featureflags)
add_react_common_subdir(react/performance/cdpmetrics)
add_react_common_subdir(react/performance/timeline)
add_react_common_subdir(react/renderer/animated)
add_react_common_subdir(react/renderer/animationbackend)
add_react_common_subdir(react/renderer/animations)
add_react_common_subdir(react/renderer/attributedstring)
Expand Down Expand Up @@ -201,6 +202,7 @@ add_library(reactnative
$<TARGET_OBJECTS:react_newarchdefaults>
$<TARGET_OBJECTS:react_performance_cdpmetrics>
$<TARGET_OBJECTS:react_performance_timeline>
$<TARGET_OBJECTS:react_renderer_animated>
$<TARGET_OBJECTS:react_renderer_animationbackend>
$<TARGET_OBJECTS:react_renderer_animations>
$<TARGET_OBJECTS:react_renderer_attributedstring>
Expand Down Expand Up @@ -295,6 +297,7 @@ target_include_directories(reactnative
$<TARGET_PROPERTY:react_newarchdefaults,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:react_performance_cdpmetrics,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:react_performance_timeline,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:react_renderer_animated,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:react_renderer_animationbackend,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:react_renderer_animations,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:react_renderer_attributedstring,INTERFACE_INCLUDE_DIRECTORIES>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,10 @@ - (void)_onDisplayLinkTick
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name
jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker
{
if (facebook::react::ReactNativeFeatureFlags::cxxNativeAnimatedEnabled()) {
if (facebook::react::ReactNativeFeatureFlags::cxxNativeAnimatedEnabled() &&
// initialization is moved to DefaultTurboModules when using shared animated backend
// TODO: T257053961 deprecate RCTAnimatedModuleProvider.
!facebook::react::ReactNativeFeatureFlags::useSharedAnimatedBackend()) {
if (name == facebook::react::AnimatedModule::kModuleName) {
__weak RCTAnimatedModuleProvider *weakSelf = self;
auto provider = std::make_shared<facebook::react::NativeAnimatedNodesManagerProvider>(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ target_link_libraries(react_nativemodule_defaults
react_nativemodule_idlecallbacks
react_nativemodule_intersectionobserver
react_nativemodule_webperformance
react_renderer_animated
)
target_compile_reactnative_options(react_nativemodule_defaults PRIVATE)
target_compile_options(react_nativemodule_defaults PRIVATE -Wpedantic)
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <react/nativemodule/intersectionobserver/NativeIntersectionObserver.h>
#include <react/nativemodule/microtasks/NativeMicrotasks.h>
#include <react/nativemodule/webperformance/NativePerformance.h>
#include <react/renderer/animated/AnimatedModule.h>

#ifdef REACT_NATIVE_DEBUGGER_ENABLED_DEVONLY
#include <react/nativemodule/devtoolsruntimesettings/DevToolsRuntimeSettingsModule.h>
Expand Down Expand Up @@ -49,6 +50,13 @@ namespace facebook::react {
}
}

if (ReactNativeFeatureFlags::cxxNativeAnimatedEnabled() &&
ReactNativeFeatureFlags::useSharedAnimatedBackend() &&
name == AnimatedModule::kModuleName) {
return std::make_shared<AnimatedModule>(
jsInvoker, std::make_shared<NativeAnimatedNodesManagerProvider>());
}

#ifdef REACT_NATIVE_DEBUGGER_ENABLED_DEVONLY
if (name == DevToolsRuntimeSettingsModule::kModuleName) {
return std::make_shared<DevToolsRuntimeSettingsModule>(jsInvoker);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,16 @@ std::shared_ptr<NativeAnimatedNodesManager>
NativeAnimatedNodesManagerProvider::getOrCreate(
jsi::Runtime& runtime,
std::shared_ptr<CallInvoker> jsInvoker) {
if (nativeAnimatedNodesManager_ == nullptr) {
auto* uiManager = &UIManagerBinding::getBinding(runtime)->getUIManager();
if (nativeAnimatedNodesManager_ != nullptr) {
return nativeAnimatedNodesManager_;
}

auto* uiManager = &UIManagerBinding::getBinding(runtime)->getUIManager();

if (!ReactNativeFeatureFlags::useSharedAnimatedBackend()) {
// === PATH 1: Legacy Backend (useSharedAnimatedBackend = false) ===
// Uses the architecture with MergedValueDispatcher and
// AnimatedMountingOverrideDelegate

mergedValueDispatcher_ = std::make_unique<MergedValueDispatcher>(
[jsInvoker](std::function<void()>&& func) {
Expand Down Expand Up @@ -84,78 +92,78 @@ NativeAnimatedNodesManagerProvider::getOrCreate(
}
};

if (ReactNativeFeatureFlags::useSharedAnimatedBackend()) {
auto animationBackend = uiManager->unstable_getAnimationBackend().lock();
react_native_assert(
animationBackend != nullptr && "animationBackend is nullptr");
animationBackend->registerJSInvoker(jsInvoker);

nativeAnimatedNodesManager_ =
std::make_shared<NativeAnimatedNodesManager>(animationBackend);
} else {
nativeAnimatedNodesManager_ =
std::make_shared<NativeAnimatedNodesManager>(
std::move(directManipulationCallback),
std::move(fabricCommitCallback),
std::move(resolvePlatformColor),
std::move(startOnRenderCallback_),
std::move(stopOnRenderCallback_),
std::move(frameRateListenerCallback_));

nativeAnimatedDelegate_ =
std::make_shared<UIManagerNativeAnimatedDelegateImpl>(
nativeAnimatedNodesManager_);
}

addEventEmitterListener(
nativeAnimatedNodesManager_->getEventEmitterListener());

uiManager->addEventListener(
std::make_shared<EventListener>(
[eventEmitterListenerContainerWeak =
std::weak_ptr<EventEmitterListenerContainer>(
eventEmitterListenerContainer_)](
const RawEvent& rawEvent) {
const auto& eventTarget = rawEvent.eventTarget;
const auto& eventPayload = rawEvent.eventPayload;
if (eventTarget && eventPayload) {
if (auto eventEmitterListenerContainer =
eventEmitterListenerContainerWeak.lock();
eventEmitterListenerContainer != nullptr) {
return eventEmitterListenerContainer->willDispatchEvent(
eventTarget->getTag(), rawEvent.type, *eventPayload);
}
}
return false;
}));
nativeAnimatedNodesManager_ = std::make_shared<NativeAnimatedNodesManager>(
std::move(directManipulationCallback),
std::move(fabricCommitCallback),
std::move(resolvePlatformColor),
std::move(startOnRenderCallback_),
std::move(stopOnRenderCallback_),
std::move(frameRateListenerCallback_));

nativeAnimatedDelegate_ =
std::make_shared<UIManagerNativeAnimatedDelegateImpl>(
nativeAnimatedNodesManager_);

animatedMountingOverrideDelegate_ =
std::make_shared<AnimatedMountingOverrideDelegate>(
*nativeAnimatedNodesManager_, *scheduler);

// Register on existing surfaces
uiManager->getShadowTreeRegistry().enumerate(
[animatedMountingOverrideDelegate =
std::weak_ptr<const AnimatedMountingOverrideDelegate>(
animatedMountingOverrideDelegate_)](
const ShadowTree& shadowTree, bool& /*stop*/) {
shadowTree.getMountingCoordinator()->setMountingOverrideDelegate(
animatedMountingOverrideDelegate);
});

uiManager->setNativeAnimatedDelegate(nativeAnimatedDelegate_);
// Register on surfaces started in the future
uiManager->setOnSurfaceStartCallback(
[animatedMountingOverrideDelegate =
std::weak_ptr<const AnimatedMountingOverrideDelegate>(
animatedMountingOverrideDelegate_)](
const ShadowTree& shadowTree) {
shadowTree.getMountingCoordinator()->setMountingOverrideDelegate(
animatedMountingOverrideDelegate);
});

if (!ReactNativeFeatureFlags::useSharedAnimatedBackend()) {
animatedMountingOverrideDelegate_ =
std::make_shared<AnimatedMountingOverrideDelegate>(
*nativeAnimatedNodesManager_, *scheduler);

// Register on existing surfaces
uiManager->getShadowTreeRegistry().enumerate(
[animatedMountingOverrideDelegate =
std::weak_ptr<const AnimatedMountingOverrideDelegate>(
animatedMountingOverrideDelegate_)](
const ShadowTree& shadowTree, bool& /*stop*/) {
shadowTree.getMountingCoordinator()->setMountingOverrideDelegate(
animatedMountingOverrideDelegate);
});
// Register on surfaces started in the future
uiManager->setOnSurfaceStartCallback(
[animatedMountingOverrideDelegate =
std::weak_ptr<const AnimatedMountingOverrideDelegate>(
animatedMountingOverrideDelegate_)](
const ShadowTree& shadowTree) {
shadowTree.getMountingCoordinator()->setMountingOverrideDelegate(
animatedMountingOverrideDelegate);
});
}
uiManager->setNativeAnimatedDelegate(nativeAnimatedDelegate_);
} else {
// === PATH 2: Shared AnimationBackend (useSharedAnimatedBackend = true) ===
// Uses the shared AnimationBackend from UIManager. The backend handles all
// animation commits and platform integration internally.

auto animationBackend = uiManager->unstable_getAnimationBackend().lock();
react_native_assert(
animationBackend != nullptr && "animationBackend is nullptr");
animationBackend->registerJSInvoker(jsInvoker);

nativeAnimatedNodesManager_ =
std::make_shared<NativeAnimatedNodesManager>(animationBackend);
}

addEventEmitterListener(
nativeAnimatedNodesManager_->getEventEmitterListener());

uiManager->addEventListener(
std::make_shared<EventListener>(
[eventEmitterListenerContainerWeak =
std::weak_ptr<EventEmitterListenerContainer>(
eventEmitterListenerContainer_)](const RawEvent& rawEvent) {
const auto& eventTarget = rawEvent.eventTarget;
const auto& eventPayload = rawEvent.eventPayload;
if (eventTarget && eventPayload) {
if (auto eventEmitterListenerContainer =
eventEmitterListenerContainerWeak.lock();
eventEmitterListenerContainer != nullptr) {
return eventEmitterListenerContainer->willDispatchEvent(
eventTarget->getTag(), rawEvent.type, *eventPayload);
}
}
return false;
}));

return nativeAnimatedNodesManager_;
}

Expand Down
Loading