diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp index 919751a1190..3170221eee4 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp @@ -336,6 +336,13 @@ void Scheduler::uiManagerShouldRemoveEventListener( removeEventListener(listener); } +void Scheduler::uiManagerDidStartSurface(const ShadowTree& shadowTree) { + std::shared_lock lock(onSurfaceStartCallbackMutex_); + if (onSurfaceStartCallback_) { + onSurfaceStartCallback_(shadowTree); + } +} + void Scheduler::reportMount(SurfaceId surfaceId) const { uiManager_->reportMount(surfaceId); } @@ -362,4 +369,10 @@ void Scheduler::removeEventListener( } } +void Scheduler::uiManagerShouldSetOnSurfaceStartCallback( + OnSurfaceStartCallback&& callback) { + std::shared_lock lock(onSurfaceStartCallbackMutex_); + onSurfaceStartCallback_ = std::move(callback); +} + } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h index 8cd071387d8..c7c606b9b1d 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h @@ -101,6 +101,7 @@ class Scheduler final : public UIManagerDelegate { std::shared_ptr listener) final; void uiManagerShouldRemoveEventListener( const std::shared_ptr& listener) final; + void uiManagerDidStartSurface(const ShadowTree& shadowTree) override; #pragma mark - ContextContainer ContextContainer::Shared getContextContainer() const; @@ -115,6 +116,10 @@ class Scheduler final : public UIManagerDelegate { void removeEventListener( const std::shared_ptr& listener); +#pragma mark - Surface start callback + void uiManagerShouldSetOnSurfaceStartCallback( + OnSurfaceStartCallback&& callback) override; + private: friend class SurfaceHandler; @@ -144,6 +149,9 @@ class Scheduler final : public UIManagerDelegate { ContextContainer::Shared contextContainer_; RuntimeScheduler* runtimeScheduler_{nullptr}; + + mutable std::shared_mutex onSurfaceStartCallbackMutex_; + OnSurfaceStartCallback onSurfaceStartCallback_; }; } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp index d5b3c8987d5..03ad43506bf 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp @@ -227,6 +227,13 @@ void UIManager::startSurface( auto surfaceId = shadowTree->getSurfaceId(); shadowTreeRegistry_.add(std::move(shadowTree)); + shadowTreeRegistry_.visit( + surfaceId, [delegate = delegate_](const ShadowTree& shadowTree) { + if (delegate != nullptr) { + delegate->uiManagerDidStartSurface(shadowTree); + } + }); + runtimeExecutor_([=](jsi::Runtime& runtime) { TraceSection s("UIManager::startSurface::onRuntime"); AppRegistryBinding::startSurface( @@ -706,4 +713,11 @@ void UIManager::removeEventListener( } } +void UIManager::setOnSurfaceStartCallback( + UIManagerDelegate::OnSurfaceStartCallback&& callback) { + if (delegate_ != nullptr) { + delegate_->uiManagerShouldSetOnSurfaceStartCallback(std::move(callback)); + } +} + } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h index 1aa6df5c4f3..104ad8c4c84 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h @@ -216,6 +216,10 @@ class UIManager final : public ShadowTreeDelegate { void removeEventListener( const std::shared_ptr& listener); +#pragma mark - Set on surface start callback + void setOnSurfaceStartCallback( + UIManagerDelegate::OnSurfaceStartCallback&& callback); + private: friend class UIManagerBinding; friend class Scheduler; diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h index 4e27e1795ed..99d1db4f571 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h @@ -10,6 +10,7 @@ #include #include #include +#include namespace facebook::react { @@ -77,6 +78,16 @@ class UIManagerDelegate { virtual void uiManagerShouldRemoveEventListener( const std::shared_ptr& listener) = 0; + /* + * Start surface. + */ + virtual void uiManagerDidStartSurface(const ShadowTree& shadowTree) = 0; + + using OnSurfaceStartCallback = + std::function; + virtual void uiManagerShouldSetOnSurfaceStartCallback( + OnSurfaceStartCallback&& callback) = 0; + virtual ~UIManagerDelegate() noexcept = default; };