/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace facebook { namespace react { /* * Scheduler coordinates Shadow Tree updates and event flows. */ class Scheduler final : public UIManagerDelegate { public: Scheduler( SchedulerToolbox const &schedulerToolbox, UIManagerAnimationDelegate *animationDelegate, SchedulerDelegate *delegate); ~Scheduler(); #pragma mark - Surface Management /* * Registers and unregisters a `SurfaceHandler` object in the `Scheduler`. * All registered `SurfaceHandler` objects must be unregistered * (with the same `Scheduler`) before their deallocation. */ void registerSurface(SurfaceHandler const &surfaceHandler) const noexcept; void unregisterSurface(SurfaceHandler const &surfaceHandler) const noexcept; InspectorData getInspectorDataForInstance( EventEmitter const &eventEmitter) const noexcept; void renderTemplateToSurface( SurfaceId surfaceId, const std::string &uiTemplate); /* * This is broken. Please do not use. * `ComponentDescriptor`s are not designed to be used outside of `UIManager`, * there is no any guarantees about their lifetime. */ ComponentDescriptor const * findComponentDescriptorByHandle_DO_NOT_USE_THIS_IS_BROKEN( ComponentHandle handle) const; #pragma mark - Delegate /* * Sets and gets the Scheduler's delegate. * If you requesting a ComponentDescriptor and unsure that it's there, you are * doing something wrong. */ void setDelegate(SchedulerDelegate *delegate); SchedulerDelegate *getDelegate() const; #pragma mark - UIManagerAnimationDelegate // This is not needed on iOS or any platform that has a "pull" instead of // "push" MountingCoordinator model. This just tells the delegate an update // is available and that it should `pullTransaction`; we may want to rename // this to be more generic and not animation-specific. void animationTick() const; #pragma mark - UIManagerDelegate void uiManagerDidFinishTransaction( MountingCoordinator::Shared mountingCoordinator, bool mountSynchronously) override; void uiManagerDidCreateShadowNode(const ShadowNode &shadowNode) override; void uiManagerDidDispatchCommand( const ShadowNode::Shared &shadowNode, std::string const &commandName, folly::dynamic const &args) override; void uiManagerDidSendAccessibilityEvent( const ShadowNode::Shared &shadowNode, std::string const &eventType) override; void uiManagerDidSetIsJSResponder( ShadowNode::Shared const &shadowNode, bool isJSResponder, bool blockNativeResponder) override; #pragma mark - ContextContainer ContextContainer::Shared getContextContainer() const; #pragma mark - UIManager std::shared_ptr getUIManager() const; #pragma mark - Event listeners void addEventListener(const std::shared_ptr &listener); void removeEventListener( const std::shared_ptr &listener); private: friend class SurfaceHandler; SchedulerDelegate *delegate_; SharedComponentDescriptorRegistry componentDescriptorRegistry_; RuntimeExecutor runtimeExecutor_; std::shared_ptr uiManager_; std::shared_ptr reactNativeConfig_; std::vector> commitHooks_; /* * At some point, we have to have an owning shared pointer to something that * will become an `EventDispatcher` a moment later. That's why we have it as a * pointer to an optional: we construct the pointer first, share that with * parts that need to have ownership (and only ownership) of that, and then * fill the optional. */ std::shared_ptr> eventDispatcher_; /** * Hold onto ContextContainer. See SchedulerToolbox. * Must not be nullptr. */ ContextContainer::Shared contextContainer_; /* * Temporary flags. */ bool removeOutstandingSurfacesOnDestruction_{false}; bool reduceDeleteCreateMutationLayoutAnimation_{false}; }; } // namespace react } // namespace facebook