1*4440fb50SKudo Chien #pragma once
2*4440fb50SKudo Chien 
3*4440fb50SKudo Chien #ifdef RCT_NEW_ARCH_ENABLED
4*4440fb50SKudo Chien #include <react/renderer/uimanager/UIManager.h>
5*4440fb50SKudo Chien #include "NewestShadowNodesRegistry.h"
6*4440fb50SKudo Chien #endif
7*4440fb50SKudo Chien 
8*4440fb50SKudo Chien #include <memory>
9*4440fb50SKudo Chien #include <string>
10*4440fb50SKudo Chien #include <unordered_set>
11*4440fb50SKudo Chien #include <utility>
12*4440fb50SKudo Chien #include <vector>
13*4440fb50SKudo Chien 
14*4440fb50SKudo Chien #include "AnimatedSensorModule.h"
15*4440fb50SKudo Chien #include "ErrorHandler.h"
16*4440fb50SKudo Chien #include "LayoutAnimationsManager.h"
17*4440fb50SKudo Chien #include "NativeReanimatedModuleSpec.h"
18*4440fb50SKudo Chien #include "PlatformDepMethodsHolder.h"
19*4440fb50SKudo Chien #include "RuntimeDecorator.h"
20*4440fb50SKudo Chien #include "RuntimeManager.h"
21*4440fb50SKudo Chien #include "Scheduler.h"
22*4440fb50SKudo Chien #include "SingleInstanceChecker.h"
23*4440fb50SKudo Chien 
24*4440fb50SKudo Chien namespace reanimated {
25*4440fb50SKudo Chien 
26*4440fb50SKudo Chien using FrameCallback = std::function<void(double)>;
27*4440fb50SKudo Chien 
28*4440fb50SKudo Chien class EventHandlerRegistry;
29*4440fb50SKudo Chien 
30*4440fb50SKudo Chien class NativeReanimatedModule : public NativeReanimatedModuleSpec,
31*4440fb50SKudo Chien                                public RuntimeManager {
32*4440fb50SKudo Chien  public:
33*4440fb50SKudo Chien   NativeReanimatedModule(
34*4440fb50SKudo Chien       const std::shared_ptr<CallInvoker> &jsInvoker,
35*4440fb50SKudo Chien       const std::shared_ptr<Scheduler> &scheduler,
36*4440fb50SKudo Chien       const std::shared_ptr<jsi::Runtime> &rt,
37*4440fb50SKudo Chien       const std::shared_ptr<ErrorHandler> &errorHandler,
38*4440fb50SKudo Chien #ifdef RCT_NEW_ARCH_ENABLED
39*4440fb50SKudo Chien   // nothing
40*4440fb50SKudo Chien #else
41*4440fb50SKudo Chien       std::function<jsi::Value(jsi::Runtime &, const int, const jsi::String &)>
42*4440fb50SKudo Chien           propObtainer,
43*4440fb50SKudo Chien #endif
44*4440fb50SKudo Chien       PlatformDepMethodsHolder platformDepMethodsHolder);
45*4440fb50SKudo Chien 
46*4440fb50SKudo Chien   ~NativeReanimatedModule();
47*4440fb50SKudo Chien 
48*4440fb50SKudo Chien   std::shared_ptr<JSRuntimeHelper> runtimeHelper;
49*4440fb50SKudo Chien 
50*4440fb50SKudo Chien   void installCoreFunctions(
51*4440fb50SKudo Chien       jsi::Runtime &rt,
52*4440fb50SKudo Chien       const jsi::Value &callGuard,
53*4440fb50SKudo Chien       const jsi::Value &valueUnpacker) override;
54*4440fb50SKudo Chien 
55*4440fb50SKudo Chien   jsi::Value makeShareableClone(
56*4440fb50SKudo Chien       jsi::Runtime &rt,
57*4440fb50SKudo Chien       const jsi::Value &value,
58*4440fb50SKudo Chien       const jsi::Value &shouldRetainRemote) override;
59*4440fb50SKudo Chien 
60*4440fb50SKudo Chien   jsi::Value makeSynchronizedDataHolder(
61*4440fb50SKudo Chien       jsi::Runtime &rt,
62*4440fb50SKudo Chien       const jsi::Value &initialShareable) override;
63*4440fb50SKudo Chien   jsi::Value getDataSynchronously(
64*4440fb50SKudo Chien       jsi::Runtime &rt,
65*4440fb50SKudo Chien       const jsi::Value &synchronizedDataHolderRef) override;
66*4440fb50SKudo Chien   void updateDataSynchronously(
67*4440fb50SKudo Chien       jsi::Runtime &rt,
68*4440fb50SKudo Chien       const jsi::Value &synchronizedDataHolderRef,
69*4440fb50SKudo Chien       const jsi::Value &newData);
70*4440fb50SKudo Chien 
71*4440fb50SKudo Chien   void scheduleOnUI(jsi::Runtime &rt, const jsi::Value &worklet) override;
72*4440fb50SKudo Chien 
73*4440fb50SKudo Chien   jsi::Value registerEventHandler(
74*4440fb50SKudo Chien       jsi::Runtime &rt,
75*4440fb50SKudo Chien       const jsi::Value &eventHash,
76*4440fb50SKudo Chien       const jsi::Value &worklet) override;
77*4440fb50SKudo Chien   void unregisterEventHandler(
78*4440fb50SKudo Chien       jsi::Runtime &rt,
79*4440fb50SKudo Chien       const jsi::Value &registrationId) override;
80*4440fb50SKudo Chien 
81*4440fb50SKudo Chien   jsi::Value getViewProp(
82*4440fb50SKudo Chien       jsi::Runtime &rt,
83*4440fb50SKudo Chien       const jsi::Value &viewTag,
84*4440fb50SKudo Chien       const jsi::Value &propName,
85*4440fb50SKudo Chien       const jsi::Value &callback) override;
86*4440fb50SKudo Chien 
87*4440fb50SKudo Chien   jsi::Value enableLayoutAnimations(jsi::Runtime &rt, const jsi::Value &config)
88*4440fb50SKudo Chien       override;
89*4440fb50SKudo Chien   jsi::Value configureProps(
90*4440fb50SKudo Chien       jsi::Runtime &rt,
91*4440fb50SKudo Chien       const jsi::Value &uiProps,
92*4440fb50SKudo Chien       const jsi::Value &nativeProps) override;
93*4440fb50SKudo Chien   jsi::Value configureLayoutAnimation(
94*4440fb50SKudo Chien       jsi::Runtime &rt,
95*4440fb50SKudo Chien       const jsi::Value &viewTag,
96*4440fb50SKudo Chien       const jsi::Value &type,
97*4440fb50SKudo Chien       const jsi::Value &sharedTransitionTag,
98*4440fb50SKudo Chien       const jsi::Value &config) override;
99*4440fb50SKudo Chien 
100*4440fb50SKudo Chien   void onRender(double timestampMs);
101*4440fb50SKudo Chien 
102*4440fb50SKudo Chien   void onEvent(
103*4440fb50SKudo Chien       double eventTimestamp,
104*4440fb50SKudo Chien       const std::string &eventName,
105*4440fb50SKudo Chien       const jsi::Value &payload);
106*4440fb50SKudo Chien 
107*4440fb50SKudo Chien   bool isAnyHandlerWaitingForEvent(std::string eventName);
108*4440fb50SKudo Chien 
109*4440fb50SKudo Chien   void maybeRequestRender();
110*4440fb50SKudo Chien   UpdatePropsFunction updatePropsFunction;
111*4440fb50SKudo Chien 
112*4440fb50SKudo Chien   bool handleEvent(
113*4440fb50SKudo Chien       const std::string &eventName,
114*4440fb50SKudo Chien       const jsi::Value &payload,
115*4440fb50SKudo Chien       double currentTime);
116*4440fb50SKudo Chien 
117*4440fb50SKudo Chien #ifdef RCT_NEW_ARCH_ENABLED
118*4440fb50SKudo Chien   bool handleRawEvent(const RawEvent &rawEvent, double currentTime);
119*4440fb50SKudo Chien 
120*4440fb50SKudo Chien   void updateProps(
121*4440fb50SKudo Chien       jsi::Runtime &rt,
122*4440fb50SKudo Chien       const jsi::Value &shadowNodeValue,
123*4440fb50SKudo Chien       const jsi::Value &props);
124*4440fb50SKudo Chien 
125*4440fb50SKudo Chien   void removeShadowNodeFromRegistry(jsi::Runtime &rt, const jsi::Value &tag);
126*4440fb50SKudo Chien 
127*4440fb50SKudo Chien   void performOperations();
128*4440fb50SKudo Chien 
129*4440fb50SKudo Chien   void dispatchCommand(
130*4440fb50SKudo Chien       jsi::Runtime &rt,
131*4440fb50SKudo Chien       const jsi::Value &shadowNodeValue,
132*4440fb50SKudo Chien       const jsi::Value &commandNameValue,
133*4440fb50SKudo Chien       const jsi::Value &argsValue);
134*4440fb50SKudo Chien 
135*4440fb50SKudo Chien   jsi::Value measure(jsi::Runtime &rt, const jsi::Value &shadowNodeValue);
136*4440fb50SKudo Chien 
137*4440fb50SKudo Chien   void setUIManager(std::shared_ptr<UIManager> uiManager);
138*4440fb50SKudo Chien 
139*4440fb50SKudo Chien   void setNewestShadowNodesRegistry(
140*4440fb50SKudo Chien       std::shared_ptr<NewestShadowNodesRegistry> newestShadowNodesRegistry);
141*4440fb50SKudo Chien #endif
142*4440fb50SKudo Chien 
143*4440fb50SKudo Chien   jsi::Value registerSensor(
144*4440fb50SKudo Chien       jsi::Runtime &rt,
145*4440fb50SKudo Chien       const jsi::Value &sensorType,
146*4440fb50SKudo Chien       const jsi::Value &interval,
147*4440fb50SKudo Chien       const jsi::Value &iosReferenceFrame,
148*4440fb50SKudo Chien       const jsi::Value &sensorDataContainer) override;
149*4440fb50SKudo Chien   void unregisterSensor(jsi::Runtime &rt, const jsi::Value &sensorId) override;
150*4440fb50SKudo Chien 
151*4440fb50SKudo Chien   void cleanupSensors();
152*4440fb50SKudo Chien 
153*4440fb50SKudo Chien   jsi::Value subscribeForKeyboardEvents(
154*4440fb50SKudo Chien       jsi::Runtime &rt,
155*4440fb50SKudo Chien       const jsi::Value &keyboardEventContainer,
156*4440fb50SKudo Chien       const jsi::Value &isStatusBarTranslucent) override;
157*4440fb50SKudo Chien   void unsubscribeFromKeyboardEvents(
158*4440fb50SKudo Chien       jsi::Runtime &rt,
159*4440fb50SKudo Chien       const jsi::Value &listenerId) override;
160*4440fb50SKudo Chien 
layoutAnimationsManager()161*4440fb50SKudo Chien   inline LayoutAnimationsManager &layoutAnimationsManager() {
162*4440fb50SKudo Chien     return layoutAnimationsManager_;
163*4440fb50SKudo Chien   }
164*4440fb50SKudo Chien 
165*4440fb50SKudo Chien  private:
166*4440fb50SKudo Chien #ifdef RCT_NEW_ARCH_ENABLED
167*4440fb50SKudo Chien   bool isThereAnyLayoutProp(jsi::Runtime &rt, const jsi::Value &props);
168*4440fb50SKudo Chien #endif // RCT_NEW_ARCH_ENABLED
169*4440fb50SKudo Chien 
170*4440fb50SKudo Chien   std::unique_ptr<EventHandlerRegistry> eventHandlerRegistry;
171*4440fb50SKudo Chien   std::function<void(FrameCallback &, jsi::Runtime &)> requestRender;
172*4440fb50SKudo Chien   std::vector<FrameCallback> frameCallbacks;
173*4440fb50SKudo Chien   bool renderRequested = false;
174*4440fb50SKudo Chien   std::function<jsi::Value(jsi::Runtime &, const int, const jsi::String &)>
175*4440fb50SKudo Chien       propObtainer;
176*4440fb50SKudo Chien   std::function<void(double)> onRenderCallback;
177*4440fb50SKudo Chien   AnimatedSensorModule animatedSensorModule;
178*4440fb50SKudo Chien   ConfigurePropsFunction configurePropsPlatformFunction;
179*4440fb50SKudo Chien 
180*4440fb50SKudo Chien #ifdef RCT_NEW_ARCH_ENABLED
181*4440fb50SKudo Chien   SynchronouslyUpdateUIPropsFunction synchronouslyUpdateUIPropsFunction;
182*4440fb50SKudo Chien 
183*4440fb50SKudo Chien   std::shared_ptr<UIManager> uiManager_;
184*4440fb50SKudo Chien 
185*4440fb50SKudo Chien   // After app reload, surfaceId on iOS is still 1 but on Android it's 11.
186*4440fb50SKudo Chien   // We can store surfaceId of the most recent ShadowNode as a workaround.
187*4440fb50SKudo Chien   SurfaceId surfaceId_ = -1;
188*4440fb50SKudo Chien 
189*4440fb50SKudo Chien   std::vector<std::pair<ShadowNode::Shared, std::unique_ptr<jsi::Value>>>
190*4440fb50SKudo Chien       operationsInBatch_; // TODO: refactor std::pair to custom struct
191*4440fb50SKudo Chien 
192*4440fb50SKudo Chien   std::shared_ptr<NewestShadowNodesRegistry> newestShadowNodesRegistry_;
193*4440fb50SKudo Chien 
194*4440fb50SKudo Chien   std::vector<Tag> tagsToRemove_; // from newestShadowNodesRegistry_
195*4440fb50SKudo Chien #endif
196*4440fb50SKudo Chien 
197*4440fb50SKudo Chien   std::unordered_set<std::string> nativePropNames_; // filled by configureProps
198*4440fb50SKudo Chien   LayoutAnimationsManager layoutAnimationsManager_;
199*4440fb50SKudo Chien 
200*4440fb50SKudo Chien   KeyboardEventSubscribeFunction subscribeForKeyboardEventsFunction;
201*4440fb50SKudo Chien   KeyboardEventUnsubscribeFunction unsubscribeFromKeyboardEventsFunction;
202*4440fb50SKudo Chien 
203*4440fb50SKudo Chien #ifdef DEBUG
204*4440fb50SKudo Chien   SingleInstanceChecker<NativeReanimatedModule> singleInstanceChecker_;
205*4440fb50SKudo Chien #endif
206*4440fb50SKudo Chien };
207*4440fb50SKudo Chien 
208*4440fb50SKudo Chien } // namespace reanimated
209