amis-rpc-design/node_modules/react-native/ReactCommon/react/renderer/uimanager/UIManager.h
2023-10-07 19:42:30 +08:00

214 lines
6.6 KiB
C++

/*
* 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 <folly/dynamic.h>
#include <jsi/jsi.h>
#include <ReactCommon/RuntimeExecutor.h>
#include <shared_mutex>
#include <react/renderer/componentregistry/ComponentDescriptorRegistry.h>
#include <react/renderer/core/RawValue.h>
#include <react/renderer/core/ShadowNode.h>
#include <react/renderer/core/StateData.h>
#include <react/renderer/leakchecker/LeakChecker.h>
#include <react/renderer/mounting/ShadowTree.h>
#include <react/renderer/mounting/ShadowTreeDelegate.h>
#include <react/renderer/mounting/ShadowTreeRegistry.h>
#include <react/renderer/uimanager/UIManagerAnimationDelegate.h>
#include <react/renderer/uimanager/UIManagerDelegate.h>
#include <react/renderer/uimanager/primitives.h>
#include <react/utils/ContextContainer.h>
namespace facebook::react {
class UIManagerBinding;
class UIManagerCommitHook;
class UIManager final : public ShadowTreeDelegate {
public:
UIManager(
RuntimeExecutor const &runtimeExecutor,
BackgroundExecutor backgroundExecutor,
ContextContainer::Shared contextContainer);
~UIManager();
void setComponentDescriptorRegistry(
const SharedComponentDescriptorRegistry &componentDescriptorRegistry);
/*
* Sets and gets the UIManager's delegate.
* The delegate is stored as a raw pointer, so the owner must null
* the pointer before being destroyed.
*/
void setDelegate(UIManagerDelegate *delegate);
UIManagerDelegate *getDelegate();
/**
* Sets and gets the UIManager's Animation APIs delegate.
* The delegate is stored as a raw pointer, so the owner must null
* the pointer before being destroyed.
*/
void setAnimationDelegate(UIManagerAnimationDelegate *delegate);
/**
* Execute stopSurface on any UIMAnagerAnimationDelegate.
*/
void stopSurfaceForAnimationDelegate(SurfaceId surfaceId) const;
void animationTick() const;
/*
* Provides access to a UIManagerBindging.
* The `callback` methods will not be called if the internal pointer to
* `UIManagerBindging` is `nullptr`.
* The callback is called synchronously on the same thread.
*/
void visitBinding(
std::function<void(UIManagerBinding const &uiManagerBinding)> const
&callback,
jsi::Runtime &runtime) const;
/*
* Registers and unregisters a commit hook.
*/
void registerCommitHook(UIManagerCommitHook const &commitHook) const;
void unregisterCommitHook(UIManagerCommitHook const &commitHook) const;
ShadowNode::Shared getNewestCloneOfShadowNode(
ShadowNode const &shadowNode) const;
#pragma mark - Surface Start & Stop
void startSurface(
ShadowTree::Unique &&shadowTree,
std::string const &moduleName,
folly::dynamic const &props,
DisplayMode displayMode) const;
void setSurfaceProps(
SurfaceId surfaceId,
std::string const &moduleName,
folly::dynamic const &props,
DisplayMode displayMode) const;
ShadowTree::Unique stopSurface(SurfaceId surfaceId) const;
#pragma mark - ShadowTreeDelegate
void shadowTreeDidFinishTransaction(
MountingCoordinator::Shared mountingCoordinator,
bool mountSynchronously) const override;
RootShadowNode::Unshared shadowTreeWillCommit(
ShadowTree const &shadowTree,
RootShadowNode::Shared const &oldRootShadowNode,
RootShadowNode::Unshared const &newRootShadowNode) const override;
ShadowNode::Shared createNode(
Tag tag,
std::string const &componentName,
SurfaceId surfaceId,
const RawProps &props,
SharedEventTarget eventTarget) const;
ShadowNode::Shared cloneNode(
ShadowNode const &shadowNode,
ShadowNode::SharedListOfShared const &children = nullptr,
RawProps const *rawProps = nullptr) const;
void appendChild(
const ShadowNode::Shared &parentShadowNode,
const ShadowNode::Shared &childShadowNode) const;
void completeSurface(
SurfaceId surfaceId,
ShadowNode::UnsharedListOfShared const &rootChildren,
ShadowTree::CommitOptions commitOptions) const;
void setIsJSResponder(
ShadowNode::Shared const &shadowNode,
bool isJSResponder,
bool blockNativeResponder) const;
ShadowNode::Shared findNodeAtPoint(
ShadowNode::Shared const &shadowNode,
Point point) const;
/*
* Returns layout metrics of given `shadowNode` relative to
* `ancestorShadowNode` (relative to the root node in case if provided
* `ancestorShadowNode` is nullptr).
*/
LayoutMetrics getRelativeLayoutMetrics(
ShadowNode const &shadowNode,
ShadowNode const *ancestorShadowNode,
LayoutableShadowNode::LayoutInspectingPolicy policy) const;
/*
* Creates a new shadow node with given state data, clones what's necessary
* and performs a commit.
*/
void updateState(StateUpdate const &stateUpdate) const;
void dispatchCommand(
const ShadowNode::Shared &shadowNode,
std::string const &commandName,
folly::dynamic const &args) const;
void setNativeProps_DEPRECATED(
ShadowNode::Shared const &shadowNode,
RawProps const &rawProps) const;
void sendAccessibilityEvent(
const ShadowNode::Shared &shadowNode,
std::string const &eventType);
/*
* Iterates over all shadow nodes which are parts of all registered surfaces
* and find the one that has given `tag`. Returns `nullptr` if the node wasn't
* found. This is a temporary workaround that should not be used in any core
* functionality.
*/
ShadowNode::Shared findShadowNodeByTag_DEPRECATED(Tag tag) const;
ShadowTreeRegistry const &getShadowTreeRegistry() const;
private:
friend class UIManagerBinding;
friend class Scheduler;
friend class SurfaceHandler;
/**
* Configure a LayoutAnimation to happen on the next commit.
* This API configures a global LayoutAnimation starting from the root node.
*/
void configureNextLayoutAnimation(
jsi::Runtime &runtime,
RawValue const &config,
jsi::Value const &successCallback,
jsi::Value const &failureCallback) const;
SharedComponentDescriptorRegistry componentDescriptorRegistry_;
UIManagerDelegate *delegate_{};
UIManagerAnimationDelegate *animationDelegate_{nullptr};
RuntimeExecutor const runtimeExecutor_{};
ShadowTreeRegistry shadowTreeRegistry_{};
BackgroundExecutor const backgroundExecutor_{};
ContextContainer::Shared contextContainer_;
mutable std::shared_mutex commitHookMutex_;
mutable std::vector<UIManagerCommitHook const *> commitHooks_;
std::unique_ptr<LeakChecker> leakChecker_;
};
} // namespace facebook::react